//
// main.cpp
// Data Structure TRY1
//
// Created by zr9558 on 6/7/13.
// Copyright (c) 2013 zr9558. All rights reserved.
//
// Data Structure C++, Weiss, Vector, P.81, 82
#include <iostream>
using namespace std;
template < typename Object>
class Vector
{
public:
explicit Vector(int initSize=0): theSize(initSize), theCapacity(initSize+SPARE_CAPACITY)
{
objects=new Object[theCapacity];
}
Vector(const Vector &rhs): objects(NULL) {operator=(rhs);}
~Vector(){delete []objects;}
const Vector &operator = (const Vector &rhs) // define the operator =
{
if(this!=&rhs) // we need this assumption to avoid this = itself
{
delete []objects;
theSize=rhs.size();
theCapacity=rhs.theCapacity;
objects =new Object[ capacity()];
for(int k=0; k<size();++k) objects[k]=rhs.objects[k];
}
return *this;
}
void resize(int newSize)
{
if( newSize>theCapacity)
reserve( newSize*2+1);
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;
typedefconst 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{ SPARE_CAPACITY=16};
private:
int theSize;
int theCapacity;
Object *objects;
};
int main()
{
cout<<"the class Vector"<<endl;
Vector<int> ivec;
for(int i=0; i<20; ++i)
ivec.push_back(i);
cout<<ivec.size()<<" "<<ivec.capacity()<<endl;
for( Vector<int>::iterator iter=ivec.begin(); iter!=ivec.end(); ++iter)
cout<<*iter<<" ";
cout<<endl;
return 0;
}