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)不會!切記!!