C++ 通过1D迭代访问2D阵列

C++ 通过1D迭代访问2D阵列,c++,c++11,C++,C++11,如果我按如下方式定义数组: int rows = 10; int cols = 10; double **mat; mat = new double*[rows]; mat[0] = new double[rows*cols]; for(int r=1; r<10; r++) mat[r] = &(mat[0][r*cols]); 达到与…相同的目的 mat[1][0] = 1; 是否有方法取消对双**数组的引用以执行此操作 mat[row * cols + col

如果我按如下方式定义数组:

int rows = 10;
int cols = 10;

double **mat;
mat = new double*[rows];
mat[0] = new double[rows*cols];

for(int r=1; r<10; r++)
    mat[r] = &(mat[0][r*cols]);
达到与…相同的目的

mat[1][0] = 1;
是否有方法取消对双**数组的引用以执行此操作

mat[row * cols + column]
其中,
是要访问的行,
是要访问的列


当然,在数组上的迭代只会涉及某种循环(最适合的是
for
),并且每次只应用模式。

根据
mat
的定义,您可以执行以下操作:

double* v = mat[0]; 'use v a uni-dimensional vector
for(int i =0; i< rows* cols; i++) v[i] = 1;

现在,您可以选择使用
mat
在一维中跨越矩阵,或者使用
mat
宏在二维中跨越矩阵。你需要访问
mat[0][row*cols+column]
@Dúthomhas你是什么意思?OP的数组不是平坦的
mat
是指针数组
mat[0]
是一个由
行*cols
值组成的数组。Dúthomhas是正确的,这是预先存在的代码,这就是为什么我不能根据自己的喜好重新定义数组的原因。。。。我没有看到这一点,我感到很抱歉。谢谢dude@RobinHartland这是可能的,也很有趣,但我见过一些(主要是C)编译器不接受这一点,所以我一般倾向于避免使用它。此外,这将不允许
mat[1][0]
mat[1][0]
,而是
mat(1,0)
mat(1,0)
。没错,你的答案就不那么令人困惑了:P
double* v = mat[0]; 'use v a uni-dimensional vector
for(int i =0; i< rows* cols; i++) v[i] = 1;
double mat[rows * cols];
#define MAT(i, j) mat[i*cols + j]

MAT(1, 0) = 1;
<=>
mat[10] = 1