首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在构造unordered_map时需要定义桶计数号吗?

在构造unordered_map时需要定义桶计数号吗?
EN

Stack Overflow用户
提问于 2017-06-09 18:18:24
回答 2查看 628关注 0票数 2

unordered_map的构造函数中,我们可以定义分配的桶计数。我曾想过我可以用它来减少重哈希时间。然而,在某些情况下,这也会影响性能。重散列发生在插入时

只有当新元素数大于max_load_factor()*bucket_count()时才会重新散列。如果插入成功,则在节点句柄中保存时获得的元素的指针和引用无效,并且在提取该元素之前获得的指针和引用变得有效。(自C++17以来)

上面的文档来自std::unordered_map。我想boost也是一样的?但是它的文档没有说明重散列的条件。

如果我将桶计数初始化为100,并且有一个包含所有100个元素的桶,那么在插入101元素之前不会发生重散列.如果我使用默认的桶计数,我假设它是<< 100,重新散列可能会发生得更早。

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

EN

回答 2

Stack Overflow用户

发布于 2017-06-09 18:21:57

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

当分析显示有帮助的时候。

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

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

票数 2
EN

Stack Overflow用户

发布于 2017-06-09 19:57:28

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

如果提前知道表中的项目数是N,那么将桶数设置为((int)N/0.7)+1可能是一个很好的选择,因为这样就避免了重新散列的需要。如果您正在试验负载因子,则需要使用((int)N/load_factor)+1

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44464407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档