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

Do we need to define bucket count number when construct unordered_map?

本文关键字:定义 数数 unordered map 是否 构造      更新时间:2023-10-16

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.

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