【问题标题】:unordered_map pointer to element's value valid after resize?unordered_map 指向元素值的指针在调整大小后是否有效?
【发布时间】:2019-04-08 12:04:07
【问题描述】:

如果我有unordered_map<key, someNiceObject>

(注意someNiceObject不是指针)

我有一个 API,它插入一个新元素,然后在地图中返回一个指向 someNiceObject 的指针。

如果我进一步插入地图,容量可能会发生变化。如果发生这种情况,指针是否仍然有效?

我尝试阅读 Basic questions: Pointers to objects in unordered_maps (C++), std::unordered_map pointers/reference invalidationhttp://eel.is/c++draft/unord.req#9

找不到必要的信息

谢谢大家

编辑:看来指针是有效的 (https://www.thecodingforums.com/threads/do-insert-erase-invalidate-pointers-to-elements-values-of-std-unordered_map.961062/)

虽然希望有人在这里对 SO 进行第二次确认。

【问题讨论】:

    标签: c++ stl iterator unordered-map


    【解决方案1】:

    根据cppreference

    如果由于插入而发生重新散列,则所有迭代器都将失效。否则迭代器不受影响。 引用不会失效。

    这意味着指针也不会失效。这是可能的,因为std::unordered_map 在概念上可以被认为是std::vector<std::forward_list<std::pair<Key, Value>>>。由于std::forward_list 与任何其他链表一样,单独分配每个元素,因此对链表的更改不会影响其元素的内存位置。

    【讨论】:

    • @Prof,我已经扩展了我的解释。
    • 为了完整起见,key 和 value 都可以安全地引用
    【解决方案2】:

    std::unordered map 的不寻常之处在于迭代器无效规则不适用于对元素的引用(不包括删除,但当项目消失时你能做什么?)。容量变化并不重要。问题是当unordered map 重新散列时。重新散列将使所有迭代器无效,但不会使引用无效。

    从 C++ 标准中 [unord.req] 的第 9 点开始(引用 n4618,因为这是我目前手头的内容),

    无序关联容器的元素被组织成。具有相同哈希码的键出现在同一个桶中。当元素被添加到无序关联容器时,桶的数量会自动增加,因此每个桶的平均元素数保持在一个界限以下。重新散列使迭代器无效,更改元素之间的顺序,并更改出现在哪个桶中的元素,但不会使指针或对元素的引用无效。 对于 unordered_multisetunordered_multimap,重新散列保留等效项的相对顺序元素。

    强调我的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-02
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      相关资源
      最近更新 更多