2010-11-02 11 views
5

Sin escribir un rdbuf personalizado, ¿hay alguna forma de utilizar un stringstream de manera eficiente? Es decir, con los siguientes requisitos:std :: stringstream forma eficiente de obtener datos escritos, copiar a otra corriente

  • la corriente se puede restablecer y escritura empezar de nuevo sin borrar la memoria anterior
  • conseguir un const char * a los datos escritos (junto con la longitud) sin crear un temporal
  • puebla la secuencia sin crear una cadena temporal

Si alguien puede darme un "no" definitivo, sería genial.

Ahora, también uso boost, así que si alguien puede proporcionar una alternativa de impulso que hace esto sería genial. Es tiene para tener interfaces istream y ostream disponibles.

+1

Siempre he estado preguntándome sobre esto yo mismo. Veamos qué respuestas surgen. –

Respuesta

5

Use boost::interprocess::vectorstream or boost::interprocess::bufferstream. Estas clases básicamente cumplen con todos sus requisitos.

boost::interprocess::vectorstream no devolverá un const char*, pero devolverá una referencia constante a una clase de contenedor interno, (como un vector interno), en lugar de devolver una copia de cadena temporal. Por otro lado, boost::interprocess::bufferstream básicamente le permitirá usar cualquier búfer arbitrario como flujo de E/S, lo que le da control total sobre la asignación de memoria, por lo que puede usar fácilmente un búfer char si lo desea.

Estas son dos grandes clases, y reemplazos maravillosos para std::stringstream, que, en mi opinión, siempre se ha visto obstaculizado por el hecho de que no le da acceso directo al búfer interno, lo que resulta en la creación innecesaria de temporal objetos de cuerda. Es una pena que estas clases sean algo oscuras, escondidas en la biblioteca de interproceso.

+0

Genial. Sí, nunca pensé buscar en la biblioteca de interproceso. Voy a probar esto. –

Cuestiones relacionadas