C++:std::unordered_map 保证是基于节点的吗?
C++: is std::unordered_map guaranteed to be node-based?
std::unordered_map<K, V>
的典型布局是什么? K
和 V
对象本身存储在桶中,还是存储桶存储指向包含键和值的节点的指针?
我试图找出使用 std::unordered_map<K, V>
与 std::unordered_map<K, V*>
对性能的影响。假设我只放置和查找值,是否有任何理由更喜欢后者,即使值非常大?我能想到的唯一原因是,如果值以内联方式存储在桶中,并且每次重新散列容器时都需要重新分配。
标准中有什么保证不会发生这种情况吗?
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
之间传输节点。
std::unordered_map<K, V>
的典型布局是什么? K
和 V
对象本身存储在桶中,还是存储桶存储指向包含键和值的节点的指针?
我试图找出使用 std::unordered_map<K, V>
与 std::unordered_map<K, V*>
对性能的影响。假设我只放置和查找值,是否有任何理由更喜欢后者,即使值非常大?我能想到的唯一原因是,如果值以内联方式存储在桶中,并且每次重新散列容器时都需要重新分配。
标准中有什么保证不会发生这种情况吗?
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
之间传输节点。