最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++容器std::vector的swap()函數(shù)使用方式

 更新時間:2023年08月09日 10:33:37   作者:吃素的施子  
這篇文章主要介紹了C++容器std::vector的swap()函數(shù)使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

std::vector中的常用函數(shù)

  • .clear();清空數(shù)據(jù)
  • .size();當(dāng)前vector容器內(nèi)存儲的元素的個數(shù)
  • .capacity();當(dāng)前vector容器重新分配內(nèi)存之前所能容納的元素數(shù)量
  • .swap();函數(shù)交換
  • .reserve();向系統(tǒng)預(yù)訂一段足夠的連續(xù)的空間

.swap用于釋放內(nèi)存

首先,vector與deque不同,其內(nèi)存占用空間只會增長,不會減小。

比如你首先分配了10,000個字節(jié),然后erase掉后面9,999個,則雖然有效元素只有一個,但是內(nèi)存占用仍為10,000個。所有空間在vector析構(gòu)時回收。  

在用vector時,輸入完一組數(shù)據(jù)處理完后,調(diào)用clear()進(jìn)行清理,如果此時打印vector[0],會發(fā)現(xiàn)仍然輸出之前vector所存的內(nèi)容,但是如果調(diào)用.empty()函數(shù)又會返回1,告訴我們這個容器現(xiàn)在是空的,什么原因?

這是因為使用.clear()清空內(nèi)容,但是沒有釋放內(nèi)存的原因。

舉例如下: 

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector <int >a;
	cout<<a.empty()<<endl;//輸出   1  代表該vector此時是空
	a.push_back(1);
	a.push_back(2);
	cout<<a[0]<<" "<<a[1]<<endl;//輸出1 2
	cout<<a.empty()<<endl;//輸出 0 代表該vector此時非空
	cout<<a.size()<<endl;//輸出2
	cout<<a.capacity()<<endl;//輸出2
	cout<<"***************"<<endl;
	//a[0]=NULL;a[1]=NULL; 這是賦值為0,并不清空數(shù)據(jù),也不釋放內(nèi)存。
	a.clear();
	cout<<a[0]<<" "<<a[1]<<endl;//仍然輸出1 2,因為沒有釋放內(nèi)存,所以輸出該地址的內(nèi)容仍然與之前一樣
	cout<<a.empty()<<endl;//輸出1  代表該vector此時已經(jīng)為空
	cout<<a.size()<<endl;//輸出0,代表當(dāng)前容器內(nèi)存儲元素個數(shù)是0,與.empty()類似,都告訴我們當(dāng)前容器是空的意思
	cout<<a.capacity()<<endl;//輸出2,代表當(dāng)前該vector在重新分配存儲空間前所能容納的元素數(shù)量并沒有改變
	cout<<"***************"<<endl;
	/*
	下面這五行說明,.pop_back()與.clear()起到了相同的作用,都是清空數(shù)據(jù),但是沒有釋放內(nèi)存
	while(!a.empty()){
		a.pop_back();
	}
	cout<<a.empty()<<endl;//輸出 1 代表該vector此時已經(jīng)為空
	cout<<a[0]<<" "<<a[1]<<endl;//仍然輸出為 1 2,因為沒有釋放內(nèi)存,所以輸出該地址的內(nèi)容仍然與之前一樣
	*/
	a.push_back(4);
	cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;//輸出 4 2 0   盡管沒有釋放內(nèi)存,但是已經(jīng)認(rèn)為該vector已經(jīng)被清空,所以再push_back();時,a[0]被覆蓋。
	cout<<a.size()<<endl;//輸出1,代表當(dāng)前容器內(nèi)存儲元素個數(shù)是1,就是剛剛push_back();裝進(jìn)去的數(shù)起到的作用
	cout<<a.capacity()<<endl;//此時仍然輸出2
	cout<<"***************"<<endl;

在《effective STL》和其實很多C++文章中都有指明,用clear()無法保證內(nèi)存回收。但是swap技法可以。

那么如何釋放內(nèi)存呢?

我們用swap交換到一個新的類型的vector,將原來的a拷貝出去,然后自然銷毀,而新的到的a是全新的沒有存任何數(shù)據(jù)的。

具體方法如下所示: 

vector<int>().swap(a);
//或者如下所示 加一對大括號都可以,意思一樣的:
{
 std::vector<int> tmp;   
 ivec.swap(tmp);
}     
//加一對大括號是可以讓tmp退出{}的時候自動析構(gòu)
cout<<a.size()<<endl;//輸出 0
cout<<a.capacity()<<endl;.// 輸出 0
//cout<<a[1]<<endl;

.swap用于修剪掉多余空間

在一個應(yīng)用中,可能會需要向一個vector中插入很多記錄,比如說100000條,為了避免在插入過程中移動內(nèi)存,咱實現(xiàn)向系統(tǒng)預(yù)訂一段足夠的連續(xù)的空間,

例如:

vector<int> ivec;
ivec.reserve(100000);

移動內(nèi)存問題是解決了。

但是如果后來這個vector不再需要存那么多的元素了,已經(jīng)通過erase刪除了。但是以前咱們預(yù)留的空間卻無法被其他程序再度利用,這樣會造成內(nèi)存一定程度上的浪費(fèi)。

于是,我們利用目前的vector構(gòu)造一個一模一樣的vector,他并沒有預(yù)留空間,于是以前預(yù)留的空間也被釋放以作他用了:

ivec.swap(vector<int>(ivec)); 
// or vector<int>(ivec).swap(ivec)

此時vector占用的多余空間將被釋放

或者如下所示 加一對大括號都可以,意思一樣的:

  {
     std::vector<int> tmp = ivec;   
     ivec.swap(tmp);
  }     

加一對大括號是可以讓tmp退出{}的時候自動析構(gòu);使用這種方法的前提是vector從前存儲了大量數(shù)據(jù),比如10000000,經(jīng)過各種處理后,現(xiàn)在只有100條,那么向清空原來數(shù)據(jù)所占有的空間,就可以通過這種交換技術(shù)swap技法就是通過交換函數(shù)swap(),使得vector離開其自身的作用域,從而強(qiáng)制釋放vector所占的內(nèi)存空間。

對于容器的去重復(fù)操作類似:

std::vector<int> ModuleArr;
//排序
std::sort(ModuleArr.begin(), ModuleArr.end());
//去重
ModuleArr.erase(unique(ModuleArr.begin(), ModuleArr.end()), ModuleArr.end());

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解dll動態(tài)庫的開發(fā)與調(diào)用及文件的讀寫小程序

    詳解dll動態(tài)庫的開發(fā)與調(diào)用及文件的讀寫小程序

    這篇文章主要介紹了詳解dll動態(tài)庫的開發(fā)與調(diào)用及文件的讀寫小程序的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • qml中QtObject類型的用法小結(jié)

    qml中QtObject類型的用法小結(jié)

    QtObject 類型是一個非可視元素,僅包含objectName屬性,如果需要一個非常輕量級的類型來包含一組自定義屬性,那么創(chuàng)建一個QtObject,本文給大家介紹qml中QtObject類型的使用,感興趣的朋友一起看看吧
    2024-01-01
  • C語言實現(xiàn)三子棋游戲簡易版

    C語言實現(xiàn)三子棋游戲簡易版

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)三子棋游戲簡易版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • c++ CRTP模式的使用小結(jié)

    c++ CRTP模式的使用小結(jié)

    CRTP是C++中一種高級的模板編程技術(shù),它通過將派生類作為基類的模板參數(shù)來實現(xiàn)編譯期多態(tài),本文就來介紹一下c++ CRTP模式的使用小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • C++的繼承特性你了解嗎

    C++的繼承特性你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C++的繼承特性,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C語言中sizeof和strlen的區(qū)別詳解

    C語言中sizeof和strlen的區(qū)別詳解

    這篇文章主要介紹了C語言中sizeof和strlen的區(qū)別,文中有通過代碼示例和相關(guān)例題給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • C++中extern

    C++中extern "C"的用法

    這篇文章主要介紹了C++中extern "C"的用法,是深入理解C++所應(yīng)該掌握的概念,需要的朋友可以參考下
    2014-08-08
  • VC實現(xiàn)動態(tài)菜單的創(chuàng)建方法

    VC實現(xiàn)動態(tài)菜單的創(chuàng)建方法

    這篇文章主要介紹了VC實現(xiàn)動態(tài)菜單的創(chuàng)建方法,需要的朋友可以參考下
    2014-07-07
  • 如何用C寫一個web服務(wù)器之基礎(chǔ)功能

    如何用C寫一個web服務(wù)器之基礎(chǔ)功能

    C語言是一門很基礎(chǔ)的語言,程序員們對它推崇備至,本文將帶著大家來看一下,如何用C寫一個web服務(wù)器。
    2021-05-05
  • C語言詳細(xì)講解if語句與switch語句的用法

    C語言詳細(xì)講解if語句與switch語句的用法

    用 if 語句可以構(gòu)成分支結(jié)構(gòu),它根據(jù)給的條件進(jìn)行判定,以決定執(zhí)行哪個分支程序段,C 語言中還有另外一種分支語句,就是 switch 語句
    2022-05-05

最新評論

县级市| 安远县| 疏附县| 封开县| 珲春市| 滨海县| 沙湾县| 西贡区| 阿勒泰市| 遵化市| 武宁县| 福清市| 呼伦贝尔市| 马鞍山市| 奉化市| 林西县| 堆龙德庆县| 枣庄市| 瓦房店市| 临清市| 岳阳市| 梓潼县| 都匀市| 军事| 长武县| 昭苏县| 灵宝市| 榆社县| 吴桥县| 霍林郭勒市| 静乐县| 潮州市| 桑植县| 藁城市| 边坝县| 新津县| 高碑店市| 宣恩县| 曲阜市| 旬邑县| 铁岭县|