1. 程式人生 > >vector 利用swap 函數進行內存的釋放 vector<int>().swap

vector 利用swap 函數進行內存的釋放 vector<int>().swap

cap kms rtt dep 析構 roo bit fpm rac

首先,vector與deque不同,其內存占用空間只會增長,不會減小。比如你首先分配了10,000個字節,然後erase掉後面9,999個,則雖然有效元素只有一個,但是內存占用仍為10,000個。所有空間在vector析構時回收。

1、釋放內存:
empty()是用來檢測容器是否為空的,clear()可以清空所有元素。但是即使clear(),所占用的內存空間依然如故。如果你需要空間動態縮小,可以考慮使用deque。如果非要用vector,這裏有一個辦法:

在《effective STL》和其實很多C++文章中都有指明,用clear()無法保證內存回收。但是swap技法可以。具體方法如下所示:
vector<int> ivec;
ivec.push_back(1);ivec.push_back(1);ivec.push_back(2);ivec.push_back(2);
vector<int>().swap(ivec); //或者ivec.swap(vector<int>());

vector<int>().swap(ivec); 或者如下所示 加一對大括號都可以,意思一樣的:
{
std::vector<int> tmp;
ivec.swap(tmp);
}
加一對大括號是可以讓tmp退出{}的時候自動析構

2、修整空間
在一個應用中,可能會需要向一個vector中插入很多記錄,比如說100000條,為了避免在插入過程中移動內存,咱實現向系統預訂一段足夠的連續的空間,例如
vector<int> ivec;
ivec.reserve(100000);
這個問題是解決了。
但是,如果後來這個vector不再需要存那麽多的元素了,已經通過erase刪除了。但是以前咱們預留的空間卻無法被其他程序再度利用,這樣會造成內存 一定程度上的浪費。於是,我們利用目前的vector構造一個一模一樣的vector,他並沒有預留空間,於是以前預留的空間也被釋放以作他用了:
ivec.swap(vector<int>(ivec)); // or vector<int>(ivec).swap(ivec)
或者如下所示 加一對大括號都可以,意思一樣的:
{
std::vector<int> tmp = ivec;
ivec.swap(tmp);
}
加一對大括號是可以讓tmp退出{}的時候自動析構

使用這種方法的前提是vector從前存儲了大量數據,比如10000000,經過各種處理後,現在只有100條,那麽向清空原來數據所占有的空間,就可 以通過這種交換技術swap技法就是通過交換函數swap(),使得vector離開其自身的作用域,從而強制釋放vector所占的內存空間。


#include "stdafx.h"
#include <vector>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
vector <int> v1, v2;
cout << "The number of elements in v1 = " << v1.size( ) << endl;
cout << "The number of elements in v2 = " << v2.size( ) << endl;
cout << v1.capacity() << endl;
cout << v2.capacity() << endl;
v1.push_back( 1 );
v1.push_back( 2 );
v1.push_back( 3 );
v2.push_back( 10 );
v2.push_back( 20 );
cout << "The number of elements in v1 = " << v1.size( ) << endl;
cout << "The number of elements in v2 = " << v2.size( ) << endl;
cout << v1.capacity() << endl;
cout << v2.capacity() << endl;
cout << endl;
v1.swap( v2 );
cout << "The number of elements in v1 = " << v1.size( ) << endl;
cout << "The number of elements in v2 = " << v2.size( ) << endl;

cout << v1.capacity() << endl;
cout << v2.capacity() << endl;


return 0;
}

技術分享

vector 利用swap 函數進行內存的釋放 vector<int>().swap