使用std :: unordered_map <int,int =“”>而不是std :: map <int,int =“”>?</int,> </int,>是否有意义?

时间:2013-07-13 10:49:31

标签: c++ c++11 stl hashmap unordered-map

std::unordered_map<int, int>应该比std :: map`快吗?我不关心顺序,只是快速查找,所以我认为我应该使用哈希表。但后来我想也许它会尝试额外哈希我的键或类似的东西(我不需要)?

还有一个相关问题:我需要通过int键检索int值。我应该使用unordered_map<int, int>还是unordered_set<pair<int, int> >(在这种情况下,我需要为我的对正确实现哈希函数)?

1 个答案:

答案 0 :(得分:4)

map<T,K>unordered_map<T,K>之间的区别在于第一个实现依赖于树,而第二个实现依赖于散列映射。

这意味着基本操作(获取和设置)的复杂性是map的对数和unordered_map的常量。

在任何情况下都有其他方面:unordered_map在达到其加载因子时可能需要重新散列(这需要时间并且可能无法预测),而正常map不涉及此类问题。此外,unordered_map实现可以使用分离的链接与桶,因此如果它碰巧有许多冲突,复杂性变为常量+线性以检索密钥。

我建议你使用一些类似于你需要的模式的数据来对两个结构进行基准测试,这将使你做出选择。

您无需为unordered_map定义自己的hash<int>,因为它已经实施。