web-dev-qa-db-fra.com

Comment initialiser un tableau 3D en C ++

Comment initialiser un tableau 3D en C++

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

Le tableau de votre question n'a qu'un seul élément, vous n'avez donc besoin que d'une seule valeur pour l'initialiser complètement. Vous avez besoin de trois ensembles d'accolades, un pour chaque dimension du tableau.

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

Un exemple plus clair pourrait être:

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

Comme vous pouvez le voir, il existe deux groupes, chacun contenant trois groupes de 4 chiffres.

61
Carl Norum

Au lieu de tableaux multidimensionnels statiques, vous devriez probablement utiliser un tableau unidimensionnel et calculer l'indice par multiplication. Par exemple.

class Array3D {
    size_t m_width, m_height;
    std::vector<int> 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 alloue le stockage de manière dynamique, ce qui est une bonne chose car l'espace de pile est souvent très limité et les tableaux 3D utilisent facilement beaucoup d'espace. L'enrouler dans une classe comme celle-ci rend également le passage du tableau (par copie ou par référence) à d'autres fonctions trivial, tout en faisant tout passage de tableaux statiques multidimensionnels est très problématique.

Le code ci-dessus n'est qu'un exemple et pourrait être optimisé et rendu plus complet. Il existe également certainement des implémentations existantes de cela dans diverses bibliothèques, mais je n'en connais pas.

9
Tronic

Voici une autre façon d'allouer dynamiquement un tableau 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;
        }
    }
}
7
Kenny Cason

Tout le monde semble oublier std::valarray. C'est le modèle STL pour les tableaux multidimensionnels plats, et les indexer et les découper.

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

Pas d'initialisation statique, mais est-ce vraiment essentiel?

3
Potatoswatter