zoukankan      html  css  js  c++  java
  • C++ 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  
     

    办法1 : 使用 clear ,清空元素,但不回收空间.

    vecInt.clear();
    j= vecInt.capacity();  //j=512
    i = vecInt.size();     //i=0
     

    方法2 : 使用 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不适合做频繁删除的容器.


    方法3 :  使用clear和swap.

        先使用vecInt.clear()清空, 再使用swap,释放空间回收内存.

    (先vec.clear()再vec->swap( (std::vector <temp>)(vec) ),就能实现清空vector和释放原来vector的内存)

    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   产生一个和v内容一模一样的vector,只不过temp的容量是恰好满足其大小
    temp.swap(v);                 //2  把v和temp交换
    }
    第一句产生一个和v内容一模一样的vector,只不过temp的容量是恰好满足其大小的
    第二句把v和temp交换
    然后temp就自动解析掉了
    这样写的作用是:把v的容量缩小到最佳值
    该例中执行这句时,capacity收缩到500,若要收缩到0,需要先clear数据,再swap.
    ××××××××××××××××××××××
    不过以上还是调用stl的函数看到的,不知其内部是如何做的。在网上看到其他人的讨论有这样:
    @@而Cygwin中的GCC用的应该是HP STL或从它继承来的SGI STL,对于小内存有一种缓冲池机制,一旦进池的内存就再也不会交还给系统了
    @@swap 不起作用, 因为原因是 allocator.
    from:http://blog.csdn.net/metalkittie/archive/2008/10/21/3115750.aspx

    注意 clear 不会自动调用 vector中的成员的析构函数,指针数据的内存需要自己来释放。

  • 相关阅读:
    Attach Files to Objects 将文件附加到对象
    Provide Several View Variants for End-Users 为最终用户提供多个视图变体
    Audit Object Changes 审核对象更改
    Toggle the WinForms Ribbon Interface 切换 WinForms 功能区界面
    Change Style of Navigation Items 更改导航项的样式
    Apply Grouping to List View Data 将分组应用于列表视图数据
    Choose the WinForms UI Type 选择 WinForms UI 类型
    Filter List Views 筛选器列表视图
    Make a List View Editable 使列表视图可编辑
    Add a Preview to a List View将预览添加到列表视图
  • 原文地址:https://www.cnblogs.com/xiangwengao/p/2413257.html
Copyright © 2011-2022 走看看