std::vevtor與std::map通過erase刪除元素
阿新 • • 發佈:2021-07-16
轉載:https://blog.csdn.net/jaylong35/article/details/6920678
方法一:
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平臺,並不是標準庫的支援。
————————————————
版權宣告:本文為CSDN博主「jaylong35」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/jaylong35/article/details/6920678