vector和map的erase問題

STL map的不經意的小問題

    

這是工作中遇到的一個問題,由於對map理解的不深刻,導致bus error。乍一看,程序似乎沒有問題,我們的for 循環一直是這麼寫的,但是仔細分析一下map刪除的機制:原因是map 是關聯容器,對於關聯容器來說,如果某一個元素已經被刪除,那麼其對應的迭代器就失效了,不應該再被使用,否則會導致程序無定義的行爲。這裏it已經刪除,已經是個野指針,不能再用it++

正確的操作是mymap.erase(it++);

mymap中在刪除it的時候,先將it做緩存,然後執行it++使之指向下一個結點,再進入erase函數體中執行刪除操作,刪除時使用的it就是緩存下來的it(也就是當前it(做了加操作之後的it)所指向結點的上一個結點)

當然vector不存在這種問題,但是看下面一個小程序:

 

這段代碼將會顯示如下輸出:

BCDEFGHIJ

CDEFGHIJ

DEFGHIJ

EFGHIJ

FGHIJ

GHIJ

HIJ

IJ

J

如果for( int i=0; i < size; i++ )

改成for( it=alphaVector.begin(); it!= alphaVector.end(); it++ )

那得到的結果是

BCDEFGHIJ

CDEFGHIJ

DEFGHIJ

EFGHIJ

FGHIJ

這表明vector size是動態更新的。而且vector.erase(it) it指向刪除的最後一個元素的下一位置的迭代器,而map.erase(it)不會!切記!!

 

發佈了33 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章