unordered_map指向元素值的指针在调整大小后有效吗?

时间:2018-11-05 06:06:08

标签: c++ stl iterator unordered-map

如果我有unordered_map<key, someNiceObject>

(注意someNiceObject不是指针)

我有一个API,该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/

尽管如此,我们还是很高兴再次收到来自此处某人的第二次确认。

2 个答案:

答案 0 :(得分:7)

std::unordered map与众不同之处在于,迭代器无效规则不适用于对元素的引用(不包括移除,但当项目消失时您可以做什么?)。容量更改并不重要。问题是unordered map重新整理时。重新哈希将使所有迭代器无效,但不会使引用无效。

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

  

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

强调我的

答案 1 :(得分:5)

根据cppreference

  

如果由于插入而发生了哈希处理,则所有迭代器均无效。否则,迭代器不会受到影响。 引用没有无效。

这暗示指针也不会无效。这是可能的,因为从概念上可以将std::unordered_map视为std::vector<std::forward_list<std::pair<Key, Value>>>。而且由于std::forward_list与其他任何链表一样,是分别分配每个元素的,因此对该列表所做的更改不会影响其元素的内存位置。