【问题标题】:How to find the current capacity of std::unordered_map?如何找到 std::unordered_map 的当前容量?
【发布时间】:2020-06-10 07:10:47
【问题描述】:

std::unordered_mapstd::vector 都具有reserve 方法,这增加了集合的容量,因此可以在不扩大内部缓冲区的情况下向集合中添加多个元素。但是,std::vector 也有一个方法 capacity(),它返回集合的当前容量。 std::unordered_map 没有这样的方法。有没有办法使用类已经提供的任何东西来获得std::unordered_map 的容量?

【问题讨论】:

  • 请注意,任何给定的答案都不能保证内部缓冲区不会改变大小。
  • 请注意,reserve(n) on unordered_map 不会为 n 个元素保留空间,而是为在给定最大负载因子的情况下存储 n 个元素所需的桶数。 capacityvector 意义上并不真正适用于unordered_map,因为每当您添加元素时,存储桶都可以扩展。
  • @Koosha 桶的集合不会扩大,但插入元素的桶会扩大。 (没有“the”内部缓冲区。)
  • @Koosha 为什么他们会扔东西? unordered_map 就像没有订单的 map
  • @Koosha 每个插入无序映射确实分配。即使桶的数组没有被重新分配,也需要为插入的元素分配一个节点。如果您想避免这种分配,您可以提供自己的分配器,例如一些基于预分配缓冲区的内存池。请注意,在此分配器中,您需要区分数组和节点分配。

标签: c++ vector unordered-map


【解决方案1】:

一个地图包含许多桶(见bucket_count()),每个桶可以包含一定数量的元素(见max_load_factor())。所以std::unordered_map<X, Y> m;的总容量是

m.max_load_factor() * m.bucket_count();

【讨论】:

  • 谈论无序地图的容量是什么意思?这给出了您可以在不重新分配存储桶数组的情况下存储的元素数量,但前提是每个元素将针对不同的存储桶,这在实践中很难实现。
【解决方案2】:
size_type std::unordered_map::bucket_count()

std::unordered_map::reserve(size_type n) 请求容量更改。 将容器 (bucket_count) 中的桶数设置为最适合包含至少 n 元素的数量。

【讨论】:

    【解决方案3】:

    std::unordered_map::reserve 状态的文档

    无效保留(size_type n);

    请求更改容量

    将容器中的桶数 (bucket_count) 设置为最适合包含至少 n 个元素。

    如果 n 大于当前 bucket_count 乘以 max_load_factor,则容器的 bucket_count 会增加并强制进行 rehash。

    如果n低于这个值,这个函数可能没有效果。

    所以等价于 std::vector::capacity,其中当 new_cap 大于 capacity() 时,reserve 会改变容量:

    std::unordered_map::bucket_count() * std::unordered_map::max_load_factor
    

    【讨论】:

      猜你喜欢
      • 2020-08-03
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      相关资源
      最近更新 更多