Многомерный динамический массив

Подскажите, как создать многомерный динамический массив. Пример: было int a[4][4][4] теперь хочу как-то так int b; cin >> b; int * a = new int[b][b][b] //так не работает по аналогии с int * a = new int[] Необходимо что-то подобное, чтобы сильно не переписывать готовый код.


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

Автор решения: Стас

Как-то так

// создание
int h, w, d; cin >> h >> w >> d;

int*** data = new int**[h];

for (int i = 0; i < h; ++i) {
    data[i] = new int* [w];
    for (int y = 0; y < w; ++y) {
        data[i][y] = new int[d];
    }
}

// удаление
for (int i = 0; i < h; ++i) {
    for (int y = 0; y < w; ++y) {
        delete[]  data[i][y];
    }
    delete[] data[i];
}
delete[] data;

А теперь по подробнее.

int h, w, d; cin >> h >> w >> d; - как обычно, переменные высота, ширина, глубина массива.

int*** data = new int**[h]; - создаём указатель на будущий массив двумерных массивов (он же трёхмерных массив).

Далее выделяем память под каждый двумерных массив (data[i] = new int* [w];), и для каждого двумерного массива выделяем память для его одномерных массивов (data[i][y] = new int[d];).

Ну и удаление - те же действия, только наоборот.


Пример использования (заполнение массива)

#include <iostream>

int main()
{
    int h, w, d; std::cin >> h >> w >> d;

    int*** data = new int**[h];

    for (int i = 0; i < h; ++i) {
        data[i] = new int* [w];
        for (int y = 0; y < w; ++y) {
            data[i][y] = new int[d];
        }
    }

    for (int k = 0, c = 0; k < h; ++k) {
        for (int i = 0; i < w; ++i) {
            for (int y = 0; y < d; ++y, ++c) {
                data[k][i][y] = c;
            }
        }
    }

    for (int k = 0; k < h; ++k) {
        for (int i = 0; i < w; ++i) {
            for (int y = 0; y < d; ++y) {
                std::cout << data[k][i][y] << " ";
            }
        }
    }

    for (int i = 0; i < h; ++i) {
        for (int y = 0; y < w; ++y) {
            delete[]  data[i][y];
        }
        delete[] data[i];
    }
    delete[] data;

    return 0;
}

Input:

10 5 3

Output:

0 1 2 3 ... 149

→ Ссылка
Автор решения: AlexGlebe

Чтобы было проще переписывать, используйте классы.

// g++-9 -Wall -std=c++98 -Wextra -Wpedantic cube.cpp -o cube
class cube  {
public :
  cube(int dim);
  ~cube();
  int & elt(int i,int j,int k);
private :
  int d ;
  int * ap ;
} ;

# include <iostream>
using std :: cin ;

int main(){
  int b ;
  cin >> b ;
  cube  cub(b);
  cub.elt(1,1,1) = 7;
}

cube::cube(int dim):d(dim),ap() {
  ap = new int [ d * d * d ] ; }

cube :: ~ cube () {
  delete [] ap ; }

int & cube :: elt (int i,int j,int k) {
  return ap [ k + ( j  + i * d ) * d ] ; }
→ Ссылка