C++ unordered_map 的 rehash() 和 reserve() 方法有啥区别?

Posted

技术标签:

【中文标题】C++ unordered_map 的 rehash() 和 reserve() 方法有啥区别?【英文标题】:What's the difference between the rehash() and reserve() methods of the C++ unordered_map?C++ unordered_map 的 rehash() 和 reserve() 方法有什么区别? 【发布时间】:2013-02-13 10:21:16 【问题描述】:

C++ unordered_maprehash()reserve() 方法有什么区别?为什么需要两种不同的方法?

【问题讨论】:

【参考方案1】:

区别在于目的,尽管两者都在做类似的事情。

rehash 获取现有地图并重建大小的桶,在此过程中重新散列并将元素重新分配到新桶中。

reserve 向您保证,如果您不插入超过保留数量的元素,则不会进行重新散列(即您的迭代器将保持有效)。

这是两个有些不同的东西,尽管是相关的。 rehash 不给你任何保证,reserve 不表达 rehashing 的目的。如果您认为您的地图效率低下,请使用rehash,如果您准备大量插入,请使用reserve

正如@Xeo 指出的那样,reserve 只是rehash 的包装,但考虑到地图的允许负载系数。

【讨论】:

reserve 指定为rehash(ceil(n / max_load_factor())) 请注意,如果您准确插入保留的数字,当前的 gcc 实现将重新散列(因此您可能希望保留一个额外的数字)。 gcc.gnu.org/bugzilla/show_bug.cgi?id=71181 的讨论表明这种行为不符合 C++ 标准的更新版本(因此它可能会在未来得到修复)。【参考方案2】:

来自cplusplus.com:

rehash:rehash 是对哈希表的重构:> 容器中的所有元素都根据它们的哈希值重新排列到新的一组桶中。这 > 可能会改变容器内元素的顺序。

reserve:将容器中的桶数(bucket_count)设置为最合适>以包含至少n个元素。

我从这里了解到,rehash 尝试根据给定的 n 大小更改哈希表中的桶数。保留将哈希表中的桶数更改为最合适的数量,以便存储至少 n 个(由用户提供)元素。我希望我的陈述清楚。

【讨论】:

以上是关于C++ unordered_map 的 rehash() 和 reserve() 方法有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

std::unordered_map 如何表现? [C++]

在 C++ unordered_map 中有效地使用 [] 运算符

如何在 C++ 中单独锁定 unordered_map 元素

与 C++ unordered_map 的并行性

C++ std::unordered_map 中使用的默认哈希函数是啥?

在 C++ 中从 unordered_map 访问值