map运行正常但unordered_map报错,pair<int,int>作key编译错误如何解决?
错误产生原因
- C的
unordered_map是基于哈希表实现的关联容器,要求键(Key)类型必须有对应的标准哈希函数std::hash特化。而C标准库没有为std::pair<int, int>提供默认的哈希函数特化,编译器无法实例化合法的unordered_map实例,因此隐式删除了该模板实例的默认构造函数,触发编译报错。 map基于红黑树实现,只要求键类型支持小于(<)比较运算符即可,std::pair内置了默认的<运算符重载,因此可以直接用pair作为map的键,运行正常。
修复方案
提供三种可选方案,按改动成本从低到高排序:
方案1:直接替换为map(最推荐,算法题场景完全够用)
仅需要将代码中所有unordered_map<pair<int,int> , int>替换为map<pair<int,int> , int>即可,其余逻辑无需修改,你已经验证过该方案可行。
修改后对应代码片段示例:
// dfs参数修改 void dfs(int n,vector<vector<int>>&adj,vector<int>&vis,map<pair<int,int> , int>&mp){ // 内部逻辑不变 } // minReorder内部定义修改 map< pair<int,int> , int>mp;
方案2:自定义pair的哈希函数,继续使用unordered_map
如果你需要保留unordered_map的O(1)查找性能,可以自行实现pair<int,int>的哈希函数,传入unordered_map的第三个模板参数即可:
首先定义哈希结构体:
struct pair_hash { template <class T1, class T2> size_t operator () (const pair<T1,T2> &p) const { auto h1 = hash<T1>{}(p.first); auto h2 = hash<T2>{}(p.second); return h1 ^ (h2 << 1); // 简单哈希组合,算法题场景足够使用 } };
然后定义unordered_map时指定哈希函数:
unordered_map<pair<int,int>, int, pair_hash> mp;
方案3:将pair编码为整数作为key
因为题目中城市数量n上限一般不超过1e5,可以将两个int值编码为一个long long整数作为key,直接使用原生支持哈希的long long作为键:
// 存的时候编码 mp[(long long)connections[i][0] * 100000 + connections[i][1]] = 1; // 查找的时候也用同样规则编码 if(mp.find((long long)adj[n][i] * 100000 + n) == mp.end()) { ans++; }
内容的提问来源于stack exchange,提问作者Sanyam Aggarwal
相关产品推荐
相关产品推荐

