Многомерный динамический массив
Подскажите, как создать многомерный динамический массив.
Пример:
было
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
Чтобы было проще переписывать, используйте классы.
// 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 ] ; }