//Vector.h,个人实现的头文件,源文件引用时用#include "Vector"
#ifndef VECTOR_INCLUDED
#define VECTOR_INCLUDED
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)
{
if(this != &rhs)
{
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;
typedef const Object *const_iterator;
iterator begin()
{
return &objects[0];
}
const_iterator begin() const
{
return &objects[0];
}
iterator end()
{
return &objects[size()];
}
const_iterator end() const
{
return &objects[size()];
}
enum {SPARE_CAPACITY = 16};
private:
int theSize;
int theCapacity;
Object *objects;
};
#endif // VECTOR_INCLUDED
下面为测试代码,使用起来和include<vector>STL一样:
//main.cpp
#include<iostream>
#include<cmath>
#include"Vector"
using namespace std;
int main()
{
Vector<int> a;
a.push_back(1);
a.push_back(100);
a.push_back(5);
Vector<int>::iterator itr;
itr = a.begin();
while(itr != a.end())
{
cout<<*itr++<<endl;
}
a.pop_back();
cout<<"current length is:"<<a.size()<<endl;
itr = a.begin();
while(itr != a.end())
{
cout<<*itr++<<endl;
}
if(!a.empty())
{
cout<<"is not empty!"<<endl;
}
else
{
cout<<"is empty"<<endl;
}
cout<<"current last data is :"<<*a.end()<<endl;
cout<<"current first data is:"<<*a.begin()<<endl;
}
参考文献:<Data Structures and Algorithm Analysis in c++ Third Edition>