176 votes

Ce qui ' la différence entre istrstream, ostrstream et stringstream ? / Pourquoi ne pas utiliser stringstream dans tous les cas ?

Quand j’ai utiliser std::istringstream, std::ostringstream et std::stringstream et pourquoi ne devrais-je pas je viens d’utiliser std::stringstream dans tous les scénarios (y a-t-il n’importe quel moment de l’exécution des problèmes de performances ?).

Enfin, y a-t-il quelque chose de mauvais à ce sujet (au lieu d’utiliser un flux de données en tout) :

130voto

Charles Bailey Points 244082

Personnellement, je trouve qu'il est très rare que j'ai envie de préforme en 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 trop une chaîne de flux et d'extraire ensuite le résultat et de le stocker.

Si vous êtes en streaming pour et à partir de la même flux que 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 a peut - ê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 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!" );

23voto

Jerry Coffin Points 237758

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 voulu >>, donc pour moi que peu de sécurité semble essentiellement théorique (d'autant plus que si vous faites faire une telle erreur, il est presque toujours être 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 mettre en forme, d'autres types de données, un stringstream soutiendra que, et une chaîne pour la plupart le seront pas.

20voto

Mark B Points 60200

Dans la plupart des cas, vous ne trouvez dans le besoin à la fois d'entrée et de sortie sur la même stringstream, donc à l'aide d' 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.

11voto

Scharron Points 5866

istrstream est pour ostrstream d’entrée, de sortie. StringStream est entrée et sortie. Vous pouvez utiliser stringstream pratiquement partout. Toutefois, si vous donnez votre objet à un autre utilisateur, et elle utilise opérateur >> tandis que vous où une écriture en attente seulement s’opposaient, vous ne serez pas heureux  ;-)

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

4voto

Dan Breslau Points 9217

D'autres ont déjà manipulé stringstream vs[i|o]stringstream assez bien; pas besoin de moi pour y aller.

Comme pour std::string -- eh bien, je ne crois pas qu'il a << ou >> opérateurs, de sorte que vous ne pouvait pas l'utiliser où un flux de fichier peut être nécessaire. Plus important encore, je m'attends et répétée à l'arbitraire des enchaînements à un std::string avoir O(N**2) performance, ou, au mieux, O(N*log(N)) performances-la différence étant de savoir comment attention, le programmeur est à attribuer l'excès de capacité dans la chaîne cible. Cependant, la N des enchaînements à un ostringstream devrait avoir essentiellement en O(N) rendement (en laissant de côté la longueur des chaînes de caractères.) Que peut être une mince différence lorsque vous êtes à la concaténation d'un seul ou de deux chaînes, et ostringstream peut-être encore plus lent que d' std::string lorsque N est petit. Mais j'ai connu des cas où N est très grand, et le O(N**2) la performance vraiment mal.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X