标签:vector insert remove expand shrink
首先看看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; //返回被删除元素
}
标签:vector insert remove expand shrink
原文地址:http://blog.csdn.net/ganxiang2011/article/details/45851119