2016-01-01 2 views
0

Если я определить массив следующим образом:Доступ 2D массив с 1D итерация

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]); 

Как перебрать этот массив через 1-измерение? . Я хотел бы сделать следующее:

mat[10] = 1; 

, чтобы достичь того же, как

mat[1][0] = 1; 

Есть ли способ разыменования двойной ** массив, чтобы сделать это?

ответ

1

С вашим определением mat, вы можете сделать это:

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

В качестве альтернативы, если то, что вы хотели, чтобы определить mat себя как уни-мерный вектор и использовать его как двухмерное в сложной дороге :

double mat[rows * cols]; 
#define MAT(i, j) mat[i*cols + j] 

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

теперь у вас есть варианты, чтобы охватить матрицу в одном измерении с помощью mat или би-измерение с помощью MAT макро

+1

@ RobinHartland возможно и интересно, но я видел некоторые (главным образом C) компиляторы, которые не согласятся с этим, поэтому я предпочитаю избегать этого вообще. Более того, это НЕ разрешит 'mat [1] [0]' или 'MAT [1] [0]', но 'mat (1, 0)' или 'MAT (1, 0)'. –

+0

правда, а ваш менее запутанный: P –

1
mat[row * cols + column] 

где row это строка вы хотите получить доступ и column это столбец вы хотите получить доступ.

Конечно, итерация по массиву будет включать какой-то цикл (лучше всего подходит for) и просто применяя шаблон каждый раз.

+2

К сожалению. Вам нужно получить доступ к 'mat [0] [row * cols + column]'. –

+0

@ Dúthomhas Что значит? – qwertz

+0

Массив OP не является плоским. 'mat' - это массив _pointers_. 'mat [0]' - это массив значений 'rows * cols'. –

Смежные вопросы