方法一:
-
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的erase方法在釋放了it後會返回指向下一個元素的指針來獲取最新的iterator
方法二:
-
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++;
-
}
-
...........
該方法中利用了後++的特點,這個時候執行mapTest.erase(it++);這條語句分爲三個過程
1、先把it的值賦值給一個臨時變量做爲傳遞給erase的參數變量
2、因爲參數處理優先於函數調用,所以接下來執行了it++操作,也就是it現在已經指向了下一個地址。
3、再調用erase函數,釋放掉第一步中保存的要刪除的it的值的臨時變量所指的位置。
如果只是mapTest.erase(it); 當這條語句執行完後,it就是一個非法指針,如果再執行++就會出錯
總結,雖然上面兩種方法達到了一個相同的效果,但是,更提倡使用第二種,第一種方法只適用於windows平臺,並不是標準庫的支持。