如果我有unordered_map<key, someNiceObject>
(注意someNiceObject
不是指针)
我有一个API,该API会插入一个新元素,然后在地图中返回一个指向someNiceObject
的指针。
如果我进一步插入地图,则容量可能会发生变化。如果发生这种情况,指针是否仍然有效?
我尝试阅读 Basic questions: Pointers to objects in unordered_maps (C++), std::unordered_map pointers/reference invalidation和 http://eel.is/c++draft/unord.req#9
并且找不到所需的信息
谢谢
尽管如此,我们还是很高兴再次收到来自此处某人的第二次确认。
答案 0 :(得分:7)
std::unordered map
与众不同之处在于,迭代器无效规则不适用于对元素的引用(不包括移除,但当项目消失时您可以做什么?)。容量更改并不重要。问题是unordered map
重新整理时。重新哈希将使所有迭代器无效,但不会使引用无效。
从C ++标准中的 [unord.req] 的第9点开始(引用n4618,因为这是我目前所拥有的)
无序关联容器的元素被组织成 buckets 。具有相同哈希码的键将出现在同一存储桶中。当将元素添加到无序关联容器中时,存储桶的数量会自动增加,从而使每个存储桶的平均元素数量保持在界限以下。重新散列会使迭代器无效,更改元素之间的顺序以及更改出现在存储桶中的元素,但不会使对元素的指针或引用无效。对于
unordered_multiset
和unordered_multimap
,重新散列会保留等效元素的相对顺序。
强调我的
答案 1 :(得分:5)
根据cppreference:
如果由于插入而发生了哈希处理,则所有迭代器均无效。否则,迭代器不会受到影响。 引用没有无效。
这暗示指针也不会无效。这是可能的,因为从概念上可以将std::unordered_map
视为std::vector<std::forward_list<std::pair<Key, Value>>>
。而且由于std::forward_list
与其他任何链表一样,是分别分配每个元素的,因此对该列表所做的更改不会影响其元素的内存位置。