1、基于复制的构造方法
复制构造函数的多个重载,都是基于copyFrom()实现的:
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++];
}
赋值运算符重载:
template <typename T>
Vector<T>& Vector<T>::operator=(Vector<T> const& V){
if(_elem) delete []_elem;
copyFrom(V._elem, 0, V.size());
return *this;
}
2、扩容、缩容
注意:扩容和缩容的分摊时间复杂度都是O(1),在不是对单次操作敏感的情况下,保证了向量内部空间的高效利用。
template <typename T>
void Vector<T>::expand(){
if(_size < _capacity) return;
if(_capacity < DEFAULT_CAPACITY) _capacity = DEFAULT_CAPACITY;
T* oldElem = _elem; _elem = new T[_capacity <<= 1];
for(int i = 0; i < _size; i ++)
_elem[i] = oldElem[i];
delete []oldElem;
}
template <typename T>
void Vector<T>::shrink(){
if(_capacity < DEFAULT_CAPACITY << 1) return;
if(_size << 2 > _capacity) return;
T* oldElem = _elem;
_elem = new T[_capacity >>= 1];
for(int i = 0; i < _size; i ++)
_elem[i] = oldElem[i];
delete []oldElem;
}