¿Cómo "restablezco" el estado de un stringstream al que tenía cuando lo creé?
int firstValue = 1;
int secondValue = 2;
std::wstringstream ss;
ss << "Hello: " << firstValue;
std::wstring firstText(ss.str());
//print the value of firstText here
//How do I "reset" the stringstream here?
//I would like it behave as if I had created
// stringstream ss2 and used it below.
ss << "Bye: " << secondValue;
std::wstring secondText(ss.str());
//print the value of secondText here
c++
string
stringstream
usuario974967
fuente
fuente
clear
, no reinicia los manipuladores de io. Ejemplo de prueba fallida: std :: stringstream ss; ss << "Hola" << std :: setw (15) << "Mundo" << std :: setw (15); reiniciar (ss); ss << "Hola mundo"; asert ("Hola mundo" == buf.str ()); // falla, recoge el último estándar :: setwyo lo haría
std::wstringstream temp; ss.swap(temp);
Editar: se corrigió el error informado por christianparpart y Nemo. Gracias.
PD: El código anterior crea un nuevo objeto stringstream en la pila e intercambia todo
ss
con los del nuevo objeto.Ventajas:
ss
que ahora estará en un estado nuevo.ss
los datos internos al estado inicial.Más:
En comparación con el operador de asignación: los métodos de intercambio de STL pueden ser más rápidos que el operador de asignación en los casos en que el nuevo objeto tiene un búfer asignado en el montón. En tal caso, el operador de asignación tiene que asignar el búfer para el nuevo objeto, luego PUEDE necesitar asignar otro búfer para el objeto antiguo y luego copiar los datos del búfer del nuevo objeto al búfer nuevo del objeto antiguo. Es muy fácil implementar un intercambio rápido, que simplemente intercambia punteros de los búferes, por ejemplo.
C ++ 11. He visto alguna implementación del operador de asignación de movimiento que es más lento que el intercambio, aunque eso se puede arreglar, pero probablemente el desarrollador de STL no querrá dejar un objeto movido con muchos datos
std::move()
no garantiza que el objeto movido se vacíe.return std::move(m_container);
no borra m_container. Entonces tendrás que hacerauto to_return (std :: move (m_container)); m_container.clear (); return to_return;
Que no puede ser mejor que
auto to_return; m_container.swap(to_return); return to_return;
porque este último garantiza que no copiará búferes.
Por eso siempre prefiero siempre que me
swap()
quede bien.fuente
Sobre la base de la respuesta anterior, también debemos restablecer cualquier formato. En general, estamos restableciendo el contenido del búfer, las banderas de estado de la secuencia y cualquier formato a sus valores predeterminados cuando se construye una nueva instancia de std :: stringstream.
void reset(std::strinstream& stream) { const static std::stringstream initial; stream.str(std::string()); stream.clear(); stream.copyfmt(initial); }
fuente