在unordered_map
的构造函数中,我们可以定义分配的桶数。我以为我可以用来减少重复时间。但是,在某些情况下,这也可能会损害性能。
仅当新元素数大于时才会发生重新散列
max_load_factor()*bucket_count()
。如果插入成功, 指针和对其所在元素的引用 节点句柄无效,获得指针和引用 在提取之前该元素变为有效。 (自C ++ 17起)
以上文档来自std::unordered_map
。我觉得提升类似吗?但是它的文件没有说明重复的条件。
如果我将存储桶计数初始化为100,并且存在包含所有100个元素的存储桶,则在插入101元素之前不会进行重新传输...如果我使用默认存储桶计数,我认为它是&lt ;< 100,重新发生可能要早得多。
如果是这样,我们什么时候想要初始化桶数?
答案 0 :(得分:2)
如果是这样,我们什么时候想要初始化桶数?
分析时显示有帮助。
不能给出更具体的建议,因为这取决于确切的数据以及正在使用的散列函数。
通常,如果默认值足够快,只需使用它。
答案 1 :(得分:2)
一个好的经验法则是哈希表应该只有70%满(70%是加载因子)。这会导致一些碰撞,但不会太多。
如果您提前知道计划放入表中的项目数为N
,那么将桶数设置为((int)N/0.7)+1
可能是一个很好的选择,因为这可以避免需要重新开始。如果您正在尝试使用加载因子,则需要使用((int)N/load_factor)+1
。
使表太大可能不会对速度造成太大影响:内存分配的成本并不在很大程度上取决于您分配的内存量,并且在一定大小以上,所有表的随机访问都会有较差的缓存性能。 / p>