1. 程式人生 > >vector::erase() vector中如何刪除元素?

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() + 1v1.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;

  } 

}