构造unordered_map时是否需要定义桶计数数?
Do we need to define bucket count number when construct unordered_map?
在unordered_map
的构造函数中,我们可以定义分配的桶计数。我以为我可以用来减少重新散列时间。但是,在某些情况下,这也可能会影响性能。重新哈希发生在插入时,当
仅当新的元素数大于
max_load_factor()*bucket_count()
.如果插入成功, 指针和对持有时获得的元素的引用 节点句柄失效,并获取指针和引用 在提取该元素之前,该元素将生效。(自C++17起)
以上文档来自std::unordered_map
。我想提升是相似的吗?但它的文档没有说明重新散列的条件。
如果我将存储桶计数初始化为 100,并且有一个包含所有 100 个元素的存储桶,那么在插入 101 元素之前不会发生重新哈希......如果我使用默认存储桶计数,我假设它是 <<100,重新散列可以更早发生。
如果是这样,我们什么时候要初始化存储桶计数?
如果是这样,我们什么时候要初始化存储桶计数?
当分析显示时,它会有所帮助。
无法给出更具体的建议,因为这既取决于确切的数据,也取决于使用的哈希函数。
像往常一样,如果默认值足够快,只需使用它。
一个好的经验法则是,哈希表应该只包含大约 70% 的满(70% 是负载因子)。这会导致一些冲突,但不会太多。
如果您提前知道计划放入表中的项目数N
则((int)N/0.7)+1
存储桶数可能是一个不错的选择值,因为这可以避免重新散列的需要。如果您正在试验负载系数,则需要使用((int)N/load_factor)+1
.
使表太大可能不会对速度产生太大影响:内存分配的成本并不在很大程度上取决于您分配的内存量,并且超过一定大小时,所有表的随机访问缓存性能都会很差。
相关文章:
- 在定义字符数组(井字游戏)的 for 循环中应用输入限制
- 如何访问宏中定义的数组元素
- C++ 用户定义的数组被解释为十六进制?
- 自定义 c++ 数组在为索引赋值时会吓坏
- 从自定义结构数组中提取数据
- 定义结构数组
- 在不同的文件(C++)中定义指针数组长度
- 用户定义的数组大小
- 在源文件中定义 const 数组
- C 试图使用函数参数定义2D数组
- 使用开关或定义函数数组 - 更快
- 在标头中定义全局数组的模板技巧
- 打印由用户定义的数组,第一个数字确定单词的大小,第二个数字确定行的大小
- 无法在C++中定义结构数组
- Valgrind在定义字符*数组时报告内存泄漏
- 正确定义python数组的方法
- 如何在不进行内存操作的情况下在 C++ 和 STL 中定义 2D 数组
- 如何将变量从主机上的自定义类数组复制到 CUDA 中设备上的浮点数组中
- 在 main.cpp 以外的文件中定义静态数组
- 在函数中定义结构数组