以前使用vector容器一直有個(gè)誤區(qū)=。=,然后最近面試被鄙視了QWQ
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括西烏珠穆沁網(wǎng)站建設(shè)、西烏珠穆沁網(wǎng)站制作、西烏珠穆沁網(wǎng)頁制作以及西烏珠穆沁網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,西烏珠穆沁網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到西烏珠穆沁省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
先說一下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)在說一下關(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)以后就無法進(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::vectortmp = nums; nums.swap(tmp); }
通過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 ); }
就是通過作用域還有swqp的搭配進(jìn)行空間的釋放,然后就OK了
下面提一個(gè)小問題:
如果vector中存放的是指針,那么當(dāng)vector銷毀時(shí),這些指針指向的對(duì)象不會(huì)被銷毀,那么內(nèi)存就不會(huì)被釋放。如下面這種情況,vector中的元素時(shí)由new操作動(dòng)態(tài)申請(qǐng)出來的對(duì)象指針:
for (vector::iterator it = v.begin(); it != v.end(); it ++) if (NULL != *it) { delete *it; *it = NULL; } v.clear();
當(dāng)時(shí)很sb的就回答成這種情況了,面壁面壁。