std::map 通過遍歷刪除滿足某些條件元素的兩種方式

方法一:

[cpp] view plain copy
  1. std::map<std::string, std::string > mapTest;  
  2. bool TestVal(const std::string & val);  
  3.   
  4. ......  
  5. std::map<std::string, std::string >::iterator it = mapTest.begin();  
  6. while(it != mapTest.end())  
  7. {  
  8.          if(TestVal(it->second))  
  9.          {  
  10.                  it = mapTest.erase(it);  
  11.          }  
  12.          else  
  13.                  it++;  
  14. }  
  15. ...........  
在這種方式中,通過std::map的erase方法在釋放了it後會返回指向下一個元素的指針來獲取最新的iterator


方法二:

[cpp] view plain copy
  1. std::map<std::string, std::string > mapTest;  
  2. bool TestVal(const std::string & val);  
  3.   
  4. ......  
  5. std::map<std::string, std::string >::iterator it = mapTest.begin();  
  6. while(it != mapTest.end())  
  7. {  
  8.          if(TestVal(it->second))  
  9.          {  
  10.                 mapTest.erase(it++);  
  11.          }  
  12.          else  
  13.                  it++;  
  14. }  
  15. ...........  
該方法中利用了後++的特點,這個時候執行mapTest.erase(it++);這條語句分爲三個過程

1、先把it的值賦值給一個臨時變量做爲傳遞給erase的參數變量

2、因爲參數處理優先於函數調用,所以接下來執行了it++操作,也就是it現在已經指向了下一個地址。

3、再調用erase函數,釋放掉第一步中保存的要刪除的it的值的臨時變量所指的位置。


如果只是mapTest.erase(it); 當這條語句執行完後,it就是一個非法指針,如果再執行++就會出錯


總結,雖然上面兩種方法達到了一個相同的效果,但是,更提倡使用第二種,第一種方法只適用於windows平臺,並不是標準庫的支持。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章