方法一:
- std::map<std::string, std::string > mapTest;
- bool TestVal(const std::string & val);
- ......
- std::map<std::string, std::string >::iterator it = mapTest.begin();
- while(it != mapTest.end())
- {
- if(TestVal(it->second))
- {
- it = mapTest.erase(it);
- }
- else
- it++;
- }
- ...........
方法二:
- std::map<std::string, std::string > mapTest;
- bool TestVal(const std::string & val);
- ......
- std::map<std::string, std::string >::iterator it = mapTest.begin();
- while(it != mapTest.end())
- {
- if(TestVal(it->second))
- {
- mapTest.erase(it++);
- }
- else
- it++;
- }
- ...........
1、先把it的值賦值給一個臨時變量做爲傳遞給erase的參數變量
2、因爲參數處理優先於函數調用,所以接下來執行了it++操作,也就是it現在已經指向了下一個地址。
3、再調用erase函數,釋放掉第一步中保存的要刪除的it的值的臨時變量所指的位置。
如果只是mapTest.erase(it); 當這條語句執行完後,it就是一個非法指針,如果再執行++就會出錯
總結,對於iter的移動在對erase時需要注意。
STL中的容器按存儲方式分爲兩類,一類是按以數組形式存儲的容器(如:vector 、deque);另一類是以不連續的節點形式存儲的容器(如:list、set、map)。在使用erase方法來刪除元素時,需要注意一些問題。
在使用 list、set 或 map遍歷刪除某些元素時可以這樣使用:
或
下面是兩個錯誤的使用方法:
或
正確使用方法1:通過erase方法的返回值來獲取下一個元素的位置
正確使用方法2:在調用erase方法之前先使用 “++”來獲取下一個元素的位置
錯誤使用方法1:在調用erase方法之後使用“++”來獲取下一個元素的位置,由於在調用erase方法以後,該元素的位置已經被刪除,如果在根據這個舊的位置來獲取下一個位置,則會出現異常。
錯誤使用方法2:同上。
這裏“++”運算符與我們平常的理解剛好相反,erase( itList++) 是先獲取下一個元素的位置在刪除; erase( ++itList) 是刪除以後再獲取下一個元素的位置。
在使用 vector、deque遍歷刪除元素時,也可以通過erase的返回值來獲取下一個元素的位置:
注意:vector、deque 不能像上面的“正確使用方法2”的辦法來遍歷刪除。