Maison > développement back-end > C++ > Comment lire efficacement un fichier dans un std :: vector ?

Comment lire efficacement un fichier dans un std :: vector ?

Susan Sarandon
Libérer: 2024-11-09 18:13:02
original
222 Les gens l'ont consulté

How to Efficiently Read a File into a std::vector?

Lecture efficace d'un fichier dans std::vector

Dans certains scénarios, la lecture d'un fichier dans un std::vector l'efficacité est cruciale pour éviter les copies et les frais généraux inutiles. Une approche consiste à utiliser la méthode reserve() pour allouer de l'espace au vecteur, puis à utiliser read() pour remplir le vecteur.

std::ifstream testFile("testfile", "rb");
std::vector<char> fileContents;
int fileSize = getFileSize(testFile);
fileContents.reserve(fileSize);
testFile.read(&fileContents[0], fileSize);
Copier après la connexion

Cependant, cette approche échoue lors du redimensionnement du vecteur avec reserve(), car il n'insère pas réellement d'éléments dans le vecteur. Par conséquent, toute tentative d'accès à fileContents[0] provoquera une erreur.

Approche alternative utilisant des itérateurs

Une solution plus complète implique l'utilisation d'itérateurs. À l'aide d'un flux de fichier d'entrée, l'extrait suivant permet une lecture efficace du fichier :

#include<iterator>

//...

std::ifstream testFile("testfile", std::ios::binary);
std::vector<char> fileContents((std::istreambuf_iterator<char>(testFile)),
                              std::istreambuf_iterator<char>());
Copier après la connexion

Cette approche utilise istreambuf_iterator pour parcourir le flux de fichier d'entrée et insérer des éléments directement dans le vecteur.

Gestion Réallocations

Si les réallocations sont un problème, reserve() peut être utilisé pour pré-allouer de l'espace dans le vecteur :

#include<iterator>

//...

std::ifstream testFile("testfile", std::ios::binary);
std::vector<char> fileContents;
fileContents.reserve(fileSize);
fileContents.assign(std::istreambuf_iterator<char>(testFile),
                     std::istreambuf_iterator<char>());
Copier après la connexion

Dans cette variante, reserve() est utilisé pour allouer de l'espace en fonction de la taille du fichier connue, et assign() est utilisé pour remplir le vecteur à l'aide d'itérateurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal