Was ist der Unterschied zwischen istringstream, ostringstream und stringstream? / Warum nicht in jedem Fall Stringstream verwenden?

163

Wann würde ich verwenden std::istringstream, std::ostringstreamund std::stringstreamwarum sollte ich nicht nur verwenden , std::stringstreamin jedem Szenario (gibt es keine Laufzeit - Performance Probleme?).

Gibt es etwas Schlechtes daran (anstatt überhaupt einen Stream zu verwenden):

std::string stHehe("Hello ");

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

Antworten:

119

Persönlich finde ich es sehr selten, dass ich Streaming in und aus demselben String-Stream durchführen möchte.

Normalerweise möchte ich entweder einen Stream aus einer Zeichenfolge initialisieren und dann analysieren. oder streamen Sie Dinge in einen String-Stream und extrahieren Sie dann das Ergebnis und speichern Sie es.

Wenn Sie zu und von demselben Stream streamen, müssen Sie mit dem Stream-Status und den Stream-Positionen sehr vorsichtig sein.

Die Verwendung von "nur" istringstreamoder ostringstreambesser drückt Ihre Absicht aus und gibt Ihnen die Möglichkeit, dumme Fehler wie die versehentliche Verwendung von <<vs zu überprüfen >>.

Es könnte eine Leistungsverbesserung geben, aber ich würde das nicht zuerst betrachten.

Es ist nichts falsch mit dem, was du geschrieben hast. Wenn Sie feststellen, dass die Leistung nicht gut genug ist, können Sie andere Ansätze profilieren, andernfalls bleiben Sie bei den klarsten. Persönlich würde ich einfach gehen für:

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

A stringstreamist etwas größer und hat möglicherweise eine etwas geringere Leistung. Bei Mehrfachvererbung kann eine Anpassung des vtable-Zeigers erforderlich sein. Der Hauptunterschied besteht (zumindest theoretisch) darin, Ihre Absicht besser auszudrücken und zu verhindern, dass Sie versehentlich verwenden, >>wo Sie es beabsichtigt haben <<(oder umgekehrt). OTOH, der Unterschied ist so gering, dass ich besonders für schnelle Demonstrationscodes und dergleichen faul bin und nur benutze stringstream. Ich kann nicht ganz an das letzte Mal erinnern , habe ich zufällig , <<als ich gedacht >>, so zu mir , dass Bit - Sicherheit meist theoretischen scheint (zumal , wenn Sie tun , einen solchen Fehler machen, wird es fast immer wirklich fast sofort klar).

Es ist überhaupt nichts Falsches daran, nur einen String zu verwenden, solange er das erreicht, was Sie wollen. Wenn Sie nur Zeichenfolgen zusammenfügen, ist dies einfach und funktioniert einwandfrei. Wenn Sie jedoch andere Arten von Daten formatieren möchten, stringstreamwird dies von a unterstützt, eine Zeichenfolge jedoch meistens nicht.

Jerry Sarg
quelle
17

In den meisten Fällen werden Sie nicht finden sich sowohl Eingang und Ausgang auf der gleichen string benötigen, so verwenden std::ostringstreamund std::istringstreamexplizit macht Ihre Absicht klar. Es verhindert auch, dass Sie versehentlich den falschen Operator ( <<vs >>) eingeben .

Wenn Sie beide Vorgänge im selben Stream ausführen müssen, verwenden Sie natürlich die Allzweckversion.

Leistungsprobleme sind hier das geringste Problem, Klarheit ist der Hauptvorteil.

Schließlich ist die Verwendung von Zeichenfolgenanhängen nichts Falsches, da Sie reine Zeichenfolgen erstellen müssen. Sie können das einfach nicht verwenden, um Zahlen wie in Sprachen wie Perl zu kombinieren.

Mark B.
quelle
8

istringstream ist für die Eingabe, ostringstream für die Ausgabe. stringstream ist Eingabe und Ausgabe. Sie können Stringstream so ziemlich überall verwenden. Wenn Sie Ihr Objekt jedoch einem anderen Benutzer geben und der Operator >> verwendet, während Sie auf ein schreibgeschütztes Objekt warten, werden Sie nicht glücklich sein ;-)

PS: nichts schlechtes daran, nur Leistungsprobleme.

Scharron
quelle
2

Um Ihre dritte Frage zu beantworten: Nein, das ist völlig vernünftig. Der Vorteil der Verwendung von Streams besteht darin, dass Sie jede Art von Wert eingeben können, für den ein Wert operator<<definiert ist, während Sie nur Zeichenfolgen (entweder C ++ oder C) zu a hinzufügen können std::string.

David Thornley
quelle
1

Wenn für Ihre Operation nur das Einfügen oder nur das Extrahieren geeignet ist, können Sie vermutlich eine der Versionen mit dem Präfix 'i' oder 'o' verwenden, um die unerwünschte Operation auszuschließen.

Wenn dies nicht wichtig ist, können Sie die E / A-Version verwenden.

Die angezeigte Zeichenfolgenverkettung ist absolut gültig. Obwohl eine Verkettung mit Stringstream möglich ist, ist dies nicht das nützlichste Merkmal von Stringstreams, nämlich das Einfügen und Extrahieren von POD- und abstrakten Datentypen.

Amardeep AC9MF
quelle
1

std :: ostringstream :: str () erstellt eine Kopie des Stream-Inhalts, wodurch sich in einigen Situationen die Speichernutzung verdoppelt. Sie können stattdessen std :: stringstream und seine Funktion rdbuf () verwenden, um dies zu vermeiden.

Weitere Details hier: Wie schreibe ich ostringstream direkt an cout?

Gerhard Wesp
quelle
0

Warum eine Datei für den Lese- / Schreibzugriff öffnen, wenn Sie beispielsweise nur daraus lesen müssen?

Was ist, wenn mehrere Prozesse aus derselben Datei lesen müssen?

Assaf Lavie
quelle