这个C ++ unordered_map有四个值吗?我认为这是一个关键的价值对

时间:2017-07-08 03:12:27

标签: c++ unordered-map

我遇到了以下代码:unordered_map<id, id, hashid, eqid> map

我看到的所有无序地图只有两个“参数”,键和值类型,其他两个做了什么?

3 个答案:

答案 0 :(得分:4)

阅读the docs。该模板最多需要五个参数,但最后三个参数是默认的:

template<
    class Key,
    class T,
    class Hash = std::hash<Key>,
    class KeyEqual = std::equal_to<Key>,
    class Allocator = std::allocator< std::pair<const Key, T> >
> class unordered_map;

它仍然存储键和值,但它使用自定义哈希和相等测试函数。

答案 1 :(得分:2)

它没有四个值:它有四个模板参数(五个,实际上,它需要一个分配器)。 hashid是使用的哈希函数,eqid是检查项目相等性的谓词。

为了有效地查找项目,它使用密钥的哈希来查找正确的桶。默认为std::hash<key_type>

由于碰撞可能会有多个具有相同哈希值的值,因此还需要一个谓词来检查项目是否相等。默认为std::equal_to<key_type>

答案 2 :(得分:0)

STL容器类的参数化不仅仅是它们存储的类型。模板实例化中的前两种类型是关键&amp;价值类型。第二个是'functor'类型,它们首先控制,如何生成密钥的散列,以及第二个如何比较两个密钥的相等性。后者是必要的,因为散列函数可以并且将具有将几个键映射到相同散列值的冲突。最后一个参数是用于为哈希中的节点以及基础查找表获取存储的分配器。

99%的时间,您只需要关注(键,值)模板参数对 - 其他参数对于事后调整性能特征非常有用,但使用默认值除非你有令人信服的理由改变它们。

最后,考虑使用std :: set / std :: map而不是无序变量。这些容器基于红黑树,并提供非常好的摊销性能,还有一些额外的好处,你没有使用哈希表(排序键和lower_bound()等操作),所有这些都不必担心管理哈希表载荷因子,迭代器稳定性以及其他一些恶意。