Vector::insert remove

首先看看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; //返回被刪除元素
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章