stl map的erase方法 注意點

2021-08-18 17:24:13 字數 1067 閱讀 2214

** 小 樓 一 夜 聽 春 雨

先宣告:下面的文章是針對windows的用法,因為std::map的erase函式的windows的實現版本是返回乙個std::map的迭代器,但是stl標準裡面的該函式的返回值確是:

map.erase有3個過載:

void erase ( iterator position );

size_type erase ( const key_type& x );

void erase ( iterator first, iterator last );

。所以下面的**中的最後乙個例子僅僅可以在windows下的map下執行。

stl的map表裡有乙個erase方法用來從乙個map中刪除掉指令的節點

eg1:

mapmaptest;

typedef map::iterator iter;

iter iter=maptest.find(key);

maptest.erase(iter);

像上面這樣只是刪除單個節點,map的形為不會出現任務問題,

但是當在乙個迴圈裡用的時候,往往會被誤用,那是因為使用者沒有正確理解iterator的概念.

像下面這樣的乙個例子就是錯誤的寫法,

eg2:

for(iter iter=maptest.begin();iter!=maptest.end();++iter)

{cout這是一種錯誤的寫法,會導致程式行為不可知.究其原因是map 是關聯容器,對於關聯容器來說,如果某乙個元素已經被刪除,那麼其對應的迭代器就失效了,不應該再被使用;否則會導致程式無定義的行為。

可以用以下方法解決這問題:

正確的寫法

1.使用刪除之前的迭代器定位下乙個元素。stl建議的使用方式

for(iter iter=maptest.begin();iter!=maptest.end();)

{cout2. erase() 成員函式返回下乙個元素的迭代器

for(iter iter=maptest.begin();iter!=maptest.end();)

{cout

正確使用stl map的erase方法

正確使用stl map的erase方法 stl的map表裡有乙個erase方法用來從乙個map中刪除掉指令的節點 eg map string string maptest typedef map string string iterator iter iter iter maptest.find k...

正確使用stl map的erase方法

先宣告 下面的文章是針對windows的用法,因為std map的erase函式的windows的實現版本是返回乙個std map的迭代器,但是stl標準裡面的該函式的返回值確是 map.erase有3個過載 void erase iterator position size type erase ...

正確使用stl map的erase方法

先宣告 下面的文章是針對windows的用法,因為std map的erase函式的windows的實現版本是返回乙個std map的迭代器,但是stl標準裡面的該函式的返回值確是 map.erase有3個過載 void erase iterator position size type erase ...