为什么map<pair<int,int>, int>可正常使用,unordered_map<pair<int,int>>却不行?
二者底层实现逻辑的差异直接导致了该问题
std::map是有序关联容器,底层基于红黑树实现,对键类型的核心要求是支持小于比较(默认使用std::less规则)。C++标准库已经为std::pair默认实现了operator<逻辑:优先比较第一个元素,相等时再比较第二个元素,完全满足std::map的要求,因此不需要额外自定义逻辑就可以直接将pair<int,int>作为map的键使用。std::unordered_map是无序关联容器,底层基于哈希表实现,对键类型有两个核心要求:一是支持相等性比较(判断哈希冲突的两个键是否为同一个),二是可以通过哈希函数计算出键对应的无符号哈希值。C++标准库仅为基础数据类型、字符串、指针等常见类型提供了默认的std::hash特化实现,没有为std::pair这类复合类型提供默认的哈希函数,因此编译器找不到对应的哈希计算逻辑,就会抛出哈希相关的编译错误。
若需要使用
pair<int,int>作为unordered_map的键,只需要自定义对应哈希函数传入模板参数即可,简单实现参考:
#include <unordered_map> #include <utility> struct PairHash { template <typename T1, typename T2> std::size_t operator() (const std::pair<T1, T2>& p) const { auto hash1 = std::hash<T1>{}(p.first); auto hash2 = std::hash<T2>{}(p.second); // 简单哈希组合逻辑,可根据业务场景替换为更均匀的实现 return hash1 ^ (hash2 << 1); } }; // 声明带自定义哈希的unordered_map std::unordered_map<std::pair<int, int>, int, PairHash> demo_map;
内容的提问来源于stack exchange,提问作者Gokularam
相关产品推荐
相关产品推荐

