【问题标题】:c++ map/unordered_map, will "insert" change the iterator?c++ map/unordered_map,“插入”会改变迭代器吗?
【发布时间】:2021-12-21 23:19:35
【问题描述】:

如何理解section map/insert中cppreference中here的句子:

如果插入成功,指针和引用 保存在节点句柄中时获得的元素无效, 以及在该元素之前获得的指针和引用 提取后生效。

【问题讨论】:

  • 该注释适用于涉及node_type 的重载。请注意,它没有提到迭代器,只有指针和引用。正如它之前的句子所说,“没有迭代器或引用无效。” (另请注意,这并不意味着并发修改是安全的。)
  • 此 STL 中没有线程安全保证,因此如果您从不同线程同时访问同一个容器,则行为未定义。
  • 请,每个问题只问一个问题。
  • 我相信它是指插入提取的元素。它不会导致任何迭代器或引用失效。然而,迭代迭代器是另一回事,当使用擦除/插入/提取操作时,它会在不同线程完成时强加内存竞争。
  • @gerum 此 STL 中没有线程安全保证 - 这不是真的:en.cppreference.com/w/cpp/container#Thread_safety

标签: c++ dictionary stl


【解决方案1】:

引用部分适用于 insertnode handle 上调用时,它们是来自容器的 extracted。重要的是,这些以前是容器的元素,但已被删除。同样相关的是map::extract的这一部分:

提取节点只会使提取元素的迭代器无效。指向提取元素的指针和引用仍然有效,但在元素由节点句柄拥有时不能使用:如果将元素插入容器,它们就会变得可用。

在两者之间,它们意味着:

  • 如果从地图中检索到元素,然后提取该元素(作为节点句柄),则该元素仍然有效,但只能通过句柄访问。
  • 如果随后将元素添加到映射中(通过插入节点句柄),现在可以安全地使用提取之前的原始元素引用和指针,但从节点句柄获得的任何指针或引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-25
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2017-08-25
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多