如何使用std::sort对数组的数组进行排序?

3

我有这样的数组:

long my_array_left[n][2];

我为此编写了一个比较函数,它接受包含两个元素的数组并按照数组的第一个元素进行排序:
struct sort_left {
    bool operator()(const long &left[2], const long &right[2]) {
        return left[0] < right[0];
    }
}

然后我使用库函数 std::sortmy_array_left[n][2] 进行排序。

sort(begin(my_array_left), end(my_array_left), sort_left());

但我遇到了一个错误:参数类型不匹配:'long **'和'long [2] *'不兼容的指针类型

我该如何解决这个问题?


4
好的,请提供需要翻译的原文或问题。 - NathanOliver
你的编译器真的说 long[2]* 吗? - aschepler
@aschepler 没错! - kotokbek
1个回答

4

你的直接问题可以通过使用一个真正接受数组引用而不是指针引用的比较器来解决:

struct sort_left {
    bool operator()(const long (&left)[2], const long (&right)[2]) {
        return left[0] < right[0];
    }
};

但是由于你不能将一个数组分配给另一个数组,所以你的代码无法编译。
你可以通过使用 std::array 来避免这种情况:
array<array<long, 2>, N> arr{};
sort(arr.begin(), arr.end());

新增的好处是,如果arrayvalue_type定义了operator<,那么它将自动定义。

我不知道将std::array用作std::arrayvalue_type会是可排序的。很棒!http://coliru.stacked-crooked.com/a/a232eca55a5fa6cb - caps
错误:‘N’的值在常量表达式中不可用 array<array<long, 2>, N> arr; - kotokbek
是的,在C++中你不能有可变大小的数组。如果你正在使用它作为一个gcc扩展,可以使用array<long, 2> arr[n],然后sort(arr, arr+n); - krzaq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接