美文网首页
C++迭代器失效

C++迭代器失效

作者: ULis | 来源:发表于2020-03-08 14:37 被阅读0次

    今个试了下vector的插入和删除操作:

    C++提供的函数

    vector插入和删除
    push_back(ele); --尾部插入元素ele
    pop_back(); --删除最后一个元素
    insert(const_iterator pos, ele); --迭代器指向位置pos插入元素ele
    insert(const_iterator pos, int count, ele); -- 迭代器指向位置pos插入count个元素ele
    erase(const_iterator pos); --删除迭代器指向的元素
    erase(const_iterator start, const_iterator end);-- 删除迭代器从start到end之间的元素
    clear(); --删除容器中所有元素

    使用insert()出现异常的代码

        vector<int> v;
    
        //尾插法
        v.push_back(10);
        v.push_back(20);
        v.push_back(30);
        v.push_back(40);
        v.push_back(50);
    
        disp(v);
    
        //尾删法
        v.pop_back();
        disp(v);
    
        //插入函数
        vector<int>::iterator it = v.begin();
        v.insert(it++, 10000);
        //++it;
        cout << *it << endl;
        disp(v);
    

    运行

    运行时异常

    然而如若注掉insert()、直接输出这个解出来的迭代器却不会发生异常,且这个异常的提示显示的是nullptr,说明我定义的这个迭代器已经失效了,这个指针运行完insert就被置空了。

    一脸蒙蔽,Google、问大佬,一顿操作之后:
    才知道,迭代器也会失效,因为我在进行insert之后,这个序列式容器已经发生了改变,对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除****插入等改变当前的iterator会使后面所有元素的iterator失效,这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。所以不能使用insert(++it,10000)的方式

    总结:迭代器失效分三种情况考虑,也是非三种数据结构考虑,分别为数组型,链表型,树型数据结构。

    数组型数据结构:该数据结构的元素是分配在连续的内存中,insert和erase操作,都会使得删除点和插入点之后的元素挪位置,所以,插入点和删除掉之后的迭代器全部失效,也就是说insert(iter)(或erase(iter)),然后在iter++,是没有意义的。解决方法:erase(*iter)的返回值是下一个有效迭代器的值。 iter =cont.erase(iter);

    链表型数据结构:对于list型的数据结构,使用了不连续分配的内存,删除运算使指向删除位置的迭代器失效,但是不会失效其他迭代器.解决办法两种,erase(*iter)会返回下一个有效迭代器的值,或者erase(iter++).

    树形数据结构: 使用红黑树来存储数据,插入不会使得任何迭代器失效;删除运算使指向删除位置的迭代器失效,但是不会失效其他迭代器.erase迭代器只是被删元素的迭代器失效,但是返回值为void,所以要采用erase(iter++)的方式删除迭代器。
    注意:经过erase(iter)之后的迭代器完全失效,该迭代器iter不能参与任何运算,包括iter++,*ite

    总结部分引用了csdn一篇文章:https://blog.csdn.net/lujiandong1/article/details/49872763

    相关文章

      网友评论

          本文标题:C++迭代器失效

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