【问题标题】:Behaviour of unnecessary or redundant calls to std::unordered_map::reserve对 std::unordered_map::reserve 的不必要或冗余调用的行为
【发布时间】:2017-12-19 17:17:25
【问题描述】:

简介

我正在寻找有关 std::unordered_mapreserve 方法行为的说明。让我们对比std::vector 的情况。在std::vector::reserve 上引用cppreference

将向量的容量增加到大于或等于new_cap 的值。如果new_cap 大于当前capacity(),则分配新的存储空间,否则该方法什么也不做。

但是,unordered_map 的对应页面只是说

将桶的数量设置为容纳至少 count 个元素而不超过最大负载因子所需的数量,并重新散列容器,即考虑到桶的总数已更改,将元素放入适当的桶中。有效调用rehash(std::ceil(count / max_load_factor()))

我的问题

我想知道

  1. 标准是否对std::unordered_map::reserve做出任何类似的保证;如果没有
  2. 是否可以进行检查以确保不执行不必要的、可能代价高昂的重新散列?例如,如果我的地图当前大小为count,并且我要将其大小增加到new_count,我是否应该只在以下情况下调用reserve

    std::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


【解决方案1】:

标准是否做出任何类似的保证 [reserve 如果满足rehash(它调用的)的后置条件,则应该什么都不做:bucket_count() >= size() / max_load_factor()bucket_count() >= n 其中n 是@987654326 的参数@)] 关于std::unordered_map::reserve?

不,它没有。

是否可以进行检查以确保不执行不必要的、可能代价高昂的重新散列?

您可以在 [...] 中检查我在您的问题中编辑的后置条件,但没有内置函数可以为您完成。

相关标准:§23.2.5/Table 103 [unord.req] (n3337)

【讨论】:

    猜你喜欢
    • 2012-05-23
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多