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)存空間時庄拇,vector
和string
的實(shí)現(xiàn)通常會分配比新的空間需求更大的內(nèi)存空間,然后將已有元素從舊位置移動到新空間中措近,然后添加新元素溶弟,析構(gòu)掉舊內(nèi)存中的對象并釋放舊存儲空間。
vector
和string
提供了一些成員函數(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
,string
和deque
-
capacity()
和reserve
只適用于vector
和string
-
只有當(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
, string
和deque
退回不需要的內(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
可以清空所有元素件甥。但是即使clear
,vector
所占用的內(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;
}