自己对vector的理解:
首先vector的底层还是数组,但是他又不同于数组,数组是静态的,在定义的时候就确定了数组的长度。但是vector是动态的,他的长度是可以增加的。增加的规模是二倍增加。其次还需要注意的是真正实现的二倍增加并不是在原数组的基础上动态增加二倍,而是在系统空间中开辟一个原数组长度的二倍,然后再将原数组的值赋给新开辟的数组,然后将原数组删除的过程。
typedef int Rank;
#define DEFAULT_CAPACITY 3
template <template T> class Vector{
protected:
Rank _size; int _capacity; T* _elem;
...
public:
Vector(int c = DEFAULT_CAPACITY,int s = 0,T v = 0)
{
_elem = new T[_capacity = c];
for(_size = 0;_size < s; _elem[_size++] = v);
}
Vector(T const* A,Rank n){copyFrom(A,0,n);} //数组整体赋值
Vector(T const* A,Rank lo,Rank hi){copyFrom(A,lo,hi);} //区间赋值
Vector(Vector<T> const& V){copyFrom(v._elem,0,V._size);} //向量整体赋值
Vector(Vector<T> const& V,Rank lo,Rank hi){copyFrom(V._elem,lo,hi);}
~Vector(){delete []_elem;}
}
这里面主要写了Vector的几种构造方法。不同的构造方法基于不同的方式。
template<typename T>
void Vector<T>::copyFrom(T const* A,Rank lo,Rank hi){
_elem = new T[_capacity = 2*(hi-lo)];
_size = 0;;
while(lo < hi)
_elem[_size++] = A[lo++];
}
copyFrom()方法首先是开辟一个需要赋值的原数组的大小的二倍空间,换算出新向量的规模。最后通过一次迭代,完成区间A[lo,hi)内各元素的依次复制。
需要强调的是,由于向量内部含有动态分配的空间,默认的运算符“=”不足以支持向量之间的直接赋值。所以需要进行运算符重载。
template<typename T> Vector<T>& Vector<T>::operator=(Vector<T> const& V)
{
if(_elem) delete []_elem;
copyFrom(V._elem,0,V.size());
return *this;
}
Vector的扩容与缩容都很有意思,后面再码。。。