我正在尝试反转二维 double 组的行。 由于数组是动态的,因此它的创建方式如下
double** revArr = new double*[m];
for (int i = 0; i < m; i++)
revArr[i] = new double[n];
我最终通过正常方式将原始数组复制到反转数组
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
revArr[i][j] = arr[i][j];
现在最精彩的部分来了!然后我尝试反转数组的行,并尝试了几种不同的方法。
int start = 0, end = n;
for (int i = 0; i < m; i++) {
while (start < end)
{
double *temp = revArr[start];
revArr[start] = revArr[end];
revArr[end] = temp;
start++; end--;
}
}
由于该数组是一个 double* 数组,它会抛出一个 SegFault,我不确定如何修复!
我尝试过使用 std::swap
,我尝试过使用 std::reverse
,我不太确定从这里转向哪里。
最小可重现示例:
#include <iostream>
int main() {
int m = 4, n = 4;
double* arr = new double[m];
for (int i = 0; i < m; i++)
arr[i] = new double[n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
arr[i][j] = i + j;
int start = 0; end = n;
for (int i = 0; i < m; i++) {
while (start < end)
{
double *temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++; end--;
}
}
}
最佳答案
编辑:从下面OP的评论来看,他似乎想交换每行上的数字而不是行本身。代码应更改为:
for (int i = 0; i < m; i++) {
for (int j = 0; j < n / 2; j++) {
std::swap(arr[i][j], arr[i][n - j - 1]);
}
}
以下是我的一些建议:
- 使用标准库:标准库的存在是有原因的,没有理由不使用它。例如,您可以像这样轻松地反转数组:
for (int i = 0; i < m; i++)
std::reverse_copy(arr[i], arr[i] + n, revArr[i]); // if you are copying the reversed array onto another
或者
for (int i = 0; i < m; i++)
std::reverse(arr[i], arr[i] + n); // Copy the reversed result onto the same array
- 请务必记住在使用后
删除[]
您的new[]
编辑的数组,或考虑使用smart pointers甚至std::vector
。在这种情况下:
for (int i = 0; i < m; i++)
delete[] arr[i];
delete[] arr;
关于c++ - 二维阵列反转线中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61104956/