Como faço para "redefinir" o estado de um stringstream para o que era quando eu o criei?
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
fonte
fonte
clear
não reinicializa os manipuladores io. Exemplo de teste de falha: std :: stringstream ss; ss << "Olá" << std :: setw (15) << "Mundo" << std :: setw (15); reset (ss); ss << "Olá, Mundo"; assert ("Olá, Mundo" == buf.str ()); // falha, pega o último std :: setweu 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:
ss
que agora estará em um novo estado.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 fazerauto 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.fonte
Com base na resposta acima, também precisamos redefinir qualquer formatação. Ao todo, estamos redefinindo o conteúdo do buffer, os sinalizadores de estado do stream e qualquer formatação para seus padrões quando uma nova instância std :: stringstream é construída.
void reset(std::strinstream& stream) { const static std::stringstream initial; stream.str(std::string()); stream.clear(); stream.copyfmt(initial); }
fonte