自己對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的擴容與縮容都很有意思,後面再碼。。。