总结迭代器失效的几种情况

迭代器失效一般分为三种情况(根据底层数据结构):

  1. 数组型
  2. 链表型
  3. 树型数据结构。
  4. 数组型数据结构:该数据结构的元素是分配在连续的内存中,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++,*iter

你可能感兴趣的:(C++,编程语言)