zoukankan      html  css  js  c++  java
  • 提高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);
     
    }
     
    细雨淅淅 标签:
  • 相关阅读:
    appium+python自动化项目实战(一):引入nose和allure框架
    jmeter+WebDriver:启动浏览器进行web自动化
    jmeter强大的扩展插件!!
    jmeter+Fiddler:通过Fiddler抓包生成jmeter脚本
    appium+python自动化测试真机测试时报错“info: [debug] Error: Could not extract PIDs from ps output. PIDS: [], Procs: ["bad pid 'uiautomator'"]”
    Appium+python移动端自动化测试-python库及pycharm安装(二)
    Appium+python移动端自动化测试-环境搭建(一)
    安全测试之bWAPP环境搭建
    Battery Historian之App耗电量测试
    (15)Docker之用Nginx实现SpringBoot应用的负载均衡简单记录
  • 原文地址:https://www.cnblogs.com/zsb517/p/3420210.html
Copyright © 2011-2022 走看看