¿Manera eficiente de leer un archivo en std :: vector ?

Me gustaría evitar copias innecesarias. Estoy apuntando a algo como:

std::ifstream testFile( "testfile", "rb" ); std::vector fileContents; int fileSize = getFileSize( testFile ); fileContents.reserve( fileSize ); testFile.read( &fileContents[0], fileSize ); 

(lo cual no funciona porque la reserve no inserta nada en el vector, por lo que no puedo acceder a [0] ).

Por supuesto, std::vector fileContents(fileSize) funciona, pero hay una sobrecarga de inicialización de todos los elementos ( fileSize puede ser bastante grande). Lo mismo para resize() .

Esta pregunta no se trata tanto de cuán importante sería esa sobrecarga. Por el contrario, solo tengo curiosidad por saber si hay otra manera.

La forma canónica es esta:

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

Si le preocupan las reasignaciones, reserve espacio en el vector:

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

Si desea una lectura verdadera de copia cero, es decir, para eliminar la copia del kernel al espacio del usuario, simplemente asigne el archivo a la memoria. Escriba su propio contenedor de archivos mapeados o use uno de boost::interprocess .

Si te entiendo correctamente, quieres leer cada elemento pero no quieres cargarlo todo en el fileContents . fileContents , ¿correcto? Personalmente, no creo que esto haga copias innecesarias porque abrir archivos varias veces disminuiría el rendimiento más. Leer una vez en un fileContents vector de contenido es una solución razonable en este caso.