1. 程式人生 > >vector 中 erase 用法注意事項

vector 中 erase 用法注意事項

vector::erase():從指定容器刪除指定位置的元素或某段範圍內的元素
vector::erase()方法有兩種過載形式
如下:
iterator erase(   iterator _Where);
iterator erase(   iterator _First,   iterator _Last);
如果是刪除指定位置的元素時:
返回值是一個迭代器,指向刪除元素下一個元素;
如果是刪除某範圍內的元素時:返回值也表示一個迭代器,指向最後一個刪除元素的下一個元素;


看下面的程式,目的是刪除數組裡面的所有值為6的元素:

  1. #include<iostream>
  2. #include<vector>
  3. usingnamespace std;  
  4. int main()  
  5. {  
  6.     vector<int> array;  
  7.     array.push_back(1);  
  8.     array.push_back(6);  
  9.     array.push_back(3);  
  10.     array.push_back(6);  
  11.     array.push_back(6);  
  12.     array.push_back(2);  
  13.     vector<int>::iterator itor;  
  14.     vector<int>::iterator itor2;  
  15.     for(itor=array.begin();itor!=array.end();)  
  16.     {  
  17.         if(6==*itor)  
  18.         {  
  19.            itor2=itor;  
  20.            array.erase(itor2);  
  21.         }  
  22.         itor++;  
  23.     }  
  24.     itor=array.begin();  
  25.     for(itor=array.begin();itor!=array.end();)  
  26.     {  
  27.         cout<<(*itor++);  
  28.     }  
  29.     getchar();  
  30.     return 0;  
  31. }  


執行結果輸出1362,可見其中一個6並未刪除,這是迭代器的問題。
原因在於erase以後,itor已經指向下一個元素了,不應該在itor++,否則會跳過下一個元素,即連續兩個6時跳過了第二個6. 
另外,在itor2=itor時,兩個itor是一樣的,這樣做並無意義。可修改如下:

  1. vector<int>::iterator itor;  
  2. // vector<int>::iterator itor2;
  3. for(itor=array.begin();itor!=array.end();)  
  4. {  
  5.     if(6==*itor)  
  6.     {  
  7.         // itor2=itor;
  8.         array.erase(itor);  
  9.     }  
  10.     else
  11.     {  
  12.         itor++;  
  13.     }  
  14. }  


或者:

  1. vector<int>::iterator itor;  
  2. for(itor=array.begin();itor!=array.end();itor++)  
  3. {  
  4.     if(6==*itor)  
  5.     {  
  6.         array.erase(itor);  
  7.         itor--;  
  8.     }  
  9. }  

也可以使用remove方法:
array.earse( remove(array.begin(), array.end(),6),  array.end() );