Ich 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:
- Es wird garantiert, dass
ss
es sich jetzt in einem neuen Zustand befindet.
- Das neue Objekt wird inline und auf dem Stapel erstellt, sodass der Compiler den Code problemlos optimieren kann. Am Ende wird es so sein, als würden alle
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 tun
auto 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.