美文网首页
迭代器失效问题

迭代器失效问题

作者: Yankee_13 | 来源:发表于2019-04-02 16:51 被阅读0次
    先看一段代码:
    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分支

    相关文章

      网友评论

          本文标题:迭代器失效问题

          本文链接:https://www.haomeiwen.com/subject/xiwgbqtx.html