轉(zhuǎn)自:http://blog.163.com/guo_linda/blog/static/123773057201151033144945/
迭代器(iterator)是一個(gè)可以對(duì)其執(zhí)行類似指針的操作(如:解除引用(Operator*())和遞增(operator++()))的對(duì)象,我們可以將它理解成為一個(gè)指針。但它又不是我們所謂普通的指針,我們可以稱之為廣義指針,你可以通過(guò)sizeof(vector::iterator)來(lái)查看,所占內(nèi)存并不是4個(gè)字節(jié)。
首先對(duì)于vector而言,添加和刪除操作可能使容器的部分或者全部迭代器失效。那為什么迭代器會(huì)失效呢?vector元素在內(nèi)存中是順序存儲(chǔ),試想:如果當(dāng)前容器中已經(jīng)存在了10個(gè)元素,現(xiàn)在又要添加一個(gè)元素到容器中,但是內(nèi)存中緊跟在這10個(gè)元素后面沒(méi)有一個(gè)空閑空間,而vector的元素必須順序存儲(chǔ)一邊索引訪問(wèn),所以我們不能在內(nèi)存中隨便找個(gè)地方存儲(chǔ)這個(gè)元素。于是vector必須重新分配存儲(chǔ)空間,用來(lái)存放原來(lái)的元素以及新添加的元素:存放在舊存儲(chǔ)空間的元素被復(fù)制到新的存儲(chǔ)空間里,接著插入新的元素,最后撤銷舊的存儲(chǔ)空間。這種情況發(fā)生,一定會(huì)導(dǎo)致vector容器的所有迭代器都失效。
我們看到實(shí)現(xiàn)上述所說(shuō)的分配和撤銷內(nèi)存空間的方式以實(shí)現(xiàn)vector的自增長(zhǎng)性,效率是極其低下的。為了使vector容器實(shí)現(xiàn)快速的內(nèi)存分配,實(shí)際分配的容器會(huì)比當(dāng)前所需的空間多一些,vector容器預(yù)留了這些額外的存儲(chǔ)區(qū),用來(lái)存放新添加的元素,而不需要每次都重新分配新的存儲(chǔ)空間。你可以從vector里實(shí)現(xiàn)capacity和reserve成員可以看出這種機(jī)制。
capacity和size的區(qū)別:size是容器當(dāng)前擁有的元素個(gè)數(shù),而capacity則指容器在必須分配新存儲(chǔ)空間之前可以存儲(chǔ)的元素總數(shù)。
vector迭代器的幾種失效的情況: 1.當(dāng)插入(push_back)一個(gè)元素后,end操作返回的迭代器肯定失效。 2.當(dāng)插入(push_back)一個(gè)元素后,capacity返回值與沒(méi)有插入元素之前相比有改變,則需要重新加載整個(gè)容器,此時(shí)first和end操作返回的迭代器都會(huì)失效。 3.當(dāng)進(jìn)行刪除操作(erase,pop_back)后,指向刪除點(diǎn)的迭代器全部失效;指向刪除點(diǎn)后面的元素的迭代器也將全部失效。
deque迭代器的失效情況: 在C++PRimer一書(shū)中是這樣限定的: 1.在deque容器首部或者尾部插入元素不會(huì)使得任何迭代器失效。 2.在其首部或尾部刪除元素則只會(huì)使指向被刪除元素的迭代器失效。 3.在deque容器的任何其他位置的插入和刪除操作將使指向該容器元素的所有迭代器失效。但是:我在vs2005測(cè)試發(fā)現(xiàn)第一條都不滿足,不知為何?等以后深入STL以后慢慢的領(lǐng)會(huì)吧!
只有l(wèi)ist的迭代器好像很少情況下會(huì)失效。也許就只是在刪除的時(shí)候,指向被刪除節(jié)點(diǎn)的迭代器會(huì)失效吧,其他的還沒(méi)有發(fā)現(xiàn)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注