STL 容器迭代器失效总结(超级详细)
本文只总结常见的序列容器(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 容器迭代器失效总结(超级详细)相关推荐
- STL 容器迭代器失效总结
总结常见的序列容器(vector.deque.list)和关联容器(set.multiset.map.multimap)的迭代器失效问题. 原迭代器指的是进行操作之前保存的迭代器,包括begin(). ...
- STL——1、各类容器迭代器失效总结
一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist和rope:sl ...
- STL erase() 迭代器失效
STL中的容器按存储方式分为两类:序列容器(如:vector .deque.list):关联容器(如:set.map) 两种容器在使用erase方法来删除元素时或产生迭代器失效的问题 对于非顺序序列容 ...
- C++(STL):09---vector迭代器失效问题
在vector中,我们经常会使用迭代器iterator对vector中的元素进行索引,也经常需要将迭代器作为参数传递到vector的成员函数中,迭代器使用非常方便,但使用不当也会给我们带来巨大的麻烦, ...
- c++ stl 容器 迭代器 stl用法示例
1.基本概念 1.1容器概述 顺序容器 vector, deque,list 关联容器 set, multiset, map, multimap 容器适配器 stack, queue, priorit ...
- C++---STL中迭代器失效的总结
我们在使用STL底层给我们提供的一些容器的时候,当我们给一个容器中增加(insert)或删除(erase),最有可能出现迭代器失效. 什么是迭代器失效 在对容器进行操作的时候,由于一些操作,使得元素保 ...
- STL容器迭代器的理解
迭代器 迭代器模式:就是提供一种方式,不用暴露出容器内部结构,就可以通过迭代器来访问容器内部元素. 迭代器:迭代器是类模板,表现的像一个指针,一个可以对其执行类似于指针的操作(如:解引用operato ...
- C++STL 顺序容器操作总结(超级详细)
文章目录 vector vector的构造函数 vector元素访问 vector容量相关 vector修改元素 deque deque构造函数 deque元素访问 deque容量相关 deque的修 ...
- Spring Boot进阶(22):Tomcat与Undertow容器性能对比分析 | 超级详细,建议收藏
- 容器删除元素后迭代器失效_STL 4: STL之容器:选择时机,删除元素,迭代器失效...
一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist和rope.sl ...
最新文章
- 第四章 治病法要(1)
- sql server数据库还原方法
- 作者:刘阳(1988-),男,军事医学科学院放射与辐射医学研究所博士生
- C#中的引用传递、值传递
- YAML_01 YAML语法和playbook写法
- python类的应用_如何剖析python应用程序的类方法?
- HBuilderX里面创建项目时没有模板解决方案
- 40-42-网络层ARP协议,ARP欺骗,网络执法官和arp防火墙
- UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xff in position 0: illegal multibyte sequence
- clion_gcc报错
- 微信三方平台调试过程中遇到的问题
- div完成田字格布局
- t480 拆触摸板_ThinkPad T480 触摸板怎么用?
- iPhone破解相关知识
- 【Altium Designer21】DRC规则检查、错误、设置简析
- KeyError(‘metric mAP is not supported‘.format(metric))
- CentOS 7.8 (2003) 发布,附下载地址
- mscs和mcs的区别_关于2020Fall美研选校,UIUC MCS vs NYU MSCS Courant 该去哪个?
- Keepalived+LVS-DR模式配置高可用负载均衡集群
- 网站app注册登录短信验证码是怎么获取实现的