【发布时间】:2020-04-16 11:46:44
【问题描述】:
如下代码所示,对二维数组进行排序是否安全?
int a[3][3];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cin >> a[i][j];
}
}
sort(&a[0][0], &a[0][0] + 3 * 3); // the built-in sort function
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << a[i][j] << ' ';
}
cout << '\n';
}
我们可以将这种方式推广到任何多维数组吗?
【问题讨论】:
-
我认为这是迂腐的 UB。
a[0]只是一个包含 3 个元素的数组...a[0][0] + 9不属于它的数组。 -
@Jarod42
std::sort对 [first,last) 范围内的元素进行排序。那么,这有什么问题呢? -
我不确定它是否是一个有效范围,因为 2 个指针属于不同的数组。标准对指针运算有特定的规则。
int [3][3]不是int [9],即使它们具有相同的布局。 -
这能回答你的问题吗? Treating 2D array as 1D array
-
重复询问是否合法,而您要求安全。甚至碰巧你们都以
std::sort为例。仅当您可以将 2D 数组视为 1D 数组时,您才能使用这样的排序,根据重复项似乎并非如此。