Qual é a diferença entre istringstream, ostringstream e stringstream?/ Por que não usar stringstream em todos os casos?

StackOverflow https://stackoverflow.com/questions/3292107

Pergunta

Quando eu usaria std::istringstream, std::ostringstream e std::stringstream e por que eu não deveria simplesmente usar std::stringstream em todos os cenários (há algum problema de desempenho em tempo de execução?).

Por último, há algo de ruim nisso (em vez de usar um stream):

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";
Foi útil?

Solução

Pessoalmente, acho muito raro querer realizar streaming dentro e fora do mesmo fluxo de string.

Normalmente quero inicializar um fluxo a partir de uma string e depois analisá-lo;ou transmita coisas para um fluxo de string e, em seguida, extraia o resultado e armazene-o.

Se você estiver transmitindo de e para o mesmo stream, deverá ter muito cuidado com o estado e as posições do stream.

Usando 'apenas' istringstream ou ostringstream expressa melhor sua intenção e fornece algumas verificações contra erros bobos, como o uso acidental de << contra >>.

poder haveria alguma melhoria de desempenho, mas eu não olharia para isso primeiro.

Não há nada de errado com o que você escreveu.Se você achar que o desempenho não é bom o suficiente, poderá traçar o perfil de outras abordagens; caso contrário, siga o que é mais claro.Pessoalmente, eu apenas escolheria:

std::string stHehe( "Hello stackoverflow.com!" );

Outras dicas

A stringstream é um pouco maior e pode ter desempenho um pouco inferior - a herança múltipla pode exigir um ajuste no ponteiro vtable.A principal diferença é (pelo menos em teoria) expressar melhor sua intenção e evitar que você use acidentalmente >> onde você pretendia << (ou vice-versa).OTOH, a diferença é suficientemente pequena, especialmente para trechos rápidos de código de demonstração e coisas assim, sou preguiçoso e apenas uso stringstream.Não consigo me lembrar da última vez que usei acidentalmente << quando eu pretendia >>, então para mim essa segurança parece principalmente teórica (especialmente porque se você fazer cometer tal erro, quase sempre será realmente óbvio quase imediatamente).

Não há nada de errado em usar apenas uma string, desde que ela realize o que você deseja.Se você está apenas juntando as cordas, é fácil e funciona bem.Se você quiser formatar outros tipos de dados, um stringstream apoiará isso, e uma string geralmente não.

Na maioria dos casos, você não precisará de entrada e saída no mesmo stringstream, portanto, usar std::ostringstream e std::istringstream deixa explicitamente sua intenção clara.Também evita que você digite acidentalmente o operador errado (<< contra >>).

Quando você precisar fazer as duas operações no mesmo fluxo, obviamente usaria a versão de uso geral.

Problemas de desempenho seriam a menor das suas preocupações aqui, a clareza é a principal vantagem.

Finalmente, não há nada de errado em usar string append, pois você precisa construir strings puras.Você simplesmente não pode usar isso para combinar números como em linguagens como Perl.

istringstream é para entrada, ostringstream para saída.stringstream é entrada e saída.Você pode usar stringstream em praticamente qualquer lugar.No entanto, se você der seu objeto para outro usuário, e ele usar o operador >> enquanto você espera um objeto somente gravação, você não ficará feliz ;-)

PS:nada de ruim nisso, apenas problemas de desempenho.

Para responder à sua terceira pergunta:Não, isso é perfeitamente razoável.A vantagem de usar streams é que você pode inserir qualquer tipo de valor que tenha um operator<< definido, enquanto você só pode adicionar strings (C++ ou C) a um std::string.

Presumivelmente, quando apenas a inserção ou apenas a extração for apropriada para sua operação, você poderá usar uma das versões com prefixo 'i' ou 'o' para excluir a operação indesejada.

Se isso não for importante, você pode usar a versão de E/S.

A concatenação de strings que você está mostrando é perfeitamente válida.Embora a concatenação usando stringstream seja possível, esse não é o recurso mais útil dos stringstreams, que é ser capaz de inserir e extrair POD e tipos de dados abstratos.

std::ostringstream::str() cria uma cópia do conteúdo do stream, o que dobra o uso de memória em algumas situações.Você pode usar std::stringstream e sua função rdbuf() para evitar isso.

Mais detalhes aqui: como escrever ostringstream diretamente no cout

Por que abrir um arquivo para acesso de leitura/gravação se você só precisa lê-lo, por exemplo?

E se vários processos precisassem ler o mesmo arquivo?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top