1. 程式人生 > 其它 >std::vevtor與std::map通過erase刪除元素

std::vevtor與std::map通過erase刪除元素

轉載: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