码迷,mamicode.com
首页 > 其他好文 > 详细

Vector::insert remove

时间:2015-05-19 22:36:11      阅读:237      评论:0      收藏:0      [点我收藏+]

标签: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

标签:vector   insert   remove   expand   shrink   

原文地址:http://blog.csdn.net/ganxiang2011/article/details/45851119

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!