国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

迭代器失效小結(jié)

2019-11-11 02:15:36
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

轉(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)。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 平安县| 永春县| 嘉峪关市| 称多县| 阳信县| 盐源县| 漯河市| 边坝县| 深州市| 子洲县| 镇远县| 迁安市| 昌平区| 嘉善县| 辉南县| 谢通门县| 青神县| 嘉义县| 休宁县| 三明市| 丰原市| 康保县| 文昌市| 廉江市| 河北区| 琼中| 德兴市| 中山市| 太和县| 昌吉市| 库伦旗| 莱芜市| 深州市| 上虞市| 泸水县| 石渠县| 吉林省| 商丘市| 宁安市| 霸州市| 中方县|