C++迭代器失效

今个试了下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 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::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++迭代器失效)