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

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

Question

Quand dois-je utiliser std::istringstream, std::ostringstream et std::stringstream et pourquoi ne pas simplement utiliser std::stringstream dans tous les scénarios (y at-il d'exécution problèmes de performance?).

Enfin, est-il quelque chose de mauvais à propos de cette (au lieu d'utiliser un cours d'eau à tous):

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";
Était-ce utile?

La solution

Personnellement, je trouve qu'il est très rare que j'ai envie de faire du " streaming dans et hors de la même chaîne de stream.

Habituellement 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 êtes en streaming et de le même flux, vous devez être très prudent avec le flux et le flux de positions.

À 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 peut être une amélioration des performances, 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 n'effectue pas assez bien, alors vous pourriez profil d'autres approches, sinon en tenir avec ce plus clair.Personnellement, j'aimerais simplement aller pour:

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

Autres conseils

Un stringstream est un peu plus grande, et peut-être légèrement plus faible performance -- l'héritage multiple peut exiger un ajustement de la vtable de pointeur.La principale différence est (au moins en théorie) de mieux exprimer votre intention, et vous empêchant de accidentellement à l'aide de >> où vous prévu << (ou vice versa).Otoh, que, la différence est suffisamment petit, pour que, en particulier pour rapide bits de code de démonstration et de ce fait, je suis paresseux et juste utiliser stringstream.Je ne me souviens pas la dernière fois que j'ai utilisé accidentellement << quand j'ai prévu >>, donc, pour moi, que peu de sécurité semble essentiellement théorique (d'autant plus que si vous faire faire une telle erreur, c'est presque toujours vraiment évident que presque immédiatement).

Rien du tout de mal avec juste l'aide d'une chaîne, tant qu'il accomplit ce que vous voulez.Si vous êtes juste de mettre des cordes en même temps, c'est facile et fonctionne très bien.Si vous voulez formater autres types de données, un stringstream permettra de soutenir que, et une chaîne pour la plupart le seront pas.

Dans la plupart des cas, vous ne trouvez dans le besoin à la fois d'entrée et de sortie sur la même stringstream, afin de l'utiliser std::ostringstream et std::istringstream explicitement fait part de votre intention claire.Il a également vous évite de taper le mauvais opérateur (<< vs >>).

Lorsque vous avez besoin de faire les deux opérations sur le même cours d'eau, vous serait évidemment d'utiliser à des fins générales version.

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

Enfin il n'y a rien de mal avec l'aide de la chaîne ajouter que vous avez à construire pur cordes.Vous ne pouvez pas l'utiliser pour combiner des chiffres comme vous pouvez dans des langages tels que perl.

istringstream est pour l'entrée, ostringstream pour la sortie.stringstream est d'entrée et de sortie.Vous pouvez utiliser stringstream un peu partout.Toutefois, si vous donnez votre objet à un autre utilisateur, et il utilise l'opérateur >> alors que vous où l'attente écrire un seul objet, vous ne serez pas heureux ;-)

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

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

On peut penser que lorsqu'seulement d'insertion ou seulement l'extraction est approprié pour votre opération, vous pouvez utiliser l'un des 'i' ou 'o' préfixé versions d'exclure les indésirables de l'opération.

Si ce n'est pas important, alors vous pouvez utiliser l'i/o version.

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

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

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

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

Si plusieurs processus nécessaires à la lecture à partir du même fichier?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top