TOPIC 19.1.1
Sorting Within a Classes
The following vector class contains the function sortme which will sort the vector object.
#ifndef _VECTOR_H
#define _VECTOR_H
#include <stdlib.h>
#include <iostream.h>
template <class itemType>
class vector
{
public:
// constructors/destructor
vector( ); // default constructor (size==0)
vector( int size ); // initial size of vector is size
vector( int size, const itemType & fillValue ); // set size and value
// with which to fill
// vector
vector( const vector & vec ); // copy constructor
~vector( ); // destructor
// operator overloads
const vector & operator = ( const vector & vec );
itemType & operator [ ] ( int index ); // indexing with range checking
// member functions
int length( ) const; // capacity of vector
void resize( int newSize ); // change size dynamically;
// can result in losing values
/////////////////New sortme function///////////////////////
// sorts the vector using insertion sort in descending order
void sortme( );
///////////////////////////////////////////////////////////
private:
int mySize; // # elements in array
itemType * myList; // array used for storage
};
/////////////////New sortme function///////////////////////
// sorts the vector using insertion sort in descending order
template <class itemType>
void vector<itemType>::sortme()
{
int j, i;
itemType key;
for(j = 1; j < mySize; j++)
{
key = myList[j];
for(i = j - 1; (i >= 0) && (array[i] < key); i--)
{
array[i + 1] = array[i];
}
array[i + 1] = array[i];
}
}
///////////////////////////////////////////////////////////
template <class itemType>
vector<itemType>::vector()
: mySize(0), myList(0)
{
}
template <class itemType>
vector<itemType>::vector(int size)
: mySize(size), myList(new itemType[size])
{
}
template <class itemType>
vector<itemType>::vector(int size, const itemType & fillValue)
: mySize(size), myList(new itemType[size])
{
for(int k = 0; k < size; k++)
{
myList[k] = fillValue;
}
}
template <class itemType>
vector<itemType>::vector(const vector<itemType> & vec)
: mySize(vec.length()), myList(new itemType[mySize])
{
for(int k = 0; k < mySize; k++) // copy elements
{
myList[k] = vec.myList[k];
}
}
template <class itemType>
vector<itemType>::~vector ()
{
delete [] myList;
}
template <class itemType>
const vector<itemType> &
vector<itemType>::operator = (const vector<itemType> & rhs)
{
if (this != &rhs) // don't assign to self!
{
delete [] myList; // get rid of old storage
mySize = rhs.length();
myList = new itemType [mySize]; // allocate new storage
// copy rhs
for(int k=0; k < mySize; k++)
{
myList[k] = rhs.myList[k];
}
}
return *this; // permit a = b = c = d
}
template <class itemType>
int vector<itemType>::length() const
{
return mySize;
}
template <class itemType>
itemType & vector<itemType>::operator [] (int k)
{
if (k < 0 || mySize <= k)
{
cerr << "Illegal vector index: " << k << " max index = "
<< mySize-1 << endl;
abort();
}
return myList[k];
}
template <class itemType>
void vector<itemType>::resize(int newSize)
{
int numToCopy = newSize < mySize ? newSize : mySize;
// allocate new storage and copy element into new storage
itemType * newList = new itemType[newSize];
for(int k=0; k < numToCopy; k++)
{
newList[k] = myList[k];
}
delete [] myList; // de-allocate old storage
mySize = newSize; // assign new storage/size
myList = newList;
}
#endif