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
193 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!

source:php.cn
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