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

2021-10-17 10:02:15 字數 1355 閱讀 3432

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

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

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

2、怎麼釋放vector的記憶體

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

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

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

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

#include #include using namespace std;

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

void test()

cout <

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

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

vector().swap(vecnum);

//列印vector的大小和容量

cout <

}int main()

執行結果

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

在vector中新增500個元素 vector vecint for int i 0 i 500 i int j vecint.capacity j 512 i vecint.size i 500第一種辦法使用 clear 清空元素,但不 空間 vecint.clear j vecint.capac...

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

vector vecnum vecnum.push back 1 1.clear 清空元素,但不 空間 vecnum.clear 2.使用 erase迴圈刪除,結果同上 vector iterator it for it vecnum.begin it vecnum.end cout new2 si...

python 清空list的幾種方法

本文介紹清空list的四種方法,以及 list 和 list.clear 在使用中的區別 坑 1 使用clear 方法 lists 1,2,1,1,5 lists.clear print lists 2 重新初始化列表 初始化該範圍內的列表,初始化列表沒有值,即大小為0的列表 lists 1,2,1...