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

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

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

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

标准中有什么保证不会发生这种情况吗?

[unord.req]/8:

Rehashing invalidates iterators, changes ordering between elements, and changes which buckets elements appear in, but does not invalidate pointers or references to elements.

元素的指针和引用不会因重新散列(或 insertion/deletion,参见 /13)而失效这一事实几乎意味着它们必须是基于节点的。

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