C++ STL vector

vector是一個類模板躬窜,模板本身不是類或函數(shù)(類模板和函數(shù)模板)谬盐,相反可以將模板看作編譯器生成類或函數(shù)的一份說明甸私。編譯器根據(jù)模板創(chuàng)建類或函數(shù)的過程稱為實(shí)例化(instantiation)飞傀,當(dāng)使用模板時,需要指出編譯器把類或函數(shù)實(shí)例化成何種類型助析。

C++能允許大多數(shù)類型的對象作為vector的元素,但是因?yàn)橐貌皇菍ο笸饧剑圆淮嬖诎玫?code>vector寡键。

vector常見成員函數(shù)

  • size() 返回容器中有多少個元素
  • capacity() 返回容器當(dāng)前已經(jīng)分配的內(nèi)存能容納多少個元素
  • resize(n) 強(qiáng)迫容器改變到包含n個元素的狀態(tài)
  • reserve(n) 強(qiáng)迫容器把它的容量變?yōu)橹辽?code>n雪隧,前提是n不小于當(dāng)前的大小

vector對象增長機(jī)制

為了支持快速隨機(jī)訪問,vector將元素連續(xù)存儲脑沿,如果沒有空間容納新元素,而不得不獲取新的內(nèi)存空間時庄拇,vectorstring的實(shí)現(xiàn)通常會分配比新的空間需求更大的內(nèi)存空間,然后將已有元素從舊位置移動到新空間中措近,然后添加新元素溶弟,析構(gòu)掉舊內(nèi)存中的對象并釋放舊存儲空間。
vectorstring提供了一些成員函數(shù)允許我們與它的實(shí)現(xiàn)中內(nèi)存分配部分互動瞭郑。

  • c.shrink_to_fit()capacity()減少為size()同樣大小
  • c.capacity() 不重新分配內(nèi)存辜御,c可以保存多少元素
  • c.reserve(n) 分配至少能容納n個元素的內(nèi)存空間
    注意:
    • shrink_to_fit()只適用于vector, stringdeque
    • capacity()reserve只適用于vectorstring

只有當(dāng)需要的內(nèi)存空間超過當(dāng)前容量時,reserve調(diào)用才會改變vector的容量屈张。如果需求大于當(dāng)前容量擒权,reserve至少分配與需求一樣大的內(nèi)存空間(可能更大)袱巨。如果小于等于當(dāng)前容量,reserve什么也不做碳抄。

在新標(biāo)準(zhǔn)庫中愉老,可以調(diào)用shrink_to_fit來要求vector, stringdeque退回不需要的內(nèi)存空間。但是纳鼎,具體的實(shí)現(xiàn)可以選擇忽略此請求俺夕,即調(diào)用shrink_to_fit也并不保證一定退回內(nèi)存空間。

vector內(nèi)存回收

由于vector的內(nèi)存占用空間只增不減贱鄙,比如你首先分配了10,000個字節(jié)劝贸,然后erase掉后面9,999個,留下一個有效元素逗宁,但是內(nèi)存占用仍為10,000個映九。所有內(nèi)存空間是在vector析構(gòu)時候才能被系統(tǒng)回收。empty用來檢測容器是否為空的瞎颗,clear可以清空所有元素件甥。但是即使clearvector所占用的內(nèi)存空間依然如故哼拔,無法保證內(nèi)存的回收引有。

如果需要空間動態(tài)縮小,可以考慮使用deque倦逐。如果非vector不可譬正,可以用swap()來幫助你釋放內(nèi)存。具體方法如下:

vector<int> nums; 
nums.push_back(1);
nums.push_back(2);
vector<int>().swap(nums); //或者nums.swap(vector<int> ())

或者如下所示檬姥,使用一對大括號曾我,意思一樣的:

//加一對大括號是可以讓tmp退出{}的時候自動析構(gòu)
{ 
    std::vector<int> tmp =   nums;  
    nums.swap(tmp); 
}

swap()是交換函數(shù),使vector離開其自身的作用域健民,從而強(qiáng)制釋放vector所占的內(nèi)存空間抒巢,總而言之,釋放vector內(nèi)存最簡單的方法是vector<int>().swap(nums)秉犹。當(dāng)時如果nums是一個類的成員蛉谜,不能把vector<int>().swap(nums)寫進(jìn)類的析構(gòu)函數(shù)中,否則會導(dǎo)致double free or corruption (fasttop)的錯誤崇堵,原因可能是重復(fù)釋放內(nèi)存型诚。

如果vector中存放的是指針,那么當(dāng)vector銷毀時筑辨,這些指針指向的對象不會被銷毀,那么內(nèi)存就不會被釋放棍辕。如下面這種情況,vector中的元素時由new操作動態(tài)申請出來的對象指針:

void doSomething()
{
    vector<int*> vip;
    for (int i = 0; i < 5; i++)
        vip.push_back(new int);
    // do something
    for (vector<int*>::iterator i = vip.begin(); i != vip.end(); ++i)
        delete *i;
}

Reference

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末栖袋,一起剝皮案震驚了整個濱河市抚太,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌电媳,老刑警劉巖庆亡,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件又谋,死亡現(xiàn)場離奇詭異,居然都是意外死亡彰亥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門继阻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來穴翩,“玉大人锦积,你說我怎么就攤上這事”丑。” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵带膀,是天一觀的道長垛叨。 經(jīng)常有香客問我柜某,道長塔猾,這世上最難降的妖魔是什么税迷? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮旁壮,結(jié)果婚禮上谐檀,老公的妹妹穿的比我還像新娘。我一直安慰自己童叠,他們只是感情好课幕,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著杜秸,像睡著了一般润绎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呢蛤,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天棍郎,我揣著相機(jī)與錄音,去河邊找鬼励翼。 笑死辜荠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的造烁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼叠纹,長吁一口氣:“原來是場噩夢啊……” “哼敞葛!你這毒婦竟也來了与涡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤氨肌,失蹤者是張志新(化名)和其女友劉穎怎囚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恳守,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡催烘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年缎罢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舰始。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡咽袜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出及老,到底是詐尸還是另有隱情,我是刑警寧澤骄恶,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布僧鲁,位于F島的核電站,受9級特大地震影響寞秃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜朗涩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一绑改、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧识腿,春花似錦、人聲如沸渡讼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伟众。三九已至,卻和暖如春凳厢,著一層夾襖步出監(jiān)牢的瞬間竞慢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工遮精, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留败潦,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓檬洞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親添怔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容