vector::erase()函数调用出错问题
vector::erase()方法有两种重载形式
iterator erase( iterator _Where);//删除某个元素
iterator erase( iterator _First, iterator _Last);//删除一段元素,注意是个半开区间
返回值:
如果是删除指定位置的元素时,返回值是一个迭代器,指向删除元素下一个元素;如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;
如下代码:
#include "stdafx.h"
#include<iostream>
#include <vector>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
vector <int> v1;
vector <int>::iterator Iter,iter1;
v1.push_back(10);
v1.push_back(10);
v1.push_back( 20 );
v1.push_back( 30 );
v1.push_back( 40 );
v1.push_back( 10 );
for(Iter = v1.begin(); Iter != v1.end(); Iter++)
{
if(*Iter == 10)
{
v1.erase(Iter);
}
}
return 0;
}
乍一看这段代码,很正常。其实这里面隐藏着一个很严重的错误:当veci.erase(iter)之后,iter就变成了一个野指针,对一个野指针进行 iter++ 是肯定会出错的。
for循环做如下改动:
for(Iter = v1.begin(); Iter != v1.end(); Iter++)
{
if(*Iter == 10)
{
Iter = v1.erase(Iter);
}
}
代码仍然是错误的。为什么呢?????
断点单步调试发现两个问题:
(1)两个连续的10,只删掉了一个??
原因是删掉第一个10后,iter指向了第二个10的位置,然后iter++,跳过了这个10.
(2)删除最后一个10时出现问题??
原因是结尾的10删掉后,iter指向了v1.end()位置,再iter++肯定有错。
所以这种写法(1)不能删除连续的值(2)不能删除末尾的值,会报错
正确的代码应该为:
for(Iter = v1.begin(); Iter != v1.end(); )
{
if(*Iter == 10)
{
v1.erase(Iter);
}
else
Iter++;
}