个人对“失效”的定义:迭代器,指针或者引用所指向元素的内存地址位置发生变化。
根据这个理解,vector 和 string 的插入和删除操作的描述我能看懂。
deque 插入元素到头尾不影响指针和引用我也能理解,但是 deque 是向两边增长的,迭代器指向的元素原地址也不变,怎么说会失效呢?个人感觉应该是针对头尾迭代器的作用去说的,同理 deque 删除首尾元素。
list 插入和删除目标只要不是迭代器,引用,指针指向的元素本身,那应该有效。
所以说 deque 这段是怎么一回事?
1
qieqie 2022-07-28 15:41:41 +08:00
这段基本就是标准原文的翻译。
iterator 的失效和 reference 失效本来就是 2 个概念。 |
2
junmoxiao 2022-07-28 15:43:13 +08:00
其实所有的迭代器失效场景都可以概况,“只要重新分配了内存,迭代器就会失效”
你上面说的两边增长只是 deque 的逻辑结构,deque 真实的结构是图里面这样的( V2EX 传图不方便,你自己看下《 c++标准库》 283 页就知道了) |
3
AoEiuV020CN 2022-07-28 15:43:38 +08:00
迭代器是 iterator ?
感觉和具体实现会有关系,确实如你所说地址不变理论上能做到不影响 iterator ,但还是要看看 deque 源码才知道为什么影响到了, 另外这里的“失效”指的应该是“不保证所有功能有效”, 比如 iterator 可能以为不存在下一个,实际上存在,其他功能正常,这也算“失效”, |
4
junmoxiao 2022-07-28 15:46:07 +08:00
|
5
junmoxiao 2022-07-28 15:47:57 +08:00
|
6
wutiantong 2022-07-29 00:00:12 +08:00
失效英文就是 invalid 吧,意思不是说它发生什么改变了,而是说你不应该再用它了。
|