您好,登錄后才能下訂單哦!
以前使用vector容器一直有個(gè)誤區(qū)=。=,然后最近面試被鄙視了QWQ
先說(shuō)一下vector容器的簡(jiǎn)單原理:
對(duì)于vector容器而言,數(shù)據(jù)結(jié)構(gòu)就是數(shù)組,在STL中我有剖析源碼。其中實(shí)現(xiàn)的是相當(dāng)于數(shù)組的方面,然后其中對(duì)于容器的操作函數(shù)都有:
push_back
Add element at the end (public member function )
pop_back
Delete last element (public member function )
insert
Insert elements (public member function )
erase
Erase elements (public member function )
swap
Swap content (public member function )
clear
Clear content (public member function )
emplace
Construct and insert element (public member function )
emplace_back
Construct and insert element at the end (public member function )
在這之中。插入操作我們就暫且不提。就是數(shù)組的數(shù)據(jù)插入。
現(xiàn)在說(shuō)一下關(guān)于vector容器中的空間設(shè)置
vector中有2個(gè)大小指標(biāo),一個(gè)是size:代表當(dāng)前數(shù)據(jù)的大小
另外一個(gè)是capacity.代表著當(dāng)前vector所申請(qǐng)的空間大小
下面提一下空間配置器。對(duì)于STL所有的容器而言,都是使用STL內(nèi)部實(shí)現(xiàn)的alloc(內(nèi)存池)進(jìn)行空間的申請(qǐng)。vector是一個(gè)靜態(tài)的空間,也就是我們申請(qǐng)以后就無(wú)法進(jìn)行修改了。
以前我很蠢的直接調(diào)用clear然后就清除數(shù)據(jù)就ok了,然后空間隨著作用域進(jìn)行釋放。。
結(jié)果這樣會(huì)有很大的內(nèi)存浪費(fèi)。。
所以解決方法是這樣
//加一對(duì)大括號(hào)是可以讓tmp退出{}的時(shí)候自動(dòng)析構(gòu){ std::vector<int> tmp = nums; nums.swap(tmp); }
通過(guò)swap函數(shù)進(jìn)行空間轉(zhuǎn)換,然后就出去作用域vector就進(jìn)行了釋放。
在標(biāo)準(zhǔn)一點(diǎn)是這樣的:
template < class T >void ClearVector( vector< T >& vt ) { vector< T > vtTemp; veTemp.swap( vt ); }
就是通過(guò)作用域還有swqp的搭配進(jìn)行空間的釋放,然后就OK了
下面提一個(gè)小問(wèn)題:
如果vector中存放的是指針,那么當(dāng)vector銷毀時(shí),這些指針指向的對(duì)象不會(huì)被銷毀,那么內(nèi)存就不會(huì)被釋放。如下面這種情況,vector中的元素時(shí)由new操作動(dòng)態(tài)申請(qǐng)出來(lái)的對(duì)象指針:
for (vector<void *>::iterator it = v.begin(); it != v.end(); it ++) if (NULL != *it) { delete *it; *it = NULL; } v.clear();
當(dāng)時(shí)很sb的就回答成這種情況了,面壁面壁。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。