vector 中删除元素的方法是:b.erase(it); //b是vector, it 是 vector::iterator
但是删除vector 中的元素有些诡异(^_^),稍不注意,就会出错。
下面先给出基本vector ,如下代码,然后我们来删除为3的元素。
#include
#include
#include
#include
using namespace std;
int main()
{
int a[7] = {1,2,3,3,4,5,3};
//通过数组a的地址初始化,注意地址是从0到5(左闭右开区间)
vector b(a, a 7);
vector::iterator it;
for(it = b.begin(); it != b.end(); it )
{
cout << *it << "\t" ;
}
cout << "\n" << endl ;
}
第一个代码如下,这个是错误的:
for(it=b.begin(); it!=b.end(); it )
{
if( *it == 3)
b.erase(it);
}
乍一看这段代码,很正常。其实这里面隐藏着一个很严重的错误:当b.erase(it)之后,it就变成了一个野指针,对一个野指针进行 it 是肯定会出错的。 运行时报异常。
查看msdn,对于erase的返回值是这样描述的:an iterator that designates the first element remaining beyond any elements removed, or a pointer to the end of the vector if no such element exists,于是改代码:
for( it=b.begin(); it!=b.end(); it )
{
if( *it== 3)
it= b.erase(it);
}
这段代码也是错误的:1)无法删除两个连续的"3"; 2)当3位于vector最后位置的时候,也会出错(在veci.end()上执行 操作)
正确的代码应该为:
for( it=b.begin(); it!=b.end();)
{
if( *it== 3)
it= b.erase(it);
else
it ;
}
在后面添加
for(it = b.begin(); it != b.end(); it )
{
cout << *it << "\t" ;
}
cout << "\n" << endl ;
核实我们实现了预期。 1 2 4 5
下面用另一个代码方式实现,这也是正确的代码:
for(int i=0;i
这2个代码的关键是去掉it 或者 i , 这个在代码循环里不删除元素时才运行,都在else 里面。