V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tracker647
V2EX  ›  C++

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

  •  
  •   tracker647 · 2022-07-28 15:19:49 +08:00 · 1412 次点击
    这是一个创建于 630 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    aa76427e1b3fac6be6d7e8e8ebc403f

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

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

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

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

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

    你上面说的两边增长只是 deque 的逻辑结构,deque 真实的结构是图里面这样的( V2EX 传图不方便,你自己看下《 c++标准库》 283 页就知道了)
    AoEiuV020CN
        3
    AoEiuV020CN  
       2022-07-28 15:43:38 +08:00
    迭代器是 iterator ?
    感觉和具体实现会有关系,确实如你所说地址不变理论上能做到不影响 iterator ,但还是要看看 deque 源码才知道为什么影响到了,
    另外这里的“失效”指的应该是“不保证所有功能有效”, 比如 iterator 可能以为不存在下一个,实际上存在,其他功能正常,这也算“失效”,
    junmoxiao
        4
    junmoxiao  
       2022-07-28 15:46:07 +08:00
    junmoxiao
        5
    junmoxiao  
       2022-07-28 15:47:57 +08:00
    ![image]( )
    wutiantong
        6
    wutiantong  
       2022-07-29 00:00:12 +08:00
    失效英文就是 invalid 吧,意思不是说它发生什么改变了,而是说你不应该再用它了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1081 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:48 · PVG 06:48 · LAX 15:48 · JFK 18:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.