当前位置: 首页 > news >正文

提高Vector容器的删除效率

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);
 
}
 
细雨淅淅 标签: c++

转载于:https://www.cnblogs.com/zsb517/p/3420210.html

相关文章:

  • Hadoop生态系统之HDFS
  • 使用迅雷下载百度网盘2G以上文件
  • JavaScript学习(一)
  • hadoop2.2.0 + hbase 0.94 + hive 0.12 配置记录
  • NOIP2018提高组省一冲奖班模测训练(四)
  • 自己封装的BaseDao--更加灵活方便--hashmap
  • maven项目中利用jmeter-maven-plugin插件直接执行jmeter jmx脚本
  • IOS开发中常量的处理
  • Spring Boot基本介绍【学习笔记】
  • 网管与企业
  • EFI Windows 7 activition
  • 漫游Ruby
  • 深圳某银行ATM间—智慧管理项目
  • 详解Android中AsyncTask的使用
  • es7 --- 新特性
  • js如何打印object对象
  • leetcode-27. Remove Element
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • mysql 5.6 原生Online DDL解析
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • SpiderData 2019年2月16日 DApp数据排行榜
  • underscore源码剖析之整体架构
  • use Google search engine
  • Vue ES6 Jade Scss Webpack Gulp
  • Vue 重置组件到初始状态
  • Vue官网教程学习过程中值得记录的一些事情
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • XML已死 ?
  • 成为一名优秀的Developer的书单
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 分布式事物理论与实践
  • 讲清楚之javascript作用域
  • 聚类分析——Kmeans
  • 爬虫模拟登陆 SegmentFault
  • 译有关态射的一切
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • Python 之网络式编程
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • (03)光刻——半导体电路的绘制
  • (1)(1.13) SiK无线电高级配置(五)
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (定时器/计数器)中断系统(详解与使用)
  • (翻译)terry crowley: 写给程序员
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (一)Neo4j下载安装以及初次使用
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)德国人的记事本
  • (转)我也是一只IT小小鸟
  • (转)一些感悟
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net core 6 redis操作类
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .net mvc actionresult 返回字符串_.NET架构师知识普及