vector::erase():容器刪除
阿新 • • 發佈:2019-01-02
vector::erase():從指定容器刪除指定位置的元素或某段範圍內的元素
vector::erase()方法有兩種過載形式
如下:
iterator erase( iterator _Where);
1.iterator erase( iterator _First, iterator _Last);
如果是刪除指定位置的元素時:
返回值是一個迭代器,指向刪除元素下一個元素;如果是刪除某範圍內的元素時:返回值也表示一個迭代器,指向最後一個刪除元素的下一個元素;
首先我先把MSDN上的例子po上來
- // vector_erase.cpp
- // compile with: /EHsc
- #include <vector>
- #include <iostream>
- int main( )
- {
- using namespace std;
- vector <int> v1;
- vector <int>::iterator Iter;
- v1.push_back( 10 );
- v1.push_back( 20 );
- v1.push_back( 30 );
- v1.push_back( 40 );
- v1.push_back( 50 );
- cout << "v1 =" ;
- for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
- cout << " " << *Iter;
- cout << endl;
- v1.erase( v1.begin( ) );
- cout << "v1 =";
- for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
- cout << " " << *Iter;
- cout << endl;
- v1.erase( v1.begin( ) + 1, v1.begin( ) + 3 );
- cout << "v1 =";
- for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
- cout << " " << *Iter;
- cout << endl;
- }
Output
v1 = 10 20 30 40 50
v1 = 20 30 40 50
v1 = 20 50
大家可以知道,需刪除元素10只要指定該元素對應的迭代器傳給erase就OK了;
那現在如果該容器中有兩個元素10要怎麼刪除呢?
接著我做下修改,向容器中新增一新的元素10
- v1.push_back( 10 );
大多數初學者在不熟知erase的原理的時候,也會像我一樣這樣處理,
一一遍歷容器找到元素值為10,然後一一刪除
- for(Iter = v1.begin(); Iter != v1.end(); Iter++)
- {
- if(*Iter == 10)
- {
- v1.erase(Iter);
- }
- }
當試著重新build程式後執行,會出現包含有如下資訊的錯誤
_Myptr < ((_Myvec *)(this->_Mycont))->_Mylast
其他出現這種原因是沒搞懂erase的原理,當呼叫erase()後Iter迭代器就失效了,變成了一野指標。
所以要處理這種問題,關鍵是要解決呼叫erase()方法後,Iter迭代器變成野指標的問題,
這個時候呢給他賦一個新的迭代器給他。
- for(Iter = v1.begin(); Iter != v1.end(); Iter++)
- {
- if(*Iter == 10)
- {
- v1.erase(Iter);
- Iter = v1.begin(); //當erase後,舊的容器會被重新整理成一個新的容器
- }
- }
重新Iter迭代器指定下一個元素.
上面那種方法是給Iter重新賦於新v1的begin迭代器。
還有一種方法是直接賦刪除元素的下一個迭代器給Iter
實現方法的程式碼如下:
- for(Iter = v1.begin(); Iter != v1.end(); Iter++)
- {
- if(*Iter == 10)
- {
- Iter = v1.erase(Iter);//Iter為刪除元素的下一個元素的迭代器
- //即第一次這段語句後Iter 會是20,大家可以通過debug調試出來檢視下數值
- }
- if(Iter == v1.end()) //要控制迭代器不能超過整個容器
- {
- break;
- }
- }