使用std :: sort对2维c数组进行排序

问题描述 投票:2回答:2

我似乎无法使用std :: sort对2维c数组进行排序。然而,我可以对一维数组进行排序。这是我在c ++程序中处理一个c数组并希望排序而不将其复制到std :: array的情况。也许有一些方法可以将它变成std :: array而不复制它?这听起来很让我怀疑,因为任何std :: array都会在内存上调用它不拥有的析构函数。

排序一维c样式数组工作得很好:

int len = 5;
auto one_dim_less = [](int a, int b){
  return a < b;
};
int one_dim[] = {4, 0, 3, 1, 2};
std::sort(one_dim, one_dim + len, one_dim_less);

尝试按第二个数字排序二维c样式数组不会编译:

int len = 5;
auto two_dim_less = [](int a[2], int b[2]){
  return a[1] < b[1];
};
int two_dim[][2] = {{1,8}, {2,4}, {3,10}, {4,40}, {5,1}};
std::sort(two_dim, two_dim + len, two_dim_less);
c++ arrays sorting stl
2个回答
2
投票

也许有一些方法可以把它变成std::array而不复制它?

也许不会变成std::array本身,但另一种方法可能是将2D C风格的数组转换为仅用于排序的std::array参考。这样做是依赖于标准,说内存中的std::array表示至少从其C风格的数组等效开始。在[array.overview§2]下看到:

数组是一个聚合,可以使用最多N个元素进行列表初始化,这些元素的类型可以转换为T.

在实践中,reinterpret_cast的以下用法很可能是安全的,但要注意除非标准中某处有特殊的例外,否则它将正式成为未定义的行为:

#include <algorithm>
#include <array>
#include <iostream>

int main() {
  auto two_dim_less = [](std::array<int, 2>& a, std::array<int, 2>& b) {
      return a[1] < b[1]; };

  int two_dim[][2] = {{1, 8}, {2, 4}, {3, 10}, {4, 40}, {5, 1}};

  std::array<std::array<int, 2>, 5>& arr =
    *reinterpret_cast<std::array<std::array<int, 2>, 5>*>(&two_dim);

  std::sort(arr.begin(), arr.end(), two_dim_less);

  for (int i = 0; i < 5; i++)
    std::cout << two_dim[i][0] << ", " << two_dim[i][1] << '\n';

  return 0;
}

输出:

5, 1
2, 4
1, 8
3, 10
4, 40

关于std::qsort()的使用,请注意it is potentially slower than std::sort()由于后者允许内联比较,而前者没有。


1
投票

std::sort() requires用于排序为MoveAssginable的对象。

数组不是MoveAssginable(也不是可分配的)。

尝试使用一组结构或std::pairs。

© www.soinside.com 2019 - 2024. All rights reserved.