容器(vector)在我看来其本质就是能够不受容量限制而不断的在尾部增加元素的数组而已,因此其主体也应该是一个数组。我的简单实现如下:
1、由于容器要适应各种数据类型的元素的保存,因此使用模板类来定义容器
template<typename Object>
class Vector
2、数据成员有三个:大小(theSize)、容量(Capacity)、以及要保存的元素的地址(*object)。这里theSize与Capacity的区别在于,由于vector本身是在数组的基础之上建立起来的,因此在建立是必须初始化数组的容量,而这个容量就是capacity,而theSize则是用来反映vector类中实际存储的元素数量。这里需要指出的是capacity始终大于等于theSize,当theSize等于Capacity时会重新为容器分配更大容量的数组。
private:
int theSize;
int Capacity;
Object *object;
3、vector在构造函数的中,将theSize初始化为0,Capacity为16,并为数组分配一个容量为16的数组
public:
//构造函数
Vector()
{
theSize=0;
Capacity=SafeCapacity;
object=new Object[Capacity];
}
//析构函数
~Vector()
{
delete object; //释放删除的内存单元
}
4、构造套嵌的迭代器 ,其本质为指向Object类型的指针。同时通过retrive函数能够返回指针指向元素的值
//套嵌定义迭代器
public:
class iteractor
{
public:
//重载构造函数
iteractor(Object *obj)
{ current=obj;}
//定义构造函数
iteractor()
{ current=object;}
public:
//返回迭代器所指向的元素的值
Object retrive()
{ return *current;}
//重载=(赋值)操作符
iteractor operator =(iteractor itr)
{
current=itr.current;
return iterator(current);
}
//重载==操作符
bool operator ==(iteractor itr)
{ return current==itr.current;}
public:
Object *current;
};
5、重载vector中的[ ]符号,使vector可以利用元素的位置查找相应的数据。这里有一点,就是这里并没有用到迭代器来实现,而是直接用了数组来实现相关的功能,这主要是因为,本身这个功能也十分的就是由数组传过来的。
public:
Object operator [](int index)
{ return object[index];}
6、建立基础的处理函数,这些函数是用来对数组执行基础性操作的
public:
//判断数组是否为空
bool Empty()
{
return theSize==0;
}
//返回数组中元素的个数
int Size()
{
if(theSize==0)
return 0;
else
return theSize;
}
//清空数组内所有的元素,重置theSize和Capacity
void clear()
{
//while(theSize==0)
//--theSize;
delete object;
theSize=0;
Capacity=SafeCapacity;
object=new Object[Capacity];
}
//返回第一个元素的地址
iteractor begin()
{
return iteractor(object);
}
//返回最后一个元素的地址
iteractor end()
{
return iteractor(&object[Size()-1]);
}
//调整容器的容量
void reserve(int NewCapacity)
{
if(NewCapacity<theSize)
{
}
else
{
Object *OldObject=object;
object=new Object[NewCapacity];
for(int i=0;i<theSize;i++)
object[i]=OldObject[i];
}
Capacity=NewCapacity;
//delete [] OldObject;
}
//调整容器的大小
void reSize(int NewSize)
{
if(NewSize>Capacity)
reserve(NewSize*2+1);
}
7、对数组进行增加数据及删除数据的操作
//弹出尾项
void pop_back()
{
theSize--;
}
void push_back(Object x)
{
if(theSize==Capacity)
reserve(theSize*2+1);
object[theSize++]=x;
}