这C++ unordered_map怎么有四个值?我以为这是一个键值对
How does this C++ unordered_map have four values? I thought it was a key value pair
我遇到了以下代码: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((等操作(,所有这些都不必担心管理哈希表负载因子、迭代器稳定性和其他一些讨厌的东西。
相关文章:
- 在C++中共享键值对的最佳方式
- 使用无序映射在STL中存储键值对
- c++同一个键的多个键/值对
- C++中的键值对:<val1, val2> 键<frequency>与值一样
- 在 std::unordered_map 中插入新的键/值对会导致"out of range"异常
- 读取数组中每个对象的所有键值对
- 这C++ unordered_map怎么有四个值?我以为这是一个键值对
- 使用 k 个键值对为零的存储桶初始化 c++14 unordered_map
- 从配置文件qsetting中删除键/值对
- 如何使用卡萨布兰卡在现有的web::json::value对象中附加新的键值对?
- 是否可以创建字符串和原子<int>键值对的unordered_map?
- 检索16k键值对的最快方法
- 将键值对文件读入 std::map
- 为什么用Spirit解析一个空行会在映射中产生一个空的键值对
- 从unordered_map C++中删除键/值对
- 如何将键值对引用从一个映射复制到同一类型的另一个映射
- 从键值对进行双向查找
- 如何从映射中修改键值对的值,而我不知道该键是否存在于映射中
- 我可以将键值对的内存映射文件重新解释为映射以便对它们进行排序吗?
- 二叉搜索树键/值对-我知道值,但不知道关键的c++