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

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

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

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

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

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

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

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

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

這是因?yàn)槭褂?clear()清空內(nèi)容,但是沒(méi)有釋放內(nèi)存的原因。

舉例如下: 

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

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

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

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

具體方法如下所示: 

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

.swap用于修剪掉多余空間

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

例如:

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

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

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

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

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

此時(shí)vector占用的多余空間將被釋放

或者如下所示 加一對(duì)大括號(hào)都可以,意思一樣的:

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

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

對(duì)于容器的去重復(fù)操作類(lèi)似:

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

總結(jié)

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

相關(guān)文章

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

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

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

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

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

    C語(yǔ)言實(shí)現(xiàn)三子棋游戲簡(jiǎn)易版

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

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

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

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

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

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

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

    C++中extern "C"的用法

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

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

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

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

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

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

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

最新評(píng)論

枞阳县| 陵川县| 隆子县| 江达县| 荣成市| 抚远县| 莲花县| 同江市| 凌源市| 肥乡县| 富蕴县| 蒲江县| 乐安县| 牙克石市| 余姚市| 磐石市| 吉木乃县| 壶关县| 德昌县| 厦门市| 西安市| 武陟县| 微博| 叶城县| 铅山县| 汽车| 柘城县| 德安县| 柞水县| 鹤岗市| 龙山县| 黄骅市| 双峰县| 高雄市| 钟山县| 讷河市| 珠海市| 酒泉市| 镶黄旗| 高唐县| 桃园县|