Cómo inicializar una matriz 3D en C ++

Cómo inicializar una matriz 3d en C ++

int min[1][1][1] = {100, { 100, {100}}}; //this is not the way 

El conjunto de preguntas tiene solo un elemento, por lo que solo necesita un valor para inicializarlo por completo. Necesitas tres juegos de llaves, uno para cada dimensión de la matriz.

 int min[1][1][1] = {{{100}}}; 

Un ejemplo más claro podría ser:

 int arr[2][3][4] = { { {1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4} }, { {1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4} } }; 

Como puede ver, hay dos grupos, cada uno con tres grupos de 4 números.

En lugar de matrices multidimensionales estáticas, probablemente debería utilizar una matriz unidimensional y calcular el índice por multiplicación. P.ej

 class Array3D { size_t m_width, m_height; std::vector m_data; public: Array3D(size_t x, size_t y, size_t z, int init = 0): m_width(x), m_height(y), m_data(x*y*z, init) {} int& operator()(size_t x, size_t y, size_t z) { return m_data.at(x + y * m_width + z * m_width * m_height); } }; // Usage: Array3D arr(10, 15, 20, 100); // 10x15x20 array initialized with value 100 arr(8, 12, 17) = 3; 

std :: vector asigna el almacenamiento dinámicamente, lo cual es bueno porque el espacio de la stack es a menudo muy limitado y las matrices 3D usan fácilmente mucho espacio. Envolverlo en una clase como esa también hace que pasar la matriz (por copia o por referencia) a otras funciones sea trivial, mientras que hacer cualquier paso de arreglos estáticos multidimensionales es muy problemático.

El código anterior es simplemente un ejemplo y podría optimizarse y hacerse más completo. También existen implementaciones existentes de esto en varias bibliotecas, pero no conozco ninguna.

Aquí hay otra forma de asignar dinámicamente una matriz 3D en C ++.

 int dimX = 100; int dimY = 100; int dimZ = 100; int*** array; // 3D array definition; // begin memory allocation array = new int**[dimX]; for(int x = 0; x < dimX; ++x) { array[x] = new int*[dimY]; for(int y = 0; y < dimY; ++y) { array[x][y] = new int[dimZ]; for(int z = 0; z < dimZ; ++z) { // initialize the values to whatever you want the default to be array[x][y][z] = 0; } } } 

Todo el mundo parece olvidar std::valarray . Es la plantilla STL para matrices multidimensionales planas, y las indexa y las corta.

http://www.cplusplus.com/reference/std/valarray/

No hay inicialización estática, pero ¿es realmente esencial?