You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 03:27:03