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

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

enfin, y a-t-il quelque chose de mal à cela (au lieu d'utiliser un ruisseau du tout):

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";
129
demandé sur Lii 2010-07-20 20:20:01

7 réponses

personnellement, je trouve qu'il est très rare que je veuille effectuer un streaming entrant et sortant du même stream.

d'Habitude, je veux soit initialiser un flux à partir d'une chaîne, puis de l'analyser; ou le flux des choses à une chaîne de flux et d'extraire ensuite le résultat et de le stocker.

si vous diffusez vers et depuis le même flux, vous devez être très prudent avec l'état du flux et les positions du flux.

à l'Aide de "juste" istringstream ou ostringstream exprime mieux votre intention et vous donne un peu de vérification des erreurs stupides telles que l'utilisation accidentelle de la << vs >> .

Il y pourrait être certains d'amélioration de la performance, mais je ne voudrais pas être à la recherche lors de la première.

il n'y a rien de mal à ce que vous avez écrit. Si vous trouvez qu'il ne fonctionne pas assez bien, alors vous pourriez profiler d'autres approches, sinon s'en tenir à ce qui est la plus claire. Personnellement, je dirais:

std::string stHehe( "Hello stackoverflow.com!" );
91
répondu CB Bailey 2017-08-15 13:21:01

A stringstream est un peu plus grand, et pourrait avoir des performances légèrement plus faibles -- héritage multiple peut nécessiter un ajustement à l'indicateur de table. La principale différence est (du moins en théorie) de mieux exprimer votre intention, et de vous empêcher d'utiliser accidentellement >> où vous vouliez << (ou vice versa). OTOH, la différence est suffisamment petite que surtout pour les bits rapides de code de démonstration et tels, Je suis paresseux et juste utiliser stringstream . Je ne peux pas rappelez-vous bien la dernière fois que j'ai accidentellement utilisé << quand je voulais >> , donc pour moi ce peu de sécurité semble la plupart du temps théorique (d'autant plus que si vous do faire une telle erreur, il sera presque toujours vraiment évident presque immédiatement).

il N'y a rien de mal à utiliser une chaîne de caractères, du moment qu'elle accomplit ce que vous voulez. Si vous êtes juste de mettre les liens Ensemble, c'est facile et fonctionne bien. Si vous si vous voulez formater d'autres types de données, un stringstream le supportera, et une chaîne de caractères ne le supportera pas.

17
répondu Jerry Coffin 2010-07-20 16:27:11

dans la plupart des cas, vous n'aurez pas besoin à la fois d'entrée et de sortie sur le même stringstream, donc utiliser std::ostringstream et std::istringstream rend votre intention explicite. Il vous empêche également de taper accidentellement le mauvais opérateur ( << vs >> ).

lorsque vous devez effectuer les deux opérations sur le même flux, vous utilisez évidemment la version polyvalente.

les problèmes de Performance seraient le moindre de vos préoccupations la clarté est le principal avantage.

enfin il n'y a rien de mal à utiliser l'ajout de chaîne de caractères puisque vous devez construire des chaînes pures. Vous ne pouvez pas utiliser cela pour combiner des nombres comme vous pouvez dans des langues telles que perl.

14
répondu Mark B 2010-07-20 16:29:56

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 attendez un objet en écriture seulement, vous ne serez pas heureux ; -)

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

4
répondu Scharron 2010-07-20 16:26:55

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

2
répondu David Thornley 2010-07-20 16:28:31

probablement lorsque seule l'insertion ou seule l'extraction est appropriée pour votre opération, vous pouvez utiliser l'une des versions préfixées 'i' ou 'o' pour exclure l'opération non désirée.

si ce n'est pas important, vous pouvez utiliser la version e/s.

la chaîne concaténation que vous montrez est parfaitement valide. Bien que concaténation utilisant stringstream est possible qui n'est pas la caractéristique la plus utile de stringstreams, qui est d'être en mesure d'insérer et extraire les types de POD et de données abstraites.

1
répondu Amardeep AC9MF 2010-07-20 16:29:07

pourquoi ouvrir un fichier pour l'accès en lecture/écriture si vous n'en avez besoin que pour lire, par exemple?

que se passe-t-il si plusieurs processus doivent être lus à partir du même fichier?

0
répondu Assaf Lavie 2010-07-20 16:27:43