首先看看vector不同於數組的一個地方:可以根據數據的多少擴容:
至於這裏爲什麼要是擴充一倍,因爲擴容函數執行也需要時間開銷,當以增加一倍擴容時調用擴容的概率和容量的匹配要更好:
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]; //複製原向量內容(T爲基本類型,或已重載賦值操作符'=')
/*DSA*/ //printf("\n_ELEM [%x]*%d/%d expanded and shift to [%x]*%d/%d\n", oldElem, _size, _capacity/2, _elem, _size, _capacity);
delete [] oldElem; //釋放原空間
}
在秩爲r處插入元素:
template <typename T> //將e作爲秩爲r元素插入
Rank Vector<T>::insert(Rank r, T const& e) { //assert: 0 <= r <= size
expand(); //若有必要,擴容
for (int i = _size; i > r; i--) _elem[i] = _elem[i-1]; //自後向前,後繼元素順次後移一個單元
_elem[r] = e; _size++; //置入新元素並更新容量
return r; //返回秩
}
默認的是在末尾插入元素:
Rank insert(T const & e) { return insert(_size, e); } //默認作爲末元素插入
當刪除元素時可能會縮容:
template <typename T> void Vector<T>::shrink() { //裝填因子過小時壓縮向量所佔空間
if (_capacity < DEFAULT_CAPACITY<<1) return; //不致收縮到DEFAULT_CAPACITY以下
if (_size<<2 > _capacity) return; //以25%爲界
T* oldElem = _elem; _elem = new T[_capacity >>= 1]; //容量減半
for (int i = 0; i < _size; i++) _elem[i] = oldElem[i]; //複製原向量內容
delete [] oldElem; //釋放原空間
}
remove某塊區域:
template <typename T> int Vector<T>::remove(Rank lo, Rank hi) { //刪除區間[lo, hi)
if (lo == hi) return 0; //出於效率考慮,單獨處理退化情況,比如remove(0, 0)
while (hi < _size) _elem[lo++] = _elem[hi++]; //[hi, _size)順次前移hi - lo個單元
_size = lo; //更新規模,直接丟棄尾部[lo, _size = hi)區間
shrink(); //若有必要,則縮容
return hi - lo; //返回被刪除元素的數目
}
刪除某一個秩爲r的元素:
template <typename T> T Vector<T>::remove(Rank r) { //刪除向量中秩爲r的元素,0 <= r < size
T e = _elem[r]; //備份被刪除元素
remove(r, r + 1); //調用區間刪除算法,等效於對區間[r, r + 1)的刪除
return e; //返回被刪除元素
}