vector容器刪除某些元素且釋放內存

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)」函數則會先進行越界的判斷。ios

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,程序結果

相關文章
相關標籤/搜索