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

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

Frage

Wann würde ich verwenden std::istringstream, std::ostringstream Und std::stringstream und warum sollte ich nicht einfach verwenden std::stringstream in jedem Szenario (gibt es Probleme mit der Laufzeitleistung?).

Abschließend: Gibt es irgendetwas Schlimmes daran (anstatt überhaupt einen Stream zu verwenden):

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";
War es hilfreich?

Lösung

Ich persönlich finde 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 ihn dann analysieren.oder Dinge in einen String-Stream streamen und dann das Ergebnis extrahieren und speichern.

Wenn Sie zum und vom selben Stream streamen, müssen Sie mit dem Stream-Status und den Stream-Positionen sehr vorsichtig sein.

„nur“ verwenden istringstream oder ostringstream Bringt Ihre Absicht besser zum Ausdruck und gibt Ihnen die Möglichkeit, dumme Fehler wie die versehentliche Verwendung von zu verhindern << vs >>.

Dort könnte Es wäre zwar eine Leistungsverbesserung möglich, aber das würde ich nicht zuerst in Betracht ziehen.

An dem, was Sie geschrieben haben, ist nichts falsch.Wenn Sie feststellen, dass die Leistung nicht gut genug ist, können Sie andere Ansätze profilieren, andernfalls bleiben Sie bei dem, was am klarsten ist.Persönlich würde ich mich einfach für Folgendes entscheiden:

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

Andere Tipps

A stringstream ist etwas größer und weist möglicherweise eine etwas geringere Leistung auf – Mehrfachvererbung kann eine Anpassung des vtable-Zeigers erfordern.Der Hauptunterschied besteht (zumindest theoretisch) darin, dass Sie Ihre Absicht besser zum Ausdruck bringen und verhindern können, dass Sie sie versehentlich verwenden >> wo du es beabsichtigt hast << (oder umgekehrt).OTOH, der Unterschied ist so gering, dass ich vor allem für kurze Demonstrationscodes und dergleichen faul bin und sie einfach verwende stringstream.Ich kann mich nicht mehr genau daran erinnern, wann ich es das letzte Mal aus Versehen benutzt habe << als ich es vorhatte >>, also erscheint mir dieses bisschen Sicherheit eher theoretisch (vor allem, wenn Sie Tun Machen Sie einen solchen Fehler, das wird fast immer so sein Wirklich fast sofort offensichtlich).

Es ist überhaupt nichts Falsches daran, nur eine Zeichenfolge zu verwenden, solange sie das erreicht, was Sie wollen.Wenn Sie nur Fäden zusammenfügen, ist das einfach und funktioniert gut.Wenn Sie jedoch andere Arten von Daten formatieren möchten, a stringstream wird das unterstützen, eine Zeichenfolge jedoch meistens nicht.

In den meisten Fällen benötigen Sie nicht sowohl Eingabe als auch Ausgabe im selben Stringstream, also verwenden Sie std::ostringstream Und std::istringstream macht Ihre Absicht ausdrücklich deutlich.Es verhindert außerdem, dass Sie versehentlich den falschen Operator eingeben (<< vs >>).

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

Leistungsprobleme wären hier Ihr geringstes Problem, Klarheit ist der Hauptvorteil.

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

Istringstream ist für die Eingabe, der Ostringstream für die Ausgabe.stringstream ist eingegeben und ausgegeben. Sie können Stringstream ziemlich überall nutzen. Wenn Sie jedoch Ihrem Objekt einem anderen Benutzern angeben, und es verwendet den Bediener >>, während Sie ein Nur-schreiben-Objekt warten, Sie werden nicht glücklich sein; -)

ps: Nichts schlecht darüber, nur Leistungsprobleme.

Um Ihre dritte Frage zu beantworten: Nein, das ist vollkommen vernünftig.Der Vorteil der Verwendung von Streams besteht darin, dass Sie einen beliebigen Wert eingeben können, der einen generakodizidagcode definiert hat, während Sie nur Saiten (entweder c ++ oder c) zu einem generationspoDicetagcode hinzufügen können.

vermutlich, wenn nur ein Einfügen oder nur die Extraktion für Ihren Vorgang geeignet ist, können Sie eine der vorangehenden "i'- oder 'o" -Versions-Versionen verwenden, um den unerwünschten Betrieb auszuschließen.

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

Die Saite-Verkettung, die Sie zeigen, ist perfekt gültig.Obwohl die Verkettung mit dem Stringstream möglich ist, ist das nicht das nützlichste Merkmal von StringStreams, das in der Lage ist, Pod- und abstrakte Datentypen einsetzen und zu extrahieren.

std :: ostraingstream :: str () Erstellt eine Kopie des Streams des Streams, der in einigen Situationen den Speicherverbrauch verdoppelt.Sie können STD :: stringstream und seine rdbuf () -Funktion verwenden, um dies zu vermeiden.

mehr Details hier: So schreiben Sie Osttringstream direkt an cout

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

was ist, wenn mehrere Prozesse erforderlich sind, um aus derselben Datei zu lesen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top