STL vector的幾種清空容器(刪除)辦法
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; }
執行結果