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_map
的 rehash()
和 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 元素