1
votes

Comment déclarer un tableau multidimensionnel avec une taille spécifique?

J'ai initialement déclaré par array:

std::vector<std::vector<int>> array = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };

Cependant, il plantera pendant l'exécution.

Je prévois d'utiliser vector:

J'ai trouvé un exemple de tableau 2D:

constexpr auto array_size = 50000000; 
double M[array_size][2][20]= { };

Cependant, je ne sais pas comment attribuer la taille du vecteur (ex: 50000000) à chaque dimension.

Peut-être que «nouveau» sera plus facile, mais je ne sais pas comment le déclarer.

Merci.


6 commentaires

Reproduction possible de Vecteurs multidimensionnels en C ++


std :: vector >> M (50000000, std :: vector > (2, std :: vector ( 20)));


Si ces deux dimensions inférieures sont vraiment fixes, vous ne voulez pas d'un vecteur de vecteur de vecteur; vous voulez un std :: vector de std :: array de std :: array. Gardez à l'esprit, cependant, l'exigence d'une région contiguë pour une telle chose, en particulier pour des tailles comme ce que vous regardez. Vous pouvez être forcé à un vecteur de vecteur de tableau.


La taille du tableau que vous allouez est tout simplement trop importante pour être conservée sur la pile. Sur mon ordinateur, double est de 8 octets, donc la taille de M serait de 16 Go.


Cependant, je ne sais pas comment attribuer la taille du vecteur (ex: 50000000) à chaque dimension. Un tableau en 3 dimensions avec 50'000'000 dans chaque direction avec double comme type, en résulterait en 1 octet ... vous aurez probablement du mal à trouver de la RAM ...


@ user1810087 que la bonté deux de ces dimensions sont fixes et petites (2, 20). (en fait, les trois dans ce cas).


3 Réponses :


0
votes

std :: vector est une classe de type tableau à l'exécution. std :: array est une classe de type tableau au moment de la compilation.

Je ne peux que supposer qu'elle plante car 50000000 est une énorme quantité de RAM à allouer pour un seul objet et je ne peux que supposer que vous faites cela plusieurs fois.

pour redimensionner un std :: vector , utilisez le membre de la fonction resize (uNewSize) comme ceci:

std::vector< int > vecIntegers { 1, 2, 3 }; // size is 3.
vecIntegers.resize( 4 );
vecIntegers[ 3 ] = 4;
for ( auto integer: vecIntegers )
    std::cout << integer << ' ';

Ce programme affichera 1 2 3 4 .

Tableaux multidimensionnels de std :: vector se font en les imbriquant comme dans votre question:

std :: vector >> vec3d;


0 commentaires

0
votes

Vous pouvez utiliser le membre resize de std :: vector:

for (auto &vec : multivec) 
   vec.resize(midsize);

etc pour la boucle interne

ou en utilisant une boucle for range (après redimensionnement) p >

std::vector<std::vector<std::vector<double>>> multivec;

multivec.resize(outersize);
for (int i = 0; i < outersize; ++i)
   multivec[i].resize(midsize);


0 commentaires

0
votes

Si vos données sont de taille fixe, std :: array est le préféré.

#include <iostream>
#include <array>    

    int main() {             
        using array1d =  std::array<int, 2>;
        using array2d = std::array<array1d, 50>;
        std::array<array2d,5000> a1;  

        std::cout << "size = "<< sizeof(a1);
        return 0;
    }

2 * 20 * 50000000 = 2 Go, le programme plantera lors de l'attribution de cette mémoire dynamique.


0 commentaires