正確使用stl map的erase方法

先聲明:下面的文章是針對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);
}
相關文章
相關標籤/搜索