【发布时间】:2013-02-13 10:21:16
【问题描述】:
C++ unordered_map 的 rehash() 和 reserve() 方法有什么区别?为什么需要两种不同的方法?
【问题讨论】:
标签: c++ data-structures c++11 std unordered-map
C++ unordered_map 的 rehash() 和 reserve() 方法有什么区别?为什么需要两种不同的方法?
【问题讨论】:
标签: c++ data-structures c++11 std unordered-map
区别在于目的,尽管两者都在做类似的事情。
rehash 获取现有地图并重建新大小的桶,在此过程中重新散列并将元素重新分配到新桶中。
reserve 向您保证,如果您不插入超过保留数量的元素,则不会进行重新散列(即您的迭代器将保持有效)。
这是两个有些不同的东西,尽管是相关的。 rehash 不给你任何保证,reserve 不表达 rehashing 的目的。如果您认为您的地图效率低下,请使用rehash,如果您准备大量插入,请使用reserve。
正如@Xeo 指出的那样,reserve 只是rehash 的包装,但考虑到地图的允许负载系数。
【讨论】:
reserve 指定为rehash(ceil(n / max_load_factor()))
rehash:rehash 是对哈希表的重构:> 容器中的所有元素都根据它们的哈希值重新排列到新的一组桶中。这 > 可能会改变容器内元素的顺序。
reserve:将容器中的桶数(bucket_count)设置为最合适>以包含至少n个元素。
我从这里了解到,rehash 尝试根据给定的 n 大小更改哈希表中的桶数。保留将哈希表中的桶数更改为最合适的数量,以便存储至少 n 个(由用户提供)元素。我希望我的陈述清楚。
【讨论】: