我正试图在C++11的std::unordereded_map容器上进行性能基准测试。
我想看看容器的负载因子如何影响插入的性能。特别是因为我对使用哈希表作为基础数据结构来查找大量数字中的对感兴趣。
根据我对文件的理解,这似乎是不可能的。我可以用rehash()
设置bucket的数量,但只要超过max_load_factor
,就会自动设置。
我可以设置max_load_factor
,但据我所知,这只会确定当执行重新清洗时,它不允许将表置于重应变下,这正是我想要做的。
有什么方法可以让我严格限制哈希表中的bucket数量吗?
将max_load_factor
设置为INFINITY
。这样,容器就不应该试图执行自动rehash
以将load_factor
保持在max_load_factor
以下。
不确定这是否是一个好答案,但这解释了为什么这可能是不可能的。
如果您有开放寻址,则需要resize
,但这是实现细节。您可以使用链冲突解决方案来实现,并对链长度进行限制,并在违反时调整大小。很多事情都可能在幕后发生。
我的意思是,从用户的角度来看,不能保证您可以安全地修复bucket的数量,因为有些实现可能会失败。即使您允许负载因子很高,偶尔添加表时也必须调整大小,因为目标bucket已满,否则它将无法接受元素。即使负载系数相对较低,也可能发生这种情况。
当然,有些实现可能会处理任意大的负载因子,但这不是一个通用属性。
最重要的是,固定水桶的数量在一般情况下没有多大意义。无论如何,您只能尝试调整大小,这可能是不同负载因素所需要的,具体取决于密钥分布。基本上,您不能为每个实现测试任意繁重的负载。