【发布时间】:2017-12-19 17:17:25
【问题描述】:
简介
我正在寻找有关 std::unordered_map 的 reserve 方法行为的说明。让我们对比std::vector 的情况。在std::vector::reserve 上引用cppreference,
将向量的容量增加到大于或等于
new_cap的值。如果new_cap大于当前capacity(),则分配新的存储空间,否则该方法什么也不做。
但是,unordered_map 的对应页面只是说
将桶的数量设置为容纳至少 count 个元素而不超过最大负载因子所需的数量,并重新散列容器,即考虑到桶的总数已更改,将元素放入适当的桶中。有效调用
rehash(std::ceil(count / max_load_factor()))。
我的问题
我想知道
- 标准是否对
std::unordered_map::reserve做出任何类似的保证;如果没有 -
是否可以进行检查以确保不执行不必要的、可能代价高昂的重新散列?例如,如果我的地图当前大小为
count,并且我要将其大小增加到new_count,我是否应该只在以下情况下调用reservestd::ceil(new_count / max_load_factor()) > std::ceil(count / max_load_factor())?
【问题讨论】:
-
不,似乎没有任何要求
rehash()在调用之前已经满足其后置条件时不执行任何操作。当然,调用者可以自己检查这些后置条件,如果没有必要,则跳过调用rehash()(或reserve(),相当于rehash())。 -
open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf page 773 是req的reserve和rehash
-
我宁愿考虑是否需要预订。大多数情况下,默认策略都可以。
-
有什么困惑?您引用的文字告诉您它的含义。你在谈论什么“类似的保证”,你为什么期望它们?
-
@LightnessRacesinOrbit 我猜“类似的保证”是模糊的措辞,但@AndyG 的回答说得很好,基本上只是想知道如果重新哈希的后置条件已经满足,是否还会执行重新哈希。至于我为什么期待他们,那纯粹是基于
std::vector的行为。
标签: c++ c++11 stl unordered-map