构造unordered_map时是否需要定义桶数?

时间:2017-06-09 18:18:24

标签: c++ unordered-map boost-unordered

unordered_map的构造函数中,我们可以定义分配的桶数。我以为我可以用来减少重复时间。但是,在某些情况下,这也可能会损害性能。

时插入时会发生重新连接
  

仅当新元素数大于时才会发生重新散列   max_load_factor()*bucket_count()。如果插入成功,   指针和对其所在元素的引用   节点句柄无效,获得指针和引用   在提取之前该元素变为有效。 (自C ++ 17起)

以上文档来自std::unordered_map。我觉得提升类似吗?但是它的文件没有说明重复的条件。

如果我将存储桶计数初始化为100,并且存在包含所有100个元素的存储桶,则在插入101元素之前不会进行重新传输...如果我使用默认存储桶计数,我认为它是&lt ;< 100,重新发生可能要早得多。

如果是这样,我们什么时候想要初始化桶数?

2 个答案:

答案 0 :(得分:2)

  

如果是这样,我们什么时候想要初始化桶数?

分析时显示有帮助。

不能给出更具体的建议,因为这取决于确切的数据以及正在使用的散列函数。

通常,如果默认值足够快,只需使用它。

答案 1 :(得分:2)

一个好的经验法则是哈希表应该只有70%满(70%是加载因子)。这会导致一些碰撞,但不会太多。

如果您提前知道计划放入表中的项目数为N,那么将桶数设置为((int)N/0.7)+1可能是一个很好的选择,因为这可以避免需要重新开始。如果您正在尝试使用加载因子,则需要使用((int)N/load_factor)+1

使表太大可能不会对速度造成太大影响:内存分配的成本并不在很大程度上取决于您分配的内存量,并且在一定大小以上,所有表的随机访问都会有较差的缓存性能。 / p>