Comment lire directement une énorme quantité de mémoire dans std :: vector?

J’ai un énorme tableau contigu x que je fread d’un fichier.

Comment déposer ce bloc dans un std::vector ? En d’autres termes, je préfère avoir le résultat dans std::vector plutôt que dans le tableau, mais je veux que le code C ++ résultant soit aussi efficace que cette version C simple, qui place le bloc directement dans le tableau.

En cherchant, je pense que je devrais peut-être utiliser placement-new sous une forme ou une autre, mais je ne suis pas sûr de la séquence d’appels et des problèmes de propriété. De plus, dois-je m’inquiéter des problèmes d’alignement?

Je teste avec T = unsigned , mais je m’attends à ce qu’une solution raisonnable fonctionne pour toute structure de POD.

 using T = unsigned; FILE* fp = fopen( outfile.c_str(), "r" ); T* x = new T[big_n]; fread( x, sizeof(T), big_n, fp ); // how do I get x into std::vector v // without calling a gazillion push_backs() or copies ?!? delete[] x; fclose( fp ); 

Vous utilisez le constructeur std::vector qui définit la taille du vecteur et utilisez std::vector::data pour obtenir un pointeur sur la mémoire allouée.

Garder avec votre utilisation de fread :

 std::vector x(big_n); fread(x.data(), sizeof(T), big_n, fp); 

Comme l’ont noté d’autres personnes, l’utilisation de fread si le type T n’est pas un type POD ne fonctionnera probablement pas. Vous pouvez ensuite utiliser les stream C ++ et std::istreambuf_iterator pour lire le fichier dans le vecteur. Cependant, cela a l’inconvénient de faire une boucle sur tous les éléments du fichier, et si big_n est aussi gros que ça en a l’air, il peut s’agir d’un problème de performances.


Cependant, si le fichier est vraiment volumineux, je recommande plutôt d’utiliser un mappage de mémoire pour lire le fichier.

Cela lira le fichier dans un vecteur en utilisant

 #include  #include  #include // ... std::ifstream testFile("testfile", std::ios::binary); std::vector fileContents((std::istreambuf_iterator(testFile)), std::istreambuf_iterator()); 

Cette réponse provient d’une réponse précédente: https://stackoverflow.com/a/4761779/942596