Eu gostaria de limpar e reutilizar um ostringstream (e o buffer subjacente) para que meu aplicativo não precise fazer tantas alocações. Como faço para redefinir o objeto ao seu estado inicial?
c++
stl
reset
ostringstream
twk
fonte
fonte
Respostas:
Eu usei uma sequência de clear e str no passado:
O que funcionou para os streams de entrada e de saída. Como alternativa, você pode limpar manualmente e, em seguida, buscar a sequência apropriada para o início:
Isso evitará algumas realocações feitas
str
sobrescrevendo o que quer que esteja no buffer de saída atualmente. Os resultados são assim:Se você quiser usar a string para funções c, você pode usar
std::ends
, colocando um nulo de terminação como este:std::ends
é uma relíquia do obsoletostd::strstream
, que foi capaz de gravar diretamente em uma matriz char que você alocou na pilha. Você teve que inserir um nulo de terminação manualmente. No entanto,std::ends
não está obsoleto, acho que é porque ainda é útil como nos casos acima.fonte
s.str("");
vez disso.auto str = s.str(); auto cstr = str.c_str(); file << cstr; s.clear(); s.seekp(0); s << ends;
boost::any a = 1; std::ostringstream buffer; buffer << a << std::ends; EXPECT_EQ( buffer.str(), "any<(int)1>" );
TestUtilsTest.cpp:27: Failure Expected: buffer.str() Which is: "any<(int)1>\0" To be equal to: "any<(int)1>"
e se eu reutilizar strings de comprimento diferente, fico com os bits restantess.seekp(0); s << std::ends; s.seekp(0);
Parece que a
ostr.str("")
ligação resolve.fonte
Se você pretende limpar o buffer de uma forma que fará com que ele seja limpo antes de seu primeiro uso, você precisará adicionar algo ao buffer primeiro com MSVC.
fonte
clear
fará com que ofailbit
seja definido se o fluxo estiver vazio. Embora apenas a chamadaseekp
deva simplesmente retornar se nenhum stream existir.Você não. Use dois fluxos com nomes diferentes para maior clareza e deixe o compilador de otimização descobrir que pode reutilizar o antigo.
fonte
ostringstream
(com base nos dados lidos) e, em seguida, tem que escrever a string construída emostringstream
algum lugar de tempos em tempos (por exemplo, após uma certa sequência de caracteres ter sido lida) e começar construir uma nova string.