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

首頁 > 學院 > 開發設計 > 正文

迭代器失效小結

2019-11-11 01:41:08
字體:
來源:轉載
供稿:網友

轉自:http://blog.163.com/guo_linda/blog/static/123773057201151033144945/

迭代器(iterator)是一個可以對其執行類似指針的操作(如:解除引用(Operator*())和遞增(operator++()))的對象,我們可以將它理解成為一個指針。但它又不是我們所謂普通的指針,我們可以稱之為廣義指針,你可以通過sizeof(vector::iterator)來查看,所占內存并不是4個字節。

    首先對于vector而言,添加和刪除操作可能使容器的部分或者全部迭代器失效。那為什么迭代器會失效呢?vector元素在內存中是順序存儲,試想:如果當前容器中已經存在了10個元素,現在又要添加一個元素到容器中,但是內存中緊跟在這10個元素后面沒有一個空閑空間,而vector的元素必須順序存儲一邊索引訪問,所以我們不能在內存中隨便找個地方存儲這個元素。于是vector必須重新分配存儲空間,用來存放原來的元素以及新添加的元素:存放在舊存儲空間的元素被復制到新的存儲空間里,接著插入新的元素,最后撤銷舊的存儲空間。這種情況發生,一定會導致vector容器的所有迭代器都失效。

我們看到實現上述所說的分配和撤銷內存空間的方式以實現vector的自增長性,效率是極其低下的。為了使vector容器實現快速的內存分配,實際分配的容器會比當前所需的空間多一些,vector容器預留了這些額外的存儲區,用來存放新添加的元素,而不需要每次都重新分配新的存儲空間。你可以從vector里實現capacity和reserve成員可以看出這種機制。

    capacity和size的區別:size是容器當前擁有的元素個數,而capacity則指容器在必須分配新存儲空間之前可以存儲的元素總數。

    vector迭代器的幾種失效的情況: 1.當插入(push_back)一個元素后,end操作返回的迭代器肯定失效。 2.當插入(push_back)一個元素后,capacity返回值與沒有插入元素之前相比有改變,則需要重新加載整個容器,此時first和end操作返回的迭代器都會失效。 3.當進行刪除操作(erase,pop_back)后,指向刪除點的迭代器全部失效;指向刪除點后面的元素的迭代器也將全部失效。

    deque迭代器的失效情況: 在C++PRimer一書中是這樣限定的: 1.在deque容器首部或者尾部插入元素不會使得任何迭代器失效。 2.在其首部或尾部刪除元素則只會使指向被刪除元素的迭代器失效。 3.在deque容器的任何其他位置的插入和刪除操作將使指向該容器元素的所有迭代器失效。但是:我在vs2005測試發現第一條都不滿足,不知為何?等以后深入STL以后慢慢的領會吧!

    只有list的迭代器好像很少情況下會失效。也許就只是在刪除的時候,指向被刪除節點的迭代器會失效吧,其他的還沒有發現。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 盘山县| 汪清县| 陆河县| 吉首市| 阿克陶县| 丰原市| 吴堡县| 巫溪县| 木兰县| 安乡县| 东乡族自治县| 芷江| 珲春市| 伊川县| 曲阜市| 柘城县| 定南县| 武夷山市| 隆子县| 盘山县| 嵩明县| 商城县| 鲁甸县| 阳春市| 麻栗坡县| 慈利县| 上犹县| 萍乡市| 津市市| 湟源县| 浙江省| 宁津县| 茌平县| 河间市| 永昌县| 饶河县| 莒南县| 新闻| 凤山县| 海盐县| 志丹县|