vector::erase() vector中如何刪除元素?
vector::erase():從指定容器刪除指定位置的元素或某段範圍內的元素
vector::erase()方法有兩種過載形式
如下:
1、iterator erase(iterator _Where);
v1.erase( v1.begin( ) );//刪除v1中的第一個元素
vec.erase(vec.begin()+2);刪除第3個元素
2、iterator erase(iterator _First,iterator _Last);
//刪除v1.begin() + 1和v1.begin() + 2兩個元素
v1.erase(v1.begin() + 1, v1.begin() + 3);
vec.erase(vec.begin()+i,vec.begin()+j);刪除區間[i,j-1];區間從0開始
插入元素:vec.insert(vec.begin()+i,a);在第i+1個元素前面插入a;
如果是刪除指定位置的元素時:
返回值是一個迭代器,指向刪除元素下一個元素;如果是刪除某範圍內的元素時:返回值也表示一個迭代器,指向最後一個刪除元素的下一個元素;
#include "stdafx.h" #include <cv.h> #include <vector> #include <iostream> using namespace std; 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());//刪除v1的第一個元素 cout << "v1 ="; for(Iter = v1.begin(); Iter != v1.end(); Iter++) cout << " " << *Iter; cout << endl; //刪除v1.begin() + 1和v1.begin() + 2兩個元素 v1.erase(v1.begin() + 1, v1.begin() + 3); cout << "v1 ="; for(Iter = v1.begin(); Iter != v1.end(); Iter++) cout << " " << *Iter; cout << endl; }
v1.erase( v1.begin( ) );//刪除v1中的第一個元素
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;
}
}