注:使用過第三種方法,可行!
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.capacity(); //j=512
i = vecint.size(); //i=0
第二種辦法使用 erase迴圈刪除,結果同上
vector ::iterator iter=vecint.begin();
for ( ;iter!=vecint.end();)
j= vecint.capacity(); //j=512
i = vecint.size(); //i=0
erase在每次操作時,迭代器指標會整體前移1,就是每次都會「搬」全部資料,所以vector不適合做頻繁刪除的容器
第三種辦法 最簡單的使用swap,清除元素並**記憶體
vector ().swap(vecint); //清除容器並最小化它的容量,
// vecint.swap(vector()) ; 另一種寫法
j= vecint.capacity(); //j=0
i = vecint.size(); //i=0
該語句是由vector (vecint).swap(vecint)的變體而來,一下解釋引自csdn:
std::vector(v).swap(v);的作用相當於:
第一句產生乙個和v內容一模一樣的vector,只不過temp的容量是恰好滿足其大小的
第二句把v和temp交換
然後temp就自動解析掉了
這樣寫的作用是:把v的容量縮小到最佳值
該例中執行這句時,capacity收縮到500
××××××××××××××××××××××
不過以上還是呼叫stl的函式看到的,不知其內部是如何做的。在網上看到其他人的討論有這樣:
@@而cygwin中的gcc用的應該是hp stl或從它繼承來的sgi stl,對於小記憶體有一種緩衝池機制,一旦進池的記憶體就再也不會交還給系統了
@@swap 不起作用, 因為原因是 allocator.
堆積木 vector 清空記憶體
蒜頭君有 n 塊積木,編號分別為 1 到 n。一開始,蒜頭把第 i 塊積木放在位置 i。蒜頭君進行 m 次操作,每次操作,蒜頭把位置 b 上的積木整體移動到位置 a 上面。比如 1 位置的積木是 1,2 位置的積木是 2,那麼把位置 2 的積木移動到位置 1 後,位置 1 上的積木從下到上依次為 1...
STL之防止記憶體洩露
可以自由分配和釋放記憶體造就了c 的靈活和強大,但這也是使用c 最容易出現問題的地方,記憶體洩露問題,估計程式猿都會或多或少的遇到,也遭受了很多程式猿們的深惡痛絕,無數個加班的晚上可能就是因為少了乙個delete的緣故。用過c 的人基本上都應該會了較過乙個叫stl 標準模板庫 的東西,這個東西在一定...
C 防止記憶體洩露的方法
一般程式設計師 都會這樣認為 用c 這樣的語言程式設計的乙個好處就是無需再考慮記憶體的分配和釋放。你只需建立物件,然後通過一種叫做垃圾收集的機制來處理這 些物件,也就是說 當它們不再被應用程式需要的時候來自動的清除這些物件。這個過程意味著c 解決了其它語言中極難處理的問題 可怕的記憶體洩露。真的是 ...