【发布时间】:2018-09-15 17:31:28
【问题描述】:
我似乎无法使用 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);
【问题讨论】:
-
问题是不能赋值C数组,比如
two_dim[0] = two_dim[1]无效。 -
与排序相比,复制整个数组所需的时间可以忽略不计,因此是否复制可能并不重要。请注意,如果行很长(不仅仅是像这里那样大小为 2),那么对侧面的键进行排序并在最后将最终排列应用于矩阵可能会更有效,以避免每次排序交换时复制整行 2元素。
-
@MarcGlisse 您对复制数组的时间提出了一个很好的观点。我希望我的服务需要 O(1) 空间,但在我制作完整副本时并非如此。另外,关于嵌套数组的内容。
-
注意:std::sort 不能保证就地排序。 (通常使用 introsort 实现,但如果使用插入排序,它可能会allocate memory for one additional element)