用std :: sort排序二维C数组

时间:2018-09-15 17:31:28

标签: c++ arrays sorting stl

我似乎无法使用std :: sort对二维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);

2 个答案:

答案 0 :(得分:2)

  

也许可以通过某种方式将其转换为std::array而无需复制   它吗?

也许本身没有变成std::array,但是另一种方法可能是将2D C样式的数组投射 到{{1} } 引用仅用于排序。这样做的依据是,在内存中表示std::array表示形式的标准至少要以其等效的 C样式数组开始。请参见[array.overview§2]下的此处:

  

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

在实践中,std::array的以下用法很可能是安全的,但请注意,除非标准中某处对其有特殊例外,否则它的形式将是不确定的行为:

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 的使用,请注意it is potentially slower than std::sort(),因为后者允许内联比较,而前者则不允许。

答案 1 :(得分:1)

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

数组不可MoveAssginable(也不能分配)。

尝试使用结构数组或std::pair代替。