C++ 使用std::无序映射有意义吗<;int,int>;而不是std::map<;int,int>;?

C++ 使用std::无序映射有意义吗<;int,int>;而不是std::map<;int,int>;?,c++,c++11,stl,hashmap,unordered-map,C++,C++11,Stl,Hashmap,Unordered Map,std::unordered_-map应该比std::map`快吗?我不关心顺序,只是快速查找,所以我想我应该使用哈希表。但后来我想它可能会尝试额外散列我的密钥或类似的东西(我不需要) 还有一个相关的问题:我需要通过int键检索int值。我应该使用unordered\u-map还是unordered\u-set(在这种情况下,我需要为我的对正确实现哈希函数)映射和unordered\u-map之间的区别在于第一个实现依赖于树,而第二个实现依赖于哈希映射 这意味着对于映射而言,基本操作(get和s

std::unordered_-map
应该比std::map`快吗?我不关心顺序,只是快速查找,所以我想我应该使用哈希表。但后来我想它可能会尝试额外散列我的密钥或类似的东西(我不需要)


还有一个相关的问题:我需要通过
int
键检索
int
值。我应该使用
unordered\u-map
还是
unordered\u-set
(在这种情况下,我需要为我的对正确实现哈希函数)

映射
unordered\u-map
之间的区别在于第一个实现依赖于树,而第二个实现依赖于哈希映射

这意味着对于
映射
而言,基本操作(get和set)的复杂性是对数的,对于
无序映射
而言,复杂性是常数

在任何情况下都有其他方面:当达到负载系数时,
无序映射
可能需要重新刷新(这需要时间并且可能不可预测),而正常的
映射
不涉及此类问题。此外,
unordered_map
实现可以使用带bucket的分离链,因此,如果碰巧有许多冲突,复杂性将变为常数+检索密钥的线性

我建议您使用与所需模式相似的数据对这两种结构进行基准测试,这将使您做出选择


您不需要为无序映射定义自己的映射,因为它已经实现了。

关键是,我已经为hashmap提供了散列值(我的键是散列)。这有意义吗?不,除非hashmap的容量是
2@VioletGiraffe:如果需要,您可以将自己的哈希函数提供给
无序映射
。但是,在这样做之前,一定要了解陷阱和注意事项。