指定构造 boost::unordered_map 时的最小桶数

Posted

技术标签:

【中文标题】指定构造 boost::unordered_map 时的最小桶数【英文标题】:Specify the minimum number of buckets when constructing a boost::unordered_map 【发布时间】:2009-03-29 12:39:53 【问题描述】:

我正在尝试使用 boost::unordered_map 来缓存一些值。我尝试在构造函数中指定最小桶数:

#include <boost/unordered_map.hpp>
typedef boost::unordered_map<float, float> Mycache;
Mycache cache((std::size_t)25165843,
              boost::hash<float>(),
              std::equal_to<float>(),
              std::allocator<std::pair<float const, float> >());

但是当我在程序结束时显示关于我的 unordered_map 的信息时:

g++:

unordered_map.size(): 15861612
unordered_map.load_factor: 10.0845
unordered_map.bucket_count: 1572869
unordered_map.max_size: 1572868
unordered_map.max_load_factor: 1
unordered_map.max_bucket_count: 1572869

vc++:

unordered_map.size(): 13916119
unordered_map.load_factor: 8.8476
unordered_map.bucket_count: 1572869
unordered_map.max_size: 1572868
unordered_map.max_load_factor: 1
unordered_map.max_bucket_count: 1572869

如何指定最小桶数?

【问题讨论】:

【参考方案1】:

关于标准的另一个答案是正确的,但是小max_bucket_count实际上是Boost 1.38中的一个错误,任何其他版本都会让你使用更多的桶。

【讨论】:

【参考方案2】:

boost::unordered_map::max_bucket_count() 返回对unordered_map 的桶计数的依赖于实现的限制。您的构造函数参数似乎已超出此限制。请注意,虽然 MSDN 将其定义为“当前”允许的最大存储桶(无论这意味着什么),但 C++0x 规范将其定义为地图可以拥有的最多存储桶。

我从未使用过该类,而且我在 C++0x 规范草案中看不到任何内容来解释为什么构造函数会默默地创建一个对象,而该对象并没有按照您的要求进行操作。

我也不知道1572869 值背后的动机是什么,除了它是一个大质数。

【讨论】:

MSDN 和 C++0x 规范与 boost 对象有什么关系?

以上是关于指定构造 boost::unordered_map 时的最小桶数的主要内容,如果未能解决你的问题,请参考以下文章

boost::boost::unordered_map 的序列化

boost::unordered_map 中以结构为键的 boost 变体

如何使用 boost std::vector of boost::unordered_map 进行序列化/反序列化

boost::unordered_map() 的 find() 方法的问题

使用 std::map/boost::unordered_map 帮助理解段错误

(转载)STL map与Boost unordered_map的比较