1. 程式人生 > 其它 >STL vector的幾種清空容器(刪除)辦法

STL vector的幾種清空容器(刪除)辦法

技術標籤:C++容器vectorSTL

1、為什麼需要主動釋放vector記憶體

來自 <https://blog.csdn.net/hellokandy/article/details/78500067>

vector其中一個特點:記憶體空間只會增長,不會減小,援引C++ Primer:為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每一個元素都緊挨著前一個元素儲存。設想一下,當vector新增一個元素時,為了滿足連續存放這個特性,都需要重新分配空間、拷貝元素、撤銷舊空間,這樣效能難以接受。因此STL實現者在對vector進行記憶體分配時,其實際分配的容量要比當前所需的空間多一些。就是說,vector容器預留了一些額外的儲存區,用於存放新新增的元素,這樣就不必為每個新元素重新分配整個容器的記憶體空間。

在呼叫push_back時,每次執行push_back操作,相當於底層的陣列實現要重新分配大小;這種實現體現到vector實現就是每當push_back一個元素,都要重新分配一個大一個元素的儲存,然後將原來的元素拷貝到新的儲存,之後在拷貝push_back的元素,最後要析構原有的vector並釋放原有的記憶體。

2、怎麼釋放vector的記憶體

來自 <https://blog.csdn.net/hellokandy/article/details/78500067>

A、對於資料量不大的vector,沒有必要自己主動釋放vector,一切都交給作業系統。

B、但是對於大量資料的vector,在vector裡面的資料被刪除後,主動去釋放vector的記憶體就變得很有必要了!

由於vector的記憶體佔用空間只增不減,比如你首先分配了10000個位元組,然後erase掉後面9999個,留下一個有效元素,但是記憶體佔用仍為10000個。所有記憶體空間是在vector析構時候才能被系統回收。empty()用來檢測容器是否為空的,clear()可以清空所有元素。但是即使clear(),vector所佔用的記憶體空間依然如故,無法保證記憶體的回收。如果需要空間動態縮小,可以考慮使用deque。如果vector,可以用swap()來幫助你釋放記憶體。

clear使用之後,並不能清空資料,其資料再未被覆蓋之前是不會改變的,個人猜測clear僅僅把指標挪動到了起始位置。

#include<iostream>

#include<vector>

usingnamespacestd;

//STLvector的幾種清空容器(刪除)辦法

voidtest()

{

vector<int>vecnum;

vecnum.push_back(1);

vecnum.push_back(2);

vecnum.push_back(3);

vecnum.push_back(4);

vecnum.push_back(5);

vecnum.push_back(6);

vecnum.push_back(7);

//列印vector的大小和容量

cout<<"old:size="<<vecnum.size()<<";capacity="<<vecnum.capacity()<<endl;



//1.clear(),清空元素,但不回收空間

vecnum.clear();

cout<<"new1:size="<<vecnum.size()<<";capacity="<<vecnum.capacity()<<endl;



//2.使用erase迴圈刪除,結果同上

vector<int>::iteratorit;

for(it=vecnum.begin();it!=vecnum.end();)

{

//注意使用erase()方法時,迭代不要隨意的++

it=vecnum.erase(it);

}

cout<<"new2:size="<<vecnum.size()<<";capacity="<<vecnum.capacity()<<endl;

//結論:erase在每次操作時,迭代器指標會整體前移1,就是每次都會移動全部資料,所以vector不適合做頻繁刪除的容器



//3.最簡單的使用swap,清除元素並回收記憶體

vector<int>().swap(vecnum);

//列印vector的大小和容量

cout<<"new2:size="<<vecnum.size()<<";capacity="<<vecnum.capacity()<<endl;

}

intmain()

{

test();

getchar();

return0;

}

執行結果