首页 > 解决方案 > 为什么要地图, int> 有效,但 unordered_map> 没有?

问题描述

map<pair<int,int>, int>编译但unordered_map<pair<int,int>>哈希函数有问题。背后到底发生了什么?

标签: c++hashunordered-map

解决方案


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::hashstd::pair因此它不会编译(但是boost 可以,它只是结合了.firstand的哈希.second)。

如果愿意,您可以使用std::unordered_map<std::pair<int, int>, ...>,但您需要提供自己的函数来散列这种类型,方法是定义一个函子作为模板参数传递给,std::unordered_map<>或者直接定义您自己的自定义特化std::hash<std::pair<int, int>>


推荐阅读