C++ - как создать двумерный массив с неопределённым количеством элементов?

Как объявлять двумерные (и больше-уровневые) массивы с неопределённым заранее количеством элементов в нём? С одномерным можно сделать так: int arr[] = { 0 }; Однако, следующим образом не получается: int arr[][] = { { 0 } }; Как быть?


Ответы (2 шт):

Автор решения: Egorithm

В Си только одна (первая) размерность может быть неопределена явно. Но она неопределена только для вас. Компилятор её вычисляет, и в рантайме это будет массив фиксированной длины.

Есть такая штука как variable-length arrays (VLA), но она есть только в стандарте чистого Си (и то, по-моему только в C99). Однако многие C++ компиляторы её поддерживают, но лучше эту "особенность" никогда не использовать. Как минимум потому, что можно запросто получить переполнение стека.

Многомерные массивы (особенно динамические) лучше сводить к одномерным. Зная размер каждой размерности, несложно из физически одномерного массива получить многомерный:

int array[x][y][z];
for (int i = 0; i < x; ++i)
    for (int j = 0; j < y; ++j)
        for (int k = 0; k < z; ++k)
            array[i][j][k];

int array[x*y*z];
for (int i = 0; i < x; ++i)
    for (int j = 0; j < y; ++j)
        for (int k = 0; k < z; ++k)
            array[i*y*z + j*z + k];
→ Ссылка
Автор решения: AlexGlebe

Так работает, но это уже массив указателей на массив с разной рамерностью строк. Будьте внимательны.

int line0 [ ] = { 0 } ;
int line1 [ ] = { 1 , 2 } ;
int line2 [ ] = { 3 , 4 , 5 } ;
int * arr [ ] = { line0 , line1 , line2  } ;
int main ( ) {
  arr [ 1 ] [ 1 ] = 7 ;
  }
→ Ссылка