迭代器失效问题

先看一段代码:
int main()
{
    int my[]={1,2,3,4,5,6,7,8,9,10};

    vector vect(my,my+10);
    vector::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 vect(my,my+10);
    vector::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分支

你可能感兴趣的:(迭代器失效问题)