如何用内置sort函数排序二维数组?自定义比较函数失效求助
解决二维C风格数组自定义排序的问题
我帮你定位到了代码里导致排序无法生效的两个核心问题,以及对应的修复方案:
问题分析
参数类型不匹配:
你的box是int[33][33]类型的二维数组,当调用sort(box, box + n, cmp)时,sort遍历的每个元素是指向长度为33的int数组的指针(int (*)[33]),但你的cmp函数参数是const int[](等价于const int*),两者类型不兼容,编译器会直接拒绝这个调用。无法访问局部变量
dim:
你定义的dim是main函数的局部变量,而全局的cmp函数无法访问它,这会导致编译错误,或者即使编译通过也会出现未定义行为。
推荐解决方案(C++11及以上):使用Lambda表达式
Lambda表达式可以直接捕获main里的局部变量dim,同时自动匹配sort所需的参数类型,代码更简洁且无全局变量耦合:
修改main函数中的sort调用部分,替换掉原来的全局cmp函数:
int main() { while(cin>>n>>dim){ for(int i = 0; i < n; i++){ for(int j = 0; j < dim; j++){ cin>>box[i][j]; } box[i][dim] = i+1; // 存储原始索引 sort(box[i], box[i]+dim); // 对单个一维数组排序,这部分是正确的 } // 替换原来的sort调用,使用Lambda作为比较函数 sort(box, box + n, [dim](const int a[], const int b[]) { for(int i = 0; i < dim; i++){ if(a[i] != b[i]) return a[i] < b[i]; } return a[dim] < b[dim]; // 按原始索引排序(当行元素完全相同时) }); // 输出部分不变 for(int i = 0; i < n; i++){ for(int j = 0; j < dim; j++){ cout<<box[i][j]<<" "; } cout<<"\n"; } } return 0; }
兼容旧C++标准的方案:使用全局变量+修正参数类型
如果你需要兼容C++11之前的标准,可以把dim设为全局变量,并修正cmp函数的参数类型以匹配二维数组的元素:
// 把dim设为全局变量 int n, dim; int box[33][33]; // 修改cmp的参数类型为固定长度的数组(等价于指向长度33的int数组的指针) bool cmp(const int a[33], const int b[33]){ for(int i = 0; i < dim; i++){ if(a[i] != b[i]) return a[i] < b[i]; } return a[dim] < b[dim]; } int main() { while(cin>>n>>dim){ // 输入和单个排序部分不变 for(int i = 0; i < n; i++){ for(int j = 0; j < dim; j++){ cin>>box[i][j]; } box[i][dim] = i+1; sort(box[i], box[i]+dim); } // 原来的sort调用可以正常使用了 sort(box, box + n, cmp); // 输出部分不变 for(int i = 0; i < n; i++){ for(int j = 0; j < dim; j++){ cout<<box[i][j]<<" "; } cout<<"\n"; } } return 0; }
注意:这种方式不推荐,因为全局变量会增加代码的耦合性,容易在多组数据处理时出现意外问题。
最后提醒:确保dim的值始终小于33(因为你定义的box第二维长度是33),否则访问box[i][dim]会导致数组越界,引发未定义行为。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

