sophia_hxw

人生有三恨,一恨鲫鱼有刺,二恨海棠无香,三恨红楼未完!----------张爱玲
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

vector容器删除某些元素且释放内存

Posted on 2016-12-27 22:19  sophia_hxw  阅读(459)  评论(0编辑  收藏  举报

1,size和capacity

size:
指目前容器中实际有多少元素,对应的resize(size_type)会在容器尾添加或删除一些元素,来调整容器中实际的内容,使容器达到指定的大小。
capacity:
指最少要多少元素才会使其容量重新分配,对应reserve(size_type new_size)会这置这个capacity值,使它不小于所指定的new_size。
所以用reserve(size_type)只是扩大capacity值,这些内存空间可能还是“野”的,如果此时使用“[ ]”来访问,则可能会越界。而resize(size_type new_size)会真正使容器具有new_size个对象。
元素访问方式差别
在对vector进行访问时,如果使用“[ ]”,则会像变通数组那样,不进行越界的判断。
如果使用“at(size_type)”函数则会先进行越界的判断。

2,应用

经常会用到vector中元素不再使用,需要删除元素且释放内存的操作,记录如下:
iter = strVec.erase(iter);
strVec是容器名称,iter是迭代器,删除元素后,迭代器指向下一个元素;
vector(Vec).swap(Vec);
将Vec的内存空洞清除;
vector().swap(Vec);
清空Vec的内存;
示例代码:
#include"iostream"
#include"vector"
#include"string"

using namespace std;

int main() {
    vector<string> strVec;
    
    strVec.push_back("Sophia");
    strVec.push_back("and");
    strVec.push_back("Nemo");
    strVec.push_back("are");
    strVec.push_back("good");
    strVec.push_back("people.");
    
    cout << "The capacity of the original vector is: " << strVec.capacity() << endl;
    
    for (vector<string>::iterator iter = strVec.begin(); iter != strVec.end();) {
        if ((*iter) == "and")
            iter=strVec.erase(iter);
        else if((*iter) == "Nemo")
            iter = strVec.erase(iter);
        else
            iter++;
    }
    
    vector<string>(strVec).swap(strVec);
    
    cout << "After deleting two elements in the vector, now the capacity is: " << strVec.capacity() << endl;
    
    vector<string>().swap(strVec);
    
    cout << "After clearing, now the capacity is: " << strVec.capacity() << endl;
    
    system("Pause");
    return 0;
}

3,程序结果