2012-04-25 30 views
6

Cuando tenemos que trabajar con la manipulación de cadenas, ¿hay alguna diferencia significativa en el rendimiento entre std :: string y std :: stringbuf, y si es así por qué?performance stringbuf vs cadena

Más generalmente, cuando es bueno usar std :: stringbuf sobre std :: string?

+2

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 ... –

+0

@MatthieuM.: no, soy un programador de C++, pero sí por qué ostringstream usa stringbuf internamente en lugar de la cadena – Guillaume07

+0

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. –

Respuesta

6

A std::stringbuf utiliza una cadena internamente para almacenar datos en el búfer, por lo que es probable que sea un poco más lento. No creo que la diferencia sea significativa, porque básicamente es solo delegación. Sin embargo, para asegurarse de que tendrías que ejecutar algunas pruebas de rendimiento.

std::stringbuf es útil cuando desea que un flujo de IO utilice una cadena como búfer (como std::stringstream, que usa un std::stringbuf de manera predeterminada).

+0

La pregunta aún no ha sido respondida: _hay alguna __significacióny__ diferencia de rendimiento_. Siguiendo su lógica: 'std :: string' internamente usa matrices' char', entonces no, solo debe seguir con las matrices 'char'. –

+0

@MaximYegorushkin: Tiene razón, lo corregí. –

3

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.

0

std::stringbuf extiende std::string contenedor, para leer y escribir en std::string.

En general, no hay una diferencia de rendimiento significativa entre std::string y std::stringbuf.

Debido std::streambuf <-std::stringbuf, tanto porque:

typedef basic_stringbuf<char> stringbuf;  
typedef basic_string<char> string; 

Leer this para más detalles.