Come inizializzare l’array 3D in C ++

Come inizializzare un array 3d in C ++

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

L’array nella tua domanda ha solo un elemento, quindi hai solo bisogno di un valore per inizializzarlo completamente. Sono necessari tre set di parentesi, uno per ogni dimensione dell’array.

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

Un esempio più chiaro potrebbe essere:

 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} } }; 

Come puoi vedere, ci sono due gruppi, ciascuno contenente tre gruppi di 4 numeri.

Invece di array multidimensionali statici dovresti probabilmente usare una matrice monodesmensionale e calcolare l’indice per moltiplicazione. Per esempio

 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 assegna dynamicmente lo storage, il che è una buona cosa perché lo spazio dello stack è spesso molto limitato e gli array 3D utilizzano facilmente molto spazio. Il wrapping in una class come quella rende anche banale il passaggio (per copia o per riferimento) ad altre funzioni, mentre fare qualsiasi passaggio di array statici multidimensionali è molto problematico.

Il codice sopra riportato è semplicemente un esempio e potrebbe essere ottimizzato e reso più completo. Esistono certamente anche implementazioni esistenti di questo in varie librerie, ma non ne conosco nessuna.

Ecco un altro modo per allocare dynamicmente un array 3D in 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; } } } 

Tutti sembrano dimenticare std::valarray . È il modello STL per gli array multidimensionali piatti e li indicizza e li affetta.

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

Nessuna inizializzazione statica, ma è davvero essenziale?