Wie "setze" ich den Status eines Stringstreams auf den Stand zurück, als ich ihn erstellt habe?
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
user974967
quelle
quelle
clear
Io-Manipulatoren werden leider nicht zurückgesetzt. Beispiel für einen fehlgeschlagenen Test: std :: stringstream ss; ss << "Hallo" << std :: setw (15) << "Welt" << std :: setw (15); zurücksetzen (ss); ss << "Hallo Welt"; assert ("Hallo Welt" == buf.str ()); // schlägt fehl, nimmt letzte std :: setwIch würde es tun
std::wstringstream temp; ss.swap(temp);
Bearbeiten: Der von christianparpart und Nemo gemeldete Fehler wurde behoben. Vielen Dank.
PS: Der obige Code erstellt ein neues Stringstream-Objekt auf dem Stapel und tauscht alles
ss
mit denen im neuen Objekt aus.Vorteile:
ss
es sich jetzt in einem neuen Zustand befindet.ss
internen Daten in den Ausgangszustand zurückgesetzt.Mehr:
Im Vergleich zum Zuweisungsoperator: STL-Swap-Methoden können schneller sein als der Zuweisungsoperator, wenn das neue Objekt einen zugewiesenen Puffer im Heap hat. In einem solchen Fall muss der Zuweisungsoperator den Puffer für das neue Objekt zuweisen, dann muss er möglicherweise einen anderen Puffer für das alte Objekt zuweisen und dann die Daten aus dem Puffer des neuen Objekts in den neuen Puffer des alten Objekts kopieren. Es ist sehr einfach, einen schnellen Austausch zu implementieren, bei dem beispielsweise nur Zeiger der Puffer ausgetauscht werden.
C ++ 11. Ich habe eine Implementierung des Verschiebungszuweisungsoperators gesehen, die langsamer als der Austausch ist, obwohl dies behoben werden kann, aber wahrscheinlich möchte der STL-Entwickler ein verschobenes Objekt nicht mit vielen Daten belassen
std::move()
garantiert nicht, dass das bewegte Objekt geleert wird.return std::move(m_container);
löscht m_container nicht. Also musst du tunauto to_return (std :: move (m_container)); m_container.clear (); return to_return;
Welches kann nicht besser sein als
auto to_return; m_container.swap(to_return); return to_return;
weil letzteres garantiert, dass keine Puffer kopiert werden.
Also bevorzuge ich immer
swap()
solange es passt.quelle
Aufbauend auf der obigen Antwort müssen wir auch alle Formatierungen zurücksetzen. Insgesamt setzen wir den Pufferinhalt, die Stream-Statusflags und alle Formatierungen auf ihre Standardwerte zurück, wenn eine neue std :: stringstream-Instanz erstellt wird.
void reset(std::strinstream& stream) { const static std::stringstream initial; stream.str(std::string()); stream.clear(); stream.copyfmt(initial); }
quelle