首先,vector與deque不同,其記憶體占用空間只會增長,不會減小。比如你首先分配了10,000個位元組,然後erase掉後面9,999個,則雖然有效元素只有乙個,但是記憶體占用仍為10,000個。所有空間在vector析構時**。
1、釋放記憶體:
empty()是用來檢測容器是否為空的,clear()可以清空所有元素。但是即使clear(),所占用的記憶體空間依然如故。如果你需要空間動態縮小,可以考慮使用deque。如果非要用vector,這裡有乙個辦法:
在《effective stl》和其實很多c++文章中都有指明,用clear()無法保證記憶體**。但是swap技法可以。具體方法如下所示:
vectorivec;
ivec.push_back(1);ivec.push_back(1);ivec.push_back(2);ivec.push_back(2);
vector().swap(ivec); //或者ivec.swap(vector());
vector().swap(ivec); 或者如下所示 加一對大括號都可以,意思一樣的:
加一對大括號是可以讓tmp退出{}的時候自動析構
2、修整空間
在乙個應用中,可能會需要向乙個vector中插入很多記錄,比如說100000條,為了避免在插入過程中移動記憶體,咱實現向系統預訂一段足夠的連續的空間,例如
vectorivec;
ivec.reserve(100000);
這個問題是解決了。
但是,如果後來這個vector不再需要存那麼多的元素了,已經通過erase刪除了。但是以前咱們預留的空間卻無法被其他程式再度利用,這樣會造成記憶體一定程度上的浪費。於是,我們利用目前的vector構造乙個一模一樣的vector,他並沒有預留空間,於是以前預留的空間也被釋放以作他用了:
ivec.swap(vector(ivec)); // or vector(ivec).swap(ivec)
或者如下所示 加一對大括號都可以,意思一樣的:
加一對大括號是可以讓tmp退出{}的時候自動析構
使用這種方法的前提是vector從前儲存了大量資料,比如10000000,經過各種處理後,現在只有100條,那麼向清空原來資料所占有的空間,就可以通過這種交換技術swap技法就是通過交換函式swap(),使得vector離開其自身的作用域,從而強制釋放vector所佔的記憶體空間。
#include "stdafx.h"
#include
#include
using namespace std;
int main(int argc, char* argv)
swap清除vector占用記憶體
vector與deque不同,其記憶體占用空間只會增長,不會減小。比如你首先分配了10,000個位元組,然後erase掉後面9,999個,則雖然有效元素只有乙個,但是記憶體占用仍為10,000個。所有空間在vector析構時 empty 是用來檢測容器是否為空的,clear 可以清空所有元素。但是即...
vector的clear 和swap 比較
假設有若干物件存於乙個 vector 中 class widget vector vw 後來由於某些原因,從該容器中刪除了若干物件 參考erase remove idiom 對於 vector 和 string 來講,erase 和 clear 並不會改變容器的capacity,也就不會改變他們的記...
vector容器09之互換容器 swap
函式原型 include using namespace std include vector之互換容器 void print vector int v cout endl void test print v vector int v1 5,20 print v1 互換容器 實際應用 巧用swap可...