vector利用swap 函式進行記憶體的釋放

2021-08-09 21:08:25 字數 1275 閱讀 8536

首先,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可...