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

如何用内置sort函数排序二维数组?自定义比较函数失效求助

解决二维C风格数组自定义排序的问题

我帮你定位到了代码里导致排序无法生效的两个核心问题,以及对应的修复方案:

问题分析

  1. 参数类型不匹配:
    你的box是int[33][33]类型的二维数组,当调用sort(box, box + n, cmp)时,sort遍历的每个元素是指向长度为33的int数组的指针(int (*)[33]),但你的cmp函数参数是const int[](等价于const int*),两者类型不兼容,编译器会直接拒绝这个调用。

  2. 无法访问局部变量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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 11:03:10