web-dev-qa-db-fra.com

Quelle est la différence entre istringstream, ostringstream et stringstream? / Pourquoi ne pas utiliser stringstream dans tous les cas?

Quand utiliserais-je std::istringstream, std::ostringstream et std::stringstream et pourquoi ne devrais-je pas simplement utiliser std::stringstream dans chaque scénario (existe-t-il des problèmes de performances d'exécution?).

Enfin, y a-t-il quelque chose de mauvais à ce sujet (au lieu d'utiliser un flux):

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";
146
Oliver Baur

Personnellement, je trouve très rare de vouloir effectuer un streaming dans et hors du même flux de chaîne.

D'habitude, je veux soit initialiser un flux d'une chaîne, puis l'analyser; ou diffuser les choses dans un flux de chaîne, puis extraire le résultat et le stocker.

Si vous diffusez vers et depuis le même flux, vous devez faire très attention à l'état et aux positions des flux.

Utiliser 'just' istringstream ou ostringstream exprime mieux votre intention et vous permet de vérifier certaines erreurs stupides telles que l’utilisation accidentelle de << contre >>.

Il y a peut-être une amélioration des performances, mais je ne regarderais pas cela en premier.

Il n'y a rien de mal avec ce que vous avez écrit. Si vous trouvez que cela ne fonctionne pas assez bien, vous pouvez alors profiler d'autres approches, sinon vous pouvez vous en tenir à ce qui est le plus clair. Personnellement, j'irais juste pour:

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

Un stringstream est un peu plus grand et peut avoir des performances légèrement inférieures - l'héritage multiple peut nécessiter un ajustement du pointeur vtable. La principale différence est (au moins en théorie) de mieux exprimer votre intention et de vous empêcher d’utiliser accidentellement >> Là où vous vouliez << (Ou vice versa). OTOH, la différence est suffisamment petite pour que, surtout pour les morceaux rapides de code de démonstration, je suis paresseux et je n’utilise que stringstream. Je ne me souviens plus très bien de la dernière fois où j’ai utilisé accidentellement << Lorsque j’avais l’intention de >>, Ce qui me semble donc un peu théorique est un gage de sécurité (surtout que si vous faire faire une telle erreur, il sera presque toujours vraiment évident presque immédiatement).

Rien de mal à simplement utiliser une chaîne, tant qu'elle accomplit ce que vous voulez. Si vous ne faites que rassembler des cordes, c'est facile et ça fonctionne bien. Si vous souhaitez toutefois formater d'autres types de données, un stringstream le prendra en charge, mais pas une chaîne.

20
Jerry Coffin

Dans la plupart des cas, vous n'aurez pas besoin d'avoir à la fois des entrées et des sorties sur le même flux de chaîne. Par conséquent, l'utilisation de std::ostringstream Et de std::istringstream Indique clairement votre intention. Cela vous évite également de taper accidentellement le mauvais opérateur (<< Vs >>).

Lorsque vous devez effectuer les deux opérations sur le même flux, vous utiliserez évidemment la version à usage général.

Les problèmes de performances seraient le moindre de vos soucis ici, la clarté est le principal avantage.

Enfin, l'utilisation de string append n'a rien d'anormal, car vous devez construire des chaînes pures. Vous ne pouvez simplement pas utiliser cela pour combiner des nombres comme vous le pouvez dans des langues telles que Perl.

15
Mark B

istringstream est pour l'entrée, ostringstream pour la sortie. stringstream est entrée et sortie. Vous pouvez utiliser stringstream un peu partout. Cependant, si vous donnez votre objet à un autre utilisateur et qu'il utilise l'opérateur >> alors que vous n'attendez qu'un objet en écriture, vous ne serez pas content ;-)

PS: rien de grave, juste des problèmes de performances.

6
Scharron

Pour répondre à votre troisième question: non, c'est parfaitement raisonnable. L'avantage d'utiliser des flux est que vous pouvez entrer n'importe quelle valeur qui a un operator<< défini, alors que vous ne pouvez ajouter que des chaînes (C++ ou C) à un std::string.

2
David Thornley

Vraisemblablement, lorsque seule l’insertion ou la seule extraction convient à votre opération, vous pouvez utiliser l’une des versions précédées du préfixe "i" ou "o" pour exclure l’opération non désirée.

Si cela n’est pas important, vous pouvez utiliser la version i/o.

La concaténation de chaînes que vous affichez est parfaitement valide. Bien que la concaténation utilisant stringstream soit possible, ce n'est pas la caractéristique la plus utile des stringstreams, qui consiste à pouvoir insérer et extraire des types de données POD et abstraits.

1
Amardeep AC9MF

Pourquoi ouvrir un fichier pour un accès en lecture/écriture si vous avez seulement besoin de le lire, par exemple?

Et si plusieurs processus devaient lire dans le même fichier?

0
Assaf Lavie

std :: ostringstream :: str () crée une copie du contenu du flux, ce qui double l'utilisation de la mémoire dans certaines situations. Vous pouvez utiliser std :: stringstream et sa fonction rdbuf () pour éviter cela.

Plus de détails ici: comment écrire ostringstream directement dans cout

0
Gerhard Wesp