Me gustaría borrar y reutilizar un ostringstream (y el búfer subyacente) para que mi aplicación no tenga que hacer tantas asignaciones. ¿Cómo restablezco el objeto a su estado inicial?
c++
stl
reset
ostringstream
twk
fuente
fuente
Respuestas:
He usado una secuencia de clear y str en el pasado:
Lo que ha hecho lo mismo para los flujos de cadenas de entrada y salida. Alternativamente, puede borrar manualmente y luego buscar la secuencia apropiada para comenzar:
Eso evitará que se realicen algunas reasignaciones
str
al sobrescribir lo que esté en el búfer de salida actualmente. Los resultados son así:Si desea usar la cadena para funciones c, puede usar
std::ends
, poniendo un nulo de terminación como este:std::ends
es una reliquia de lo obsoletostd::strstream
, que pudo escribir directamente en una matriz de caracteres que asignó en la pila. Debía insertar un nulo de terminación manualmente. Sin embargo,std::ends
no está en desuso, creo que porque sigue siendo útil como en los casos anteriores.fuente
s.str("");
lugar.auto str = s.str(); auto cstr = str.c_str(); file << cstr; s.clear(); s.seekp(0); s << ends;
boost::any a = 1; std::ostringstream buffer; buffer << a << std::ends; EXPECT_EQ( buffer.str(), "any<(int)1>" );
TestUtilsTest.cpp:27: Failure Expected: buffer.str() Which is: "any<(int)1>\0" To be equal to: "any<(int)1>"
y si reutilizo con cadenas de diferente longitud, me quedan bitss.seekp(0); s << std::ends; s.seekp(0);
Parece ser que la
ostr.str("")
llamada hace el truco.fuente
Si va a borrar el búfer de una manera que hará que se borre antes de su primer uso, primero deberá agregar algo al búfer con MSVC.
fuente
clear
va causar elfailbit
conjunto que ser si la corriente está vacía. Mientras que la llamadaseekp
debería simplemente regresar si no existe ninguna transmisión.Tu no Use dos flujos con nombres diferentes para mayor claridad y deje que el compilador de optimización se dé cuenta de que puede reutilizar el anterior.
fuente
ostringstream
(según los datos leídos) y luego tiene que escribir la cadena incorporada enostringstream
algún lugar de vez en cuando (por ejemplo, después de leer una determinada secuencia de caracteres) y comenzar construyendo una nueva cuerda.