提高Vector容器的删除效率

摘要:
vector容器是类似与一个线性数组,索引效率高,插入,删除的效率很低,需要遍历数据列表,一般情况下vector的删除操作由一下函数完成:iteratorerase//删除一个位置iteratorerase//删除迭代器起始位置到最终位置voidresize//修改容器大小看看STL的源码文件中这几个函数中的操作://將迭代器position所指之元素移除iteratorerase{if(position+1!voidclear(){erase;}很明显:已知需要删除的位置的时候,erase()函数删除当期位置,然后将后面的数据前移,这也是为什么vector插入删除操作速度慢的原因。=ilist.end())++it;}2提高删除的效率it=ilist.begin();while(!

vector容器是类似与一个线性数组,索引效率高,插入,删除的效率很低,需要遍历数据列表,一般情况下vector的删除操作由一下函数完成:

iterator erase(iterator position)                     //删除一个位置
iterator erase(iterator first, iterator last)          //删除迭代器起始位置到最终位置
void resize(size_type new_size, const T& x)  // 修改容器大小

看看STL的源码文件中这几个函数中的操作:

      // 將迭代器 position 所指之元素移除
     iterator erase(iterator position)
    {
     if (position + 1 != end()) // 如果 p 不是指向最後一個元素
      // 將 p 之後的元素一一向前遞移
      copy(position + 1, finish, position);
    --finish;  // 調整水位
    destroy(finish);   // 全域函式,建構/解構基本工具。
    return position;
  }
  iterator erase(iterator first, iterator last) {
    iterator i = copy(last, finish, first);
    destroy(i, finish);    // 全域函式,建構/解構基本工具。
    finish = finish - (last - first);
    return first;
  }
  void resize(size_type new_size, const T& x) {
    if (new_size < size())
      erase(begin() + new_size, end());
    else
      insert(end(), new_size - size(), x);
  }
  void resize(size_type new_size) { resize(new_size, T()); }
  // 清除全部元素。注意,並未釋放空間,以備可能未來還會新加入元素。
  void clear() { erase(begin(), end()); }

很明显:已知需要删除的位置的时候,erase()函数删除当期位置,然后将后面的数据前移,这也是为什么vector插入删除操作速度慢的原因。resize()函数根据参数重新容器的大小,如果设定的尺寸小于原先的则将多余的数据直接erase。

今天意外中开发一种比较巧的避免删除时候位移的方法:把需要删除的元素和最后一个元素交换位置,然后通过resize() 来删除数据,不过这种办法没法保证列表中数据的顺序。

1循环删除操作
vector<int>::iterator it = ilist.begin();
while(it != ilist.end())
{
it = ilist.erase(it);   //删除当前位置的元素,后面的元素前移
if(it != ilist.end())
++it;
}
2提高删除的效率
it = ilist.begin();
while(!ilist.empty())
{
*it = *(ilist.end()-1);  //先移动位置,然后删除  
ilist.resize(ilist.size()-1);
}
细雨淅淅 标签:

免责声明:文章转载自《提高Vector容器的删除效率》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇centos 删除指定文件之外的其他文件01.SQLServer性能优化之----强大的文件组----分盘存储下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

position fixed 居中

1、水平居中.footer { height: 10%; text-align: center; position: relative; left: 50%; transform: translate(-50%, -50%); /*水平居中*/ top: 30px;}2、垂直居中: .footer { heig...

EasyExcel调试记录

一.pom.xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.6</version>...

仿苹果电脑任务栏菜单&amp;amp;&amp;amp;拼图小游戏&amp;amp;&amp;amp;模拟表单控件

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> &...

(三)Java 高级特性

第一章 集合框架 集合框架是为表示和操作集合而规定的一种统一的标准系结构。集合框架都包含三个块内容对外的接口、接口的实现和集合运算的算法。 接口:表示集合的抽象数据类型,如Collection、List、Set、Map、Iterator。 实现:集合框架中接口的具体实现,如ArrayList、LinkedList、HashMap、HashSet。 算法:...

Android中finish()方法

finish()官方解析:Call this when your activity is done and should be closed. The ActivityResult is propagated back to whoever launched you via onActivityResult(). 也就是说,当你打开的Activity已经执...

vue cesium 加载倾斜摄影数据并在上面添加自定义标注【转】

在main.js引入 import Cesium from 'cesium/Cesium'import '../node_modules/cesium/Build/Cesium/Widgets/widgets.css' Vue.prototype.Cesium = Cesium; <br>// 以下是组件内容<br><br...