farei
std::wstringstream temp;
ss.swap(temp);
Modifica: corretto l'errore segnalato da christianparpart e Nemo. Grazie.
PS: il codice precedente crea un nuovo oggetto stringstream nello stack e scambia tutto in ss
con quelli nel nuovo oggetto.
Vantaggi:
- Garantisce
ss
che ora sarà in uno stato nuovo.
- Il nuovo oggetto viene creato in linea e nello stack, in modo che il compilatore possa facilmente ottimizzare il codice. Alla fine, sarà come resettare tutti
ss
i dati interni allo stato iniziale.
Di Più:
Rispetto all'operatore di assegnazione: i metodi di scambio STL possono essere più veloci dell'operatore di assegnazione nei casi in cui il nuovo oggetto ha un buffer allocato nell'heap. In tal caso, l'operatore di assegnazione deve allocare il buffer per il nuovo oggetto, quindi PU essere necessario allocare un altro buffer per il vecchio oggetto e quindi copiare i dati dal buffer del nuovo oggetto al nuovo buffer del vecchio oggetto. È molto facile implementare uno scambio veloce, che scambia solo i puntatori dei buffer, ad esempio.
C ++ 11. Ho visto un'implementazione dell'operatore di assegnazione dello spostamento che è più lenta dello scambio, sebbene possa essere risolto, ma probabilmente lo sviluppatore STL non vorrà lasciare un oggetto spostato con molti dati
std::move()
non garantisce che l'oggetto spostato venga svuotato. return std::move(m_container);
non cancella m_container. Quindi dovrai farlo
auto to_return (std :: move (m_container)); m_container.clear (); return to_return;
Che non può essere migliore di
auto to_return;
m_container.swap(to_return);
return to_return;
perché quest'ultimo garantisce che non copierà i buffer.
Quindi preferisco sempre swap()
finché si adatta.