1. 程式人生 > >vector::erase():容器刪除

vector::erase():容器刪除

vector::erase():從指定容器刪除指定位置的元素或某段範圍內的元素

vector::erase()方法有兩種過載形式

如下:

iterator erase(   iterator _Where);

1.iterator erase(   iterator _First,   iterator _Last);

如果是刪除指定位置的元素時:
返回值是一個迭代器,指向刪除元素下一個元素;如果是刪除某範圍內的元素時:返回值也表示一個迭代器,指向最後一個刪除元素的下一個元素;

首先我先把MSDN上的例子po上來

  1. // vector_erase.cpp
  2. // compile with: /EHsc
  3. #include <vector> 
  4. #include <iostream> 
  5. int main( ) 
  6. using namespace std;  
  7. vector <int> v1;
  8. vector <int>::iterator Iter;
  9. v1.push_back( 10 );
  10. v1.push_back( 20 );
  11. v1.push_back( 30 );
  12. v1.push_back( 40 );
  13. v1.push_back( 50 );
  14. cout << "v1 =" ;
  15. for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ ) 
  16.   cout << " " << *Iter;
  17. cout << endl;
  18. v1.erase( v1.begin( ) );
  19. cout << "v1 =";
  20. for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ ) 
  21.   cout << " " << *Iter;
  22. cout << endl;
  23. v1.erase( v1.begin( ) + 1, v1.begin( ) + 3 );
  24. cout << "v1 =";
  25. for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ ) 
  26.   cout << " " << *Iter;
  27. cout << endl;
  28. }

Output
v1 = 10 20 30 40 50

v1 = 20 30 40 50
v1 = 20 50

大家可以知道,需刪除元素10只要指定該元素對應的迭代器傳給erase就OK了;

那現在如果該容器中有兩個元素10要怎麼刪除呢?

接著我做下修改,向容器中新增一新的元素10

  1. v1.push_back( 10 );

大多數初學者在不熟知erase的原理的時候,也會像我一樣這樣處理,
一一遍歷容器找到元素值為10,然後一一刪除

  1. for(Iter = v1.begin(); Iter != v1.end(); Iter++) 
  2.   if(*Iter == 10) 
  3.   { 
  4.       v1.erase(Iter);
  5.   } 
  6. }

當試著重新build程式後執行,會出現包含有如下資訊的錯誤

_Myptr < ((_Myvec *)(this->_Mycont))->_Mylast

其他出現這種原因是沒搞懂erase的原理,當呼叫erase()後Iter迭代器就失效了,變成了一野指標。

所以要處理這種問題,關鍵是要解決呼叫erase()方法後,Iter迭代器變成野指標的問題,

這個時候呢給他賦一個新的迭代器給他。

  1. for(Iter = v1.begin(); Iter != v1.end(); Iter++) 
  2.   if(*Iter == 10) 
  3.   { 
  4.       v1.erase(Iter);
  5.      Iter = v1.begin(); //當erase後,舊的容器會被重新整理成一個新的容器
  6.   } 
  7. }

重新Iter迭代器指定下一個元素.

上面那種方法是給Iter重新賦於新v1的begin迭代器。

還有一種方法是直接賦刪除元素的下一個迭代器給Iter

實現方法的程式碼如下:

  1. for(Iter = v1.begin(); Iter != v1.end(); Iter++) 
  2.   if(*Iter == 10) 
  3.   { 
  4.    Iter = v1.erase(Iter);//Iter為刪除元素的下一個元素的迭代器
  5.   //即第一次這段語句後Iter 會是20,大家可以通過debug調試出來檢視下數值
  6.   } 
  7.   if(Iter == v1.end()) //要控制迭代器不能超過整個容器
  8.   { 
  9.    break;
  10.   } 
  11. }