C++编译报错:invalid initialization of reference pair问题求助
编译错误原因与修复方案
错误根源
你遇到的编译错误是因为比较函数的参数类型不符合C++标准库算法的要求:
std::sort在内部执行排序逻辑时,会向比较函数传递const修饰的元素引用,但你的cmp函数参数定义为std::pair<int, int>&(非const左值引用),C++标准不允许将const对象绑定到非const引用上,因此GCC 4.8(刷题网站使用的编译器)直接报错。- Visual Studio编译器默认启用了语言扩展,允许这种非标准的写法通过编译,但这属于编译器的特殊处理,并不符合C++标准。
修复方法
只需要将cmp函数的参数改为const引用即可,修改后的代码如下:
bool cmp(const std::pair<int, int>& a, const std::pair<int, int>& b) { if (c == '+') { return a.second < b.second; } else { return a.second > b.second; } }
额外优化建议(可选)
为了让代码更规范、减少潜在问题,还可以做以下调整:
- 将全局变量
map、n、m、c改为main函数内的局部变量,再通过参数传递给Sort函数,避免全局变量带来的耦合性和线程安全问题 - 使用C++11及以上的范围for循环简化遍历逻辑,比如遍历map填充vector的部分可以改为:
for (const auto& pair : M) { v.push_back(pair); }
内容的提问来源于stack exchange,提问作者Mateiasgt
相关产品推荐
相关产品推荐

