c++ - 为什么要地图, int> 有效,但 unordered_map> 没有?
问题描述
map<pair<int,int>, int>
编译但unordered_map<pair<int,int>>
哈希函数有问题。背后到底发生了什么?
解决方案
std::map<Key,T>
要求密钥类型具有可比性。的默认比较器std::map<Key,T>
is std::less<Key>
,因此您可以将其与std::pair<T1,T2>
因为std::pair
定义operator<
(或operator<=>
取决于您的 C++ 版本)一起使用,使其具有可比性。由于地图是有序的,它必须能够比较键以了解它们将如何在内部排序,并且它使用比较器来做到这一点。
std::unordered_map<Key,T>
另一方面,从Key
类型上需要两个不同的方面,它必须是可散列的,并且还必须是可比较的相等性。std::pair<T1,T2>
确实实现了operator==
/operator<=>
但仅此一项不足以使该类型可用作该Key
类型。标准库不提供 for 的特化std::hash
,std::pair
因此它不会编译(但是boost 可以,它只是结合了.first
and的哈希.second
)。
如果愿意,您可以使用std::unordered_map<std::pair<int, int>, ...>
,但您需要提供自己的函数来散列这种类型,方法是定义一个函子作为模板参数传递给,std::unordered_map<>
或者直接定义您自己的自定义特化std::hash<std::pair<int, int>>
。
推荐阅读
- selenium - 在无头与浏览器中运行浏览器之间的区别
- netcdf - 如何在 netcdf 强制气候文件中使时间变量连续?
- laravel - 条纹异常不起作用。给出 laravel 错误而不是异常错误
- python-3.x - Python Split itertools 输出到多个文件(大输出)
- python-3.x - How to migrate safely from Miniconda2 to Miniconda3?
- spring-rest - 如果传递了无效的大小或页面,默认分页不会引发异常
- android - 如何解决错误:找不到符号类 DatabaseReference 问题
- ruby-on-rails - Versioning GraphQL mutations
- java - What's the best way to get the number of days in a month using the java.time API?
- react-native - 如何根据数组的键向数组中添加不同的项?