日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

vector利用swap()函数进行内存的释放

發布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vector利用swap()函数进行内存的释放 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先,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()函数进行内存的释放的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。