C++ Primer 9.3.6 迭代器 deque 这段是不是有点没讲清楚?

2022-07-28 15:19:49 +08:00
 tracker647

个人对“失效”的定义:迭代器,指针或者引用所指向元素的内存地址位置发生变化。

根据这个理解,vector 和 string 的插入和删除操作的描述我能看懂。

deque 插入元素到头尾不影响指针和引用我也能理解,但是 deque 是向两边增长的,迭代器指向的元素原地址也不变,怎么说会失效呢?个人感觉应该是针对头尾迭代器的作用去说的,同理 deque 删除首尾元素。

list 插入和删除目标只要不是迭代器,引用,指针指向的元素本身,那应该有效。

所以说 deque 这段是怎么一回事?

1424 次点击
所在节点    C++
6 条回复
qieqie
2022-07-28 15:41:41 +08:00
这段基本就是标准原文的翻译。
iterator 的失效和 reference 失效本来就是 2 个概念。
junmoxiao
2022-07-28 15:43:13 +08:00
其实所有的迭代器失效场景都可以概况,“只要重新分配了内存,迭代器就会失效”

你上面说的两边增长只是 deque 的逻辑结构,deque 真实的结构是图里面这样的( V2EX 传图不方便,你自己看下《 c++标准库》 283 页就知道了)
AoEiuV020CN
2022-07-28 15:43:38 +08:00
迭代器是 iterator ?
感觉和具体实现会有关系,确实如你所说地址不变理论上能做到不影响 iterator ,但还是要看看 deque 源码才知道为什么影响到了,
另外这里的“失效”指的应该是“不保证所有功能有效”, 比如 iterator 可能以为不存在下一个,实际上存在,其他功能正常,这也算“失效”,
junmoxiao
2022-07-28 15:46:07 +08:00
junmoxiao
2022-07-28 15:47:57 +08:00
![image]( )
wutiantong
2022-07-29 00:00:12 +08:00
失效英文就是 invalid 吧,意思不是说它发生什么改变了,而是说你不应该再用它了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/869252

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX