对std :: unordered_map :: reserve进行不必要或冗余调用的行为

时间:2017-07-14 14:43:05

标签: c++ c++11 stl unordered-map

简介

我正在寻找有关reserve std::unordered_map方法行为的说明。让我们与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,那么我是否应该只调用预留

    std::ceil(new_count / max_load_factor()) > std::ceil(count / max_load_factor())
    

1 个答案:

答案 0 :(得分:1)

  

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

不,不。

  

是否可以进行检查以确保不会执行不必​​要的,可能代价高昂的重组?

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

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

相关问题