日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

std::vector中的陷阱

 oskycar 2014-11-20

自從上次經(jīng)歷了sort的死循環(huán)之后,讓我覺(jué)得有必要重新審視一下STL的容器。vector是STL中最普通的一個(gè)容器,也是用的最多的一個(gè)容器。當(dāng)我閱讀vector的源碼后,還是發(fā)現(xiàn)有很多陷阱,這些陷阱稍不留神也許就會(huì)讓你的程序死的很難看。

 

一.增加元素時(shí)的陷阱

vector中常用的增加元素的方法是pushBack和insert。大家先看看這樣一段程序:

 

int _tmain(int argc, _TCHAR* argv[])
{
 std::vector<int> vec;
 vec.push_back(0);

 std::vector<int>::iterator iter1 = vec.begin();
 vec.push_back(1);

 int n = *iter1;

 

 return 0;
}

 

n會(huì)等于多少?有人很容易就說(shuō)肯定是0了。大家把這段程序運(yùn)行一下就會(huì)發(fā)現(xiàn),程序執(zhí)行到倒數(shù)第二行就崩潰了。為什么會(huì)崩潰?原因當(dāng)然是iter1迭代器失效了。那為什么又會(huì)失效呢?這就要好好說(shuō)一下了。首先得從vector的空間配置方式說(shuō)起。我們都知道vector是動(dòng)態(tài)分配內(nèi)存空間,很多人認(rèn)為vector的空間是隨著元素的增多,空間就進(jìn)行線性,連續(xù)的增長(zhǎng)。但是卻相反,vector并不是在原空間之后連續(xù)新空間,因?yàn)闊o(wú)法保證原空間之后尚有可供配置的空間,而是以原大小的兩倍另外配置一塊較大的空間,然后將原內(nèi)容拷貝過(guò)來(lái),然后才開(kāi)始在原內(nèi)容之后構(gòu)造新元素,并釋放原空間。因此,對(duì)vector的任何操作,一旦引起空間重新配置,指向原vector的所有迭代器就失效了。

看上面那段程序,首先構(gòu)造了一個(gè)空的vector,然后加了一個(gè)元素進(jìn)去。此時(shí)容器的容量是1,此時(shí)如果再增加元素,就會(huì)另外配置一塊較大的空間。當(dāng)vector的元素大小為1,2,4,8,2的n次方時(shí),再增加元素都會(huì)另外開(kāi)辟空間。這時(shí)候之前容器所有的迭代器將會(huì)失效。

 

二.刪除元素時(shí)的陷阱

先看下面這段程序:

int _tmain(int argc, _TCHAR* argv[])
{
 std::vector<int> vec;
 vec.push_back(0);
 vec.push_back(1);
 vec.push_back(2);

 std::vector<int>::iterator iter1 = vec.begin()+2;

 vec.erase(vec.begin()+1);

 int n = *iter1;

 return 0;
}

會(huì)出現(xiàn)什么問(wèn)題?和上個(gè)程序一樣,崩潰。原因也很簡(jiǎn)單,vector刪除元素后會(huì)讓該元素后面所有的迭代器都失效。

 

三.讀取元素時(shí)的陷阱

vector中最恐怖的就是越界了,當(dāng)我們每次讀取元素時(shí)都要檢查是否超過(guò)該vector的size。另外當(dāng)我們調(diào)用front和back函數(shù)時(shí),必須檢查容器是否為空,否則也會(huì)崩潰。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多