string vs. stringstream (eficiencia)
Publicado por Leo Lucas Ledesma (2 intervenciones) el 10/04/2015 06:48:12
Hace poco se me plantó una pequeña duda que no puedo resolver. A la hora de cargar un texto desde un flujo de entrada, ¿qué es más eficiente en cuanto a memoria? ¿string o stringstream?
Supongamos que tenemos esta función:
La función recibe el nombre de un archivo y una referencia a string, lee línea por línea desde un flujo y lo carga en el string. Supongo que es uno de los métodos más usados y funciona perfectamente, pero en el caso donde tuvieran que leerse cantidades enormes de líneas de texto habría muchísimas peticiones de memoria.
Cada vez que el string texto tiene que crecer debe pedir más memoria dinámica y luego liberar la que reservó previamente, si el texto se vuelve muy grande este método se vuelve ineficiente... ¿cierto?
Entonces se me ocurrió esto:
Esta otra función cumple el mismo roll que la anterior, pero ignoro que es lo que está pasando en ese flujo stringstream, por ahí va mi duda, ¿este nuevo algoritmo es más eficiente en cuanto al uso de memoria? ¿es igual o peor?
Espero que alguien más experimentado pueda responder mi duda, desde ya muchas gracias.
Supongamos que tenemos esta función:
1
2
3
4
5
6
7
8
9
10
void cargar_texto( string nombre_archivo, string &texto ) {
ifstream entrada( nombre_archivo.c_str() );
string str;
while ( getline(entrada,str) ) {
texto += str + '\n';
}
}
La función recibe el nombre de un archivo y una referencia a string, lee línea por línea desde un flujo y lo carga en el string. Supongo que es uno de los métodos más usados y funciona perfectamente, pero en el caso donde tuvieran que leerse cantidades enormes de líneas de texto habría muchísimas peticiones de memoria.
Cada vez que el string texto tiene que crecer debe pedir más memoria dinámica y luego liberar la que reservó previamente, si el texto se vuelve muy grande este método se vuelve ineficiente... ¿cierto?
Entonces se me ocurrió esto:
1
2
3
4
5
6
7
8
9
10
11
void cargar_texto( string nombre_archivo, string &texto ) {
ifstream entrada( nombre_archivo.c_str() );
string str; stringstream ss;
while ( getline(entrada,str) ) {
ss<<str<<'\n';
}
texto = ss.str();
}
Esta otra función cumple el mismo roll que la anterior, pero ignoro que es lo que está pasando en ese flujo stringstream, por ahí va mi duda, ¿este nuevo algoritmo es más eficiente en cuanto al uso de memoria? ¿es igual o peor?
Espero que alguien más experimentado pueda responder mi duda, desde ya muchas gracias.
Valora esta pregunta


0