zoukankan      html  css  js  c++  java
  • 使用STL vector的几种清空容器(删除)办法

    vector <int> vecInt;

    for (int i=0;i<500;i++)

      vecInt.push_back(i);

    }

    int j= vecInt.capacity();   //j=512

     i = vecInt.size();          //i=500            


    第一种办法使用 clear ,清空元素,但不回收空间

    vecInt.clear();

    j= vecInt.capacity();      //j=512

    i = vecInt.size();         //i=0


    第二种办法使用 erase循环删除,结果同上

    vector <int>::iterator iter=vecInt.begin();

    for ( ;iter!=vecInt.end();)

    {

        iter=vecInt.erase(iter);

    }

    j= vecInt.capacity();      //j=512

     i = vecInt.size();         //i=0        

    erase在每次操作时,迭代器指针会整体前移1,就是每次都会“搬”全部数据,所以vector不适合做频繁删除的容器

    第三种办法 最简单的使用swap,清除元素并回收内存

    vector <int>().swap(vecInt);  //清除容器并最小化它的容量,

    //   vecInt.swap(vector<int>()) ;     另一种写法

     j= vecInt.capacity();       //j=0  

     i = vecInt.size();          //i=0        

    该语句是由vector <int>(vecInt).swap(vecInt)的变体而来,一下解释引自csdn:

    std::vector<T>(v).swap(v);的作用相当于:    
      {   
      std::vector<T>   temp(v);//1   
      temp.swap(v);//2   
      }   
      第一句产生一个和v内容一模一样的vector,只不过temp的容量是恰好满足其大小的   
      第二句把v和temp交换   
      然后temp就自动解析掉了   
        
      这样写的作用是:把v的容量缩小到最佳值

    该例中执行这句时,capacity收缩到500

    ××××××××××××××××××××××
    不过以上还是调用stl的函数看到的,不知其内部是如何做的。在网上看到其他人的讨论有这样:
    @@而Cygwin中的GCC用的应该是HP STL或从它继承来的SGI STL,对于小内存有一种缓冲池机制,一旦进池的内存就再也不会交还给系统了
    @@swap 不起作用, 因为原因是 allocator.

    待续。。。。

    详见:http://blog.csdn.net/metalkittie/article/details/3115750

  • 相关阅读:
    yzoj P2344 斯卡布罗集市 题解
    yzoj P2350 逃离洞穴 题解
    yzoj P2349 取数 题解
    JXOI 2017 颜色 题解
    NOIP 2009 最优贸易 题解
    CH 4302 Interval GCD 题解
    CH4301 Can you answer on these queries III 题解
    Luogu2533[AHOI2012]信号塔
    Luogu3320[SDOI2015]寻宝游戏
    Luogu3187[HNOI2007]最小矩形覆盖
  • 原文地址:https://www.cnblogs.com/ct1104/p/3839645.html
Copyright © 2011-2022 走看看