先看一段代码:
int main()
{
int my[]={1,2,3,4,5,6,7,8,9,10};
vector<int> vect(my,my+10);
vector<int>::iterator iter = vect.begin();
for(; iter != vect.end(); iter++ )
{
if( *iter % 2 == 0 )
{
vect.erase(iter);
}
}
return 0;
}
乍一看好像没什么问题,但是这段代码是错误的。
iter是指向vector这个容器中的某个元素,如果不是在for、while循环中,erase删除元素是没有问题的,但是如果在for、while循环中对容器迭代,删除其中符合条件的所有元素,就可能出现问题。vect.erase(iter)之后,iter及其后面的迭代器已经失效了,不应该再使用这些迭代器了,再执行it++,其行为是未定义的。其它容器也会遇到迭代器失效的问题。
正确的代码书写:
int main()
{
int my[]={1,2,3,4,5,6,7,8,9,10};
vector<int> vect(my,my+10);
vector<int>::iterator iter = vect.begin();
for(; iter != vect.end(); )
{
if( *iter % 2 == 0 )
{
iter = vect.erase(iter);
}
else
{
iter++;
}
}
代码解析:
erase以后,iter就会跳过当前指针,进入下一个指针,需要定义iter等于该指针,但是由于这时候跳入了下一指针,因此如果再判断*iter %2==0时,就无法处理连续两个满足该条件的数,因此将iter++移入else分支
网友评论