eu faria
std::wstringstream temp;
ss.swap(temp);
Edit: corrigido o erro relatado por christianparpart e Nemo. Obrigado.
PS: O código acima cria um novo objeto stringstream na pilha e troca tudo ss
com os do novo objeto.
Vantagens:
- Ele garante
ss
que agora estará em um novo estado.
- O novo objeto é criado embutido e na pilha, para que o compilador possa otimizar facilmente o código. No final, será como redefinir todos os
ss
dados internos para o estado inicial.
Mais:
Comparado ao operador de atribuição: os métodos de troca STL podem ser mais rápidos do que o operador de atribuição nos casos em que o novo objeto tem um buffer alocado no heap. Em tal caso, o operador de atribuição tem que alocar o buffer para o novo objeto, então PODE precisar alocar outro buffer para o objeto antigo, e então copiar os dados do buffer do novo objeto para o novo buffer do objeto antigo. É muito fácil implementar uma troca rápida, que apenas troca os ponteiros dos buffers, por exemplo.
C ++ 11. Eu vi alguma implementação do operador de atribuição de movimento que é mais lento do que a troca, embora isso possa ser corrigido, mas provavelmente o desenvolvedor de STL não vai querer deixar um objeto movido com muitos dados
std::move()
não garante que o objeto movido seja esvaziado. return std::move(m_container);
não limpa m_container. Então você terá que fazer
auto to_return (std :: move (m_container)); m_container.clear (); return to_return;
Que não pode ser melhor do que
auto to_return;
m_container.swap(to_return);
return to_return;
porque o último garante que não copiará buffers.
Então eu sempre prefiro swap()
o tempo que couber.