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,提问作者딸기토끼
相关产品推荐
相关产品推荐

