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

unordered_map pointer to element's value valid after resize?

本文关键字:unordered 指针 map 有效 元素 调整      更新时间:2023-10-16

如果我有unordered_map<key, someNiceObject>

(注意someNiceObject不是指针(

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

如果我在地图中执行进一步的插入操作,那么容量可能会发生变化。如果发生这种情况,指针是否仍然有效?

我试着看书基本问题:指向无序映射(C++(中对象的指针,std::unordered_map指针/引用无效和http://eel.is/c++草稿/无订单要求#9

无法找到必要的信息

感谢所有

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

不过,如果能得到SO.上的人的第二次确认,我将不胜感激

根据cppreference:

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

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

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

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

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

强调矿