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

时间:2017-06-22 05:39:48

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

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

我试图找出使用std::unordered_map<K, V>std::unordered_map<K, V*>的性能影响。假设我只是设置和查找值,有没有理由更喜欢后者,即使值非常大?我能想象的唯一原因是,这些值是否存储在桶中,并且每次重新处理容器时都需要重新分配。

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

1 个答案:

答案 0 :(得分:12)

[unord.req]/8

  

Rehashing使迭代器无效,更改元素之间的顺序,   并更改哪些存储桶元素出现,但不会失效   指针或对元素的引用。

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

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