这C++ unordered_map怎么有四个值?我以为这是一个键值对

How does this C++ unordered_map have four values? I thought it was a key value pair

本文关键字:我以为 键值对 一个 四个 unordered C++ map      更新时间:2023-10-16

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

我见过的所有无序映射只有两个"参数",键和值类型,另外两个是做什么的?

阅读文档。模板最多采用五个参数,但最后三个是默认参数:

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;

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

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

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

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

STL 容器类的参数化不仅仅是它们存储的类型。模板实例化中的前两种类型是键和值类型。后两个是"functor"类型,首先控制密钥的哈希如何生成,然后如何比较两个密钥的相等性。后者是必需的,因为哈希函数可以并且将会发生将多个键映射到同一哈希值的冲突。最后一个参数是用于获取哈希中节点以及基础查找表的存储的分配器。

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

最后,考虑使用 std::set/std::map 而不是无序品种。这些容器基于红黑树,并提供非常好的摊销性能,还有一些哈希表无法获得的额外好处(排序键和lower_bound((等操作(,所有这些都不必担心管理哈希表负载因子、迭代器稳定性和其他一些讨厌的东西。