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

C++中使用自定义compare函数排序二维i64数组编译报错求助

问题解决:std::sort与二维数组比较函数不匹配

你的问题核心是std::sort迭代器指向的类型和compare函数参数类型不兼容:

  • 你的final是二维数组i64 final[100][2],每个元素的类型是i64[2](长度为2的long long数组)
  • 调用sort时,迭代器指向的是i64[2]对象,但你的compare函数参数是i64*,类型不匹配导致编译器报错。

可行解决方案

方案1:修改compare函数参数为匹配的数组类型

直接让参数接收长度为2的long long数组的指针或引用:

指针版本:

typedef long long i64;

bool compare(const i64 (*a)[2], const i64 (*b)[2])
{
    if ((*a)[1] != (*b)[1])
    {
        return (*a)[1] > (*b)[1];
    }
    else
    {
        return (*a)[0] < (*b)[0];
    }
}

int main(){
    i64 final[100][2] = {0};
    i64 final_stack = 0;

    // 插入数据逻辑

    sort(final, final + final_stack, compare);
}

引用版本(更直观):

typedef long long i64;

bool compare(const i64 (&a)[2], const i64 (&b)[2])
{
    if (a[1] != b[1])
    {
        return a[1] > b[1];
    }
    else
    {
        return a[0] < b[0];
    }
}

int main(){
    i64 final[100][2] = {0};
    i64 final_stack = 0;

    // 插入数据逻辑

    sort(final, final + final_stack, compare);
}

方案2:改用结构体存储数据(推荐)

二维数组可读性较差,改用结构体更符合C++编码习惯,也能彻底避免类型匹配问题:

typedef long long i64;

struct Item {
    i64 id;       // 对应原数组的*a
    i64 priority; // 对应原数组的*(a+1)
};

bool compare(const Item& a, const Item& b)
{
    if (a.priority != b.priority)
    {
        return a.priority > b.priority;
    }
    else
    {
        return a.id < b.id;
    }
}

int main(){
    Item final[100] = {};
    i64 final_stack = 0;

    // 插入数据示例:
    // final[final_stack].id = 123;
    // final[final_stack].priority = 456;
    // final_stack++;

    sort(final, final + final_stack, compare);
}

为什么之前的修改无效?

  • 加const的版本:仅修改了指针的const属性,但参数类型还是i64*,和i64[2]不兼容,编译器依然无法匹配。
  • 用void*的版本:这是C语言qsort的用法,C++的std::sort是模板函数,要求比较函数参数类型必须明确匹配迭代器指向的元素类型,不接受void*参数。

内容的提问来源于stack exchange,提问作者딸기토끼

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:05:07