C++:如何用比较器对二维数组按指定元素排序?代码编译失败求助
问题分析与修复
你的代码编译失败主要有两个核心原因:
1. 非标准的变长数组(VLA)
C标准并不支持int a[n][2]这种变长数组(数组大小由运行时变量n决定),虽然部分编译器(比如GCC)会把它作为扩展特性支持,但这不是标准C写法,换用严格遵循标准的编译器(比如MSVC)就会直接报错。
2. 比较器与sort的类型不匹配
当你把二维数组a传给sort时,数组会退化为int (*)[2]类型的指针(指向包含2个int的数组的指针)。而你的cmp函数声明的参数是int x[]、int y[],这会被编译器解析为int* x、int* y,和sort需要的比较器参数类型不匹配,导致编译失败。
修复后的代码方案
推荐用标准容器vector替代变长数组,同时用lambda表达式作为比较器(更简洁且类型自动匹配):
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { int n; cin >> n; // 用vector替代变长数组,完全符合C++标准 vector<vector<int>> a(n, vector<int>(2)); for (int i = 0; i < n; i++) { cin >> a[i][0] >> a[i][1]; } // lambda比较器自动匹配容器元素类型 sort(a.begin(), a.end(), [](const vector<int>& x, const vector<int>& y) { return x[0] < y[0]; }); // 可选:输出验证排序结果 for (auto& row : a) { cout << row[0] << " " << row[1] << endl; } }
如果坚持用数组(不推荐,需手动管理内存),可以用动态分配的二维数组并调整比较器参数类型:
#include <iostream> #include <algorithm> using namespace std; // 比较器参数改为指向int[2]的指针,匹配数组退化后的类型 bool cmp(const int x[2], const int y[2]) { return x[0] < y[0]; } int main() { int n; cin >> n; // 动态分配二维数组,避免变长数组问题 int (*a)[2] = new int[n][2]; for (int i = 0; i < n; i++) { cin >> a[i][0] >> a[i][1]; } sort(a, a + n, cmp); // 输出结果 for (int i = 0; i < n; i++) { cout << a[i][0] << " " << a[i][1] << endl; } // 释放动态分配的内存 delete[] a; return 0; }
内容的提问来源于stack exchange,提问作者Petro
相关产品推荐
相关产品推荐

