#include<iostream>
#include<algorithm>
template<typename Object>
class Vector{
private:
int theSize; //the elements it contains
int theCapacity;
Object *objects;
public:
explicit Vector( int initSize = 0 ):
theSize( initSize ),theCapacity( initSize + SPACE_CAPACITY ){
objects = new Object[ theCapacity ];
}
Vector( const Vector & rhs ):objects( NULL ){
operator=( rhs );
}//copy constructor
~Vector(){
delete [] objects;
}
const Vector & operator= ( const Vector & rhs ){
if( this != &rhs ){
delete [] objects;
theSize = rhs.size();
theCapacity = rhs.capacity();
objects = new Object[ capacity() ];
for( int k = 0; k < theSize; k++ )
objects[k] = rhs.objects[k];
}
return *this;
}// above is the "big three"
void resize( int newSize ){
if( newSize > theCapacity )
reserve( newSize*2 + 1 ); //in case the size is 0
theSize = newSize;
}
void reserve( int newCapacity ){
if( newCapacity < theSize ) return;
Object *oldArray = objects;
objects = new Object[ newCapacity ];
for( int k = 0; k < theSize; k++ )
objects[k] = oldArray[k];
theCapacity = newCapacity;
delete [] oldArray;
}
Object & operator[] ( int index ) { return objects[ index ]; }
const Object & operator[] ( int index ) const { return objects[ index ]; }
bool empty() const { return size() == 0; }
int size() const { return theSize; }
int capacity() const { return theCapacity; }
void push_back( const Object & x ){
if( theSize == theCapacity )
reserve( 2*theCapacity + 1 );
objects[ theSize++ ] = x;
}
void pop_back() { theSize--; }
const Object & back() const { return objects[ theSize-1 ]; }
typedef Object * iterator;//use native pointer as iterator
typedef const Object * const_iterator;
iterator begin() { return &objects[0]; }
const_iterator begin() const { return &objects[0]; }
iterator end() { return &objects[ theSize ]; }
const_iterator end() const { return &objects[ theSize ]; }
enum{ SPACE_CAPACITY = 16 };
};
int main() {
Vector<int> V;
for( int i = 0; i < 100; i++ )
V.push_back( i );
V.push_back(1);
const Vector<int> v( V );
std::sort(V.begin(), V.end());
for( Vector<int>::const_iterator it = V.begin();
it != V.end(); it++ )
std::cout << *it << std::endl;
return 0;
}