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