C++:是否保证 std::unordered_map 是基于节点的

C++: is std::unordered_map guaranteed to be node-based?

本文关键字:于节点 节点 map 是否 std unordered C++      更新时间:2023-10-16

std::unordered_map<K, V>的典型布局是什么?KV对象是存储在存储桶本身中,还是存储桶存储指向包含键和值的节点的指针?

我试图弄清楚使用 std::unordered_map<K, V>std::unordered_map<K, V*>的性能影响。假设我只放置和查找值,即使值很大,是否有任何理由更喜欢后者?我能想象的唯一原因是,如果这些值以内联方式存储在存储桶中,并且每次重新散列容器时都需要重新分配。

标准中是否有任何内容可以保证这种情况不会发生?

[unord.req]/8:

重新散列会使迭代器失效,更改元素之间的顺序, 并更改存储桶元素的显示,但不会使这些元素失效 指向元素的指针或引用。

事实上,指针和对元素的引用不会因重新散列(或插入/删除,参见/13(而失效,这几乎意味着它们必须基于节点。

C++17 甚至公开了节点句柄,以便您可以在两个unordered_map之间传输节点。