先聲明:下面的文章是針對windows的用法,由於std::map的erase函數的windows的實現版本是返回一個std::map的迭代器,可是STL標準裏面的該函數的返回值確是: windows
map.erase有3個重載: 函數
void erase ( iterator position ); size_type erase ( const key_type& x ); void erase ( iterator first, iterator last );
因此下面的代碼中的最後一個例子僅僅能夠在windows下的map下運行。 spa
STL的map表裏有一個erase方法用來從一個map中刪除掉指令的節點
eg1: code
map<string,string> mapTest; typedef map<string,string>::iterator ITER; ITER iter=mapTest.find(key); mapTest.erase(iter);
像上面這樣只是刪除單個節點,map的形爲不會出現任務問題,
可是當在一個循環裏用的時候,每每會被誤用,那是由於使用者沒有正確理解iterator的概念.
像下面這樣的一個例子就是錯誤的寫法,
eg2: string
for(ITER iter=mapTest.begin();iter!=mapTest.end();++iter) { cout<<iter->first<<":"<<iter->second<<endl; mapTest.erase(iter); }
這是一種錯誤的寫法,會致使程序行爲不可知.究其緣由是map 是關聯容器,對於關聯容器來講,若是某一個元素已經被刪除,那麼其對應的迭代器就失效了,不該該再被使用;不然會致使程序無定義的行爲。
能夠用如下方法解決這問題:
正確的寫法
1.使用刪除以前的迭代器定位下一個元素。STL建議的使用方式 it
for(ITER iter=mapTest.begin();iter!=mapTest.end();) { cout<<iter->first<<":"<<iter->second<<endl; mapTest.erase(iter++); }
2. erase() 成員函數返回下一個元素的迭代器 io
for(ITER iter=mapTest.begin();iter!=mapTest.end();) { cout<<iter->first<<":"<<iter->second<<endl; iter=mapTest.erase(iter); }