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.
3 Réponses :
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
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);
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.
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,
doubleest de 8 octets, donc la taille deMserait 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).