本文只总结常见的序列容器(vector、deque、list)和关联容器(set、multiset、map、multimap)的迭代器失效问题。

原迭代器指的是进行操作之前保存的迭代器,包括begin()、end()以及其他位置的迭代器。

vector:

成员函数push_back():会在容器末尾添加一个元素。如果容器有剩余空间(capacity() > size()),则直接添加新元素到容器尾部。此时,原迭代器中end()会失效,其他的都不会失效。否则,会导致容器重新分配内存,然后将数据从原内存复制到新内存,再在尾部添加新元素。此时,由于内存重新分配,原迭代器(所有)都失效

成员函数pop_back():直接将容器中的最后一个元素删除,原迭代器中end()会失效,其余的都不会失效

成员函数insert(iterator, n):如果容器有剩余空间,先在容器尾部插入一个元素,然后将插入点及之后的元素都向后移动一位,然后在插入点创建新元素。否则,会导致容器重新分配内存,接着将插入点之前的元素复制过去,在插入点创建新元素,再将插入点之后的元素复制过去。因此,如果没有内存的重新分配,原迭代器中插入点及插入点之后的迭代器(包括end())都失效。如果有内存的重新分配,原迭代器(所有)都失效

成员函数erase(iterator):将删除点及之后的元素都向前移动一位,然后删除最后一个元素。因此,原迭代器中删除点之前的迭代器都有效,插入点及插入点之后的迭代器都失效。

deque:

成员函数push_back():会直接在容器末尾添加一个元素。原迭代器中end()会失效,其他的都不会失效

成员函数push_front():会直接在容器头部添加一个元素。原迭代器中begin()会失效,其他的都不会失效

成员函数pop_back():会直接删除最后一个元素。原迭代器中end()会失效,其他的都不会失效

成员函数pop_front():会直接在容器头部删除一个元素。原迭代器中begin()会失效,其他的都不会失效

成员函数insert(iterator, n):如果插入点之前的元素较少,会在容器头部插入一个元素,然后将插入点及其之前的所有元素向前移动一位,再在插入点创建新元素。否则,将插入点及其之后的元素向后移动一位,再在插入点创建新元素。因此,向前移动则导致原迭代器中插入点及插入点之前的迭代器都失效;向后移动则导致迭代器中插入点及插入点之后的迭代器都失效

成员函数erase(iterator):如果删除点之前的元素较少,将删除点之前的所有元素向后移动一位,再删除第一个元素。否则,将删除点之后的所有元素向前移动一位,再删除最后一个元素。因此,向前移动将导致原迭代器中删除点及删除点之后的迭代器失效;向后移动将导致原迭代器中删除点及删除点之前的迭代器都失效

list:

因为list的底层结构是双向链表,所有操作都只是针对节点移动指针,不会涉及到位置变化,操作影响的范围很小。

成员函数push_back()原迭代器中end()会失效,其他的都不会失效

成员函数push_front()原迭代器中begin()会失效,其他的都不会失效

成员函数pop_back()原迭代器中end()会失效,其他的都不会失效

成员函数pop_front()原迭代器中begin()会失效,其他的都不会失效

成员函数insert(iterator, n)原迭代器中插入点会失效,其他的都不会失效

成员函数erase(iterator)原迭代器中删除点会失效,其他的都不会失效

set、multiset、map、multimap

关联容器的底层结构为红黑树,所有操作同list一样,都只是移动指针,各成员函数导致的迭代器失效问题同list。

注意:文中成员函数的内部实现以SGI STL为准。

STL 容器迭代器失效总结(超级详细)相关推荐

  1. STL 容器迭代器失效总结

    总结常见的序列容器(vector.deque.list)和关联容器(set.multiset.map.multimap)的迭代器失效问题. 原迭代器指的是进行操作之前保存的迭代器,包括begin(). ...

  2. STL——1、各类容器迭代器失效总结

    一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist和rope:sl ...

  3. STL erase() 迭代器失效

    STL中的容器按存储方式分为两类:序列容器(如:vector .deque.list):关联容器(如:set.map) 两种容器在使用erase方法来删除元素时或产生迭代器失效的问题 对于非顺序序列容 ...

  4. C++(STL):09---vector迭代器失效问题

    在vector中,我们经常会使用迭代器iterator对vector中的元素进行索引,也经常需要将迭代器作为参数传递到vector的成员函数中,迭代器使用非常方便,但使用不当也会给我们带来巨大的麻烦, ...

  5. c++ stl 容器 迭代器 stl用法示例

    1.基本概念 1.1容器概述 顺序容器 vector, deque,list 关联容器 set, multiset, map, multimap 容器适配器 stack, queue, priorit ...

  6. C++---STL中迭代器失效的总结

    我们在使用STL底层给我们提供的一些容器的时候,当我们给一个容器中增加(insert)或删除(erase),最有可能出现迭代器失效. 什么是迭代器失效 在对容器进行操作的时候,由于一些操作,使得元素保 ...

  7. STL容器迭代器的理解

    迭代器 迭代器模式:就是提供一种方式,不用暴露出容器内部结构,就可以通过迭代器来访问容器内部元素. 迭代器:迭代器是类模板,表现的像一个指针,一个可以对其执行类似于指针的操作(如:解引用operato ...

  8. C++STL 顺序容器操作总结(超级详细)

    文章目录 vector vector的构造函数 vector元素访问 vector容量相关 vector修改元素 deque deque构造函数 deque元素访问 deque容量相关 deque的修 ...

  9. Spring Boot进阶(22):Tomcat与Undertow容器性能对比分析 | 超级详细,建议收藏

  10. 容器删除元素后迭代器失效_STL 4: STL之容器:选择时机,删除元素,迭代器失效...

    一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist和rope.sl ...

最新文章

  1. 第四章 治病法要(1)
  2. sql server数据库还原方法
  3. 作者:刘阳(1988-),男,军事医学科学院放射与辐射医学研究所博士生
  4. C#中的引用传递、值传递
  5. YAML_01 YAML语法和playbook写法
  6. python类的应用_如何剖析python应用程序的类方法?
  7. HBuilderX里面创建项目时没有模板解决方案
  8. 40-42-网络层ARP协议,ARP欺骗,网络执法官和arp防火墙
  9. UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xff in position 0: illegal multibyte sequence
  10. clion_gcc报错
  11. 微信三方平台调试过程中遇到的问题
  12. div完成田字格布局
  13. t480 拆触摸板_ThinkPad T480 触摸板怎么用?
  14. iPhone破解相关知识
  15. 【Altium Designer21】DRC规则检查、错误、设置简析
  16. KeyError(‘metric mAP is not supported‘.format(metric))
  17. CentOS 7.8 (2003) 发布,附下载地址
  18. mscs和mcs的区别_关于2020Fall美研选校,UIUC MCS vs NYU MSCS Courant 该去哪个?
  19. Keepalived+LVS-DR模式配置高可用负载均衡集群
  20. 网站app注册登录短信验证码是怎么获取实现的

热门文章

  1. 查看各浏览器各版本的兼容情况
  2. 基于WCF的RESTFul WebAPI如何对传输内容实现压缩
  3. Android Java类编写规范+优化建议
  4. 代码阅读工具-global
  5. 多区域OSPF基本配置
  6. 6.企业应用架构模式 --- 会话状态
  7. 156.PHP多进程
  8. html5中的web worker的用法
  9. 修炼成QTP高手的十个步骤
  10. 【Codeforces 404C】Restore Graph