En primer lugar, un std::stringbuf
hace no necesariamente (o incluso ordinariamente) utilizar un std::string
para su almacenamiento interno. Por ejemplo, la norma describe la inicialización de un std::string
de la siguiente manera:
construye un objeto de la clase basic_stringbuf ... entonces copia el contenido de str en el basic_stringbuf secuencia de caracteres subyacente [...]
Tenga en cuenta la fraseología: "secuencia de caracteres" - al menos para mí, esto parece ser bastante cuidadoso para evitar decir (o incluso implicar) que el contenido debe almacenarse en una cadena real.
Pasado eso, creo que la eficiencia es probablemente una pista falsa. Ambas son envolturas bastante delgadas para gestionar búferes asignados dinámicamente de algún tipo de secuencia tipo carácter. Hay una gran diferencia en las capacidades (por ejemplo, string
tiene mucha búsqueda e inserción/eliminación en el medio de una cadena que están completamente ausentes de stringbuf
). Dado su propósito, podría tener sentido implementar stringbuf
encima de algo como std::deque
, para optimizar la ruta (habitual) de inserción/eliminación en los extremos, pero es probable que esto no sea importante para la mayoría de los usos.
Si lo estuviera haciendo, probablemente estaría más preocupado por el hecho de que stringbuf
es probable que sólo ensayaba junto con stringstream
, por lo que si he usado de manera diferente que stringstream
hiciera, podría encontrar problemas, incluso si estoy siguiendo lo que la norma dice que debe apoyar.
Realmente preguntaría al revés: ¿por qué diablos usar 'stringbuf' cuando' string' tiene muchos más métodos disponibles, masoquismo? Supongo que vienes de Java o C# con su clase de trabajo StringBuilder ... –
@MatthieuM.: no, soy un programador de C++, pero sí por qué ostringstream usa stringbuf internamente en lugar de la cadena – Guillaume07
Eso es completamente diferente. Todas las clases derivadas de 'ostream' usan un buffer que se deriva de [streambuf] (http://www.cplusplus.com/reference/iostream/streambuf/), por lo tanto' stringbuf' es solo un contenedor alrededor de 'string' que hereda de 'streambuf' para que pueda ser utilizado allí. Aplicación típica del patrón de Adaptador o Puente. –