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

标签 c++ c++11 unordered-map

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.

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

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

关于C++:std::unordered_map 保证是基于节点的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44690986/

相关文章:

c++ - 打印与数组中的值一样多的星星

c++ - 按类型构造一个 std::mem_fn

c++ - libstdc++ 对 std::unordered_map 的支持是否不完整?

c++ - Unordered.map 插入问题与对键

C++ 错误 : 'unordered_map' does not name a type

c++ - 为了方便起见,我应该避免公开私有(private)字段变量吗?

c++结构字段的最后一个元素

java - C++ 概念和 Java 接口(interface)有什么区别?

c++ - 信号量与条件变量——抽象层次

c++ - C++是否保证从两个线程访问数组的相邻元素是安全的