Stringstream frage
-
hi
wofür sind eingentlich diese Stringstreams da?
ich verstehe den Sinn von denen überhaupt nicht. Meiner Meinung nach bräuchte man nur die Dateienstreams, mehr nicht.Mfg
-
try_it! schrieb:
ich verstehe den Sinn von denen überhaupt nicht. Meiner Meinung nach bräuchte man nur die Dateienstreams, mehr nicht.
Dann verkette mal folgende Eingaben und arbeite damit weiter:
int i = 42; double d = 23.5; string s = "Hallo"; MeinKomplexesObjekt mko;Um all diese Ausgaben zu verknüpfen könntest Du natürlich einen Dateistrom öffnen, alle Objekte hineinschreiben und danach die Datei in einen String auslesen. Einfacher ist es aber, die Objekte in einen stringstream zu schreiben:
stringstream sstr; sstr << i << d << s << mko; string result = sstr.str();
-
Ich versteh den Sinn auch nicht.
Warum macht man es nicht so?class myC { public: myC() { m="MMMM"; } friend std::string& operator+( std::string& str, const myC& my){ str.append(my.m); return str; } std::string m; }; int main (void) { std::string txt="123 "; myC my; txt=txt+my; std::cout<<txt.c_str(); return 0; }
-
WarumSo schrieb:
Ich versteh den Sinn auch nicht.
Warum macht man es nicht so?Ja, und wie klappt das für eingebaute Datentypen wie Zahlen?
txt += 123;klappt nicht. Der C++-Weg ist nunmal über Streams.
-
WarumSo schrieb:
Ich versteh den Sinn auch nicht.
Warum macht man es nicht so?Warum gibt es Java StringBuilder? Warum verkettet man nicht einfach haufenweise Strings?
Antwort (in beiden Fällen): Effizienz.
Darüberhinaus erlaubt das C++-Streamkonzept Erweiterungen um eigene Datentypen, ohne dafür die Klasse modifizieren zu müssen und ohne fremde Klassen dafür einsetzen zu müssen.
Zusätzlich kann man aus stringstreams auch wieder was rausholen. Und das muss nicht dem Typ entsprechen, den man reingetan hat. Stichwort: Konvertierung.
-
Konrad Rudolph schrieb:
WarumSo schrieb:
Ich versteh den Sinn auch nicht.
Warum macht man es nicht so?Ja, und wie klappt das für eingebaute Datentypen wie Zahlen?
txt += 123;klappt nicht.Na für stringstreams klappt es auch nur, weil es da implementiert wurde. Für strings hätte man es auch machen können.
Der C++-Weg ist nunmal über Streams.
Ja, schaut mir auch mehr nach dem man macht es so wie immer Grund aus.
LordJaxom schrieb:
Warum gibt es Java StringBuilder? Warum verkettet man nicht einfach haufenweise Strings?
Antwort (in beiden Fällen): Effizienz.
Bei Java Strings ist es effizienter, weil man sonst immer ein neues String Objekt erzeugen muss, aber der StringBuilder bleibt immer das gleiche Objekt.
In C++ kennt ich mich nicht so genau aus, aber wo ist der große Performane unterschied, wenn ich einmal nen Operator für string und einmal für stringstream überschreibe?
-
heisst das also, dass man
// Variablen,etc... stringstream sstr; sstr << i << d << s << mko;schreiben kann und das in sstr gespeichert wird und wenn man dann noch was zu "sstr" hinzufügen möchte,dass es dann drin gespeichert wird?
int a = 2; int b = 5; int c = 4; stringstream sstr; sstr << a; // std::cout << sstr << std::endl; sstr << b << c; std::cout << sstr << std::endl; // wird folgendes ausgegeben? a b c ???mfg
-
WarumSo schrieb:
Der C++-Weg ist nunmal über Streams.
Ja, schaut mir auch mehr nach dem man macht es so wie immer Grund aus.
Natürlich. Du formulierst das aber so, als sei es etwas Negatives und das ist natürlich falsch. Es ist kohärent. Gründe, wieso man ursprünglich den Stringstream eingeführt hat, gibt es genug, z.B. um Persistenz von Objekten allgemeingültig zu lösen. += für Strings zu überladen hätte hier nicht geholfen. Auch das Effizienz-Argument ist nicht von der Hand zu weisen.
-
Das Stream-Konzept ist halt allgemeingültiger, als nur mit Strings zu hantieren.
Du schreibst einmal eine Stream-Konvertierungsfunktion und kannst diese dann für beliebige Streams (Datei, Konsole, String == Memory, etc. ) nutzen.Aber irgendwie klingt die Frage nach Trollerei...
-
Konrad Rudolph schrieb:
Auch das Effizienz-Argument ist nicht von der Hand zu weisen.
Erklär das doch mal genauer.
-
WarumSo schrieb:
Konrad Rudolph schrieb:
Auch das Effizienz-Argument ist nicht von der Hand zu weisen.
Erklär das doch mal genauer.
Na ja, wie LordJaxom bereits erwähnte, ist der stringstream üblicherweise effizienter, da er Speicher vor-reserviert, was die String-Klasse üblicherweise unterlässt.
Natürlich könnte man auch die Stringklasse mit diesem Verhalten ausrüsten (sogar nachträglich durch einen geeigneten Allokator). Allerdings würde das Auswirkungen auf die alltägliche Nutzung von Strings bedeuten. Üblicherweise werden Strings nach einmaligem Erstellen eben nicht oder nur sehr selten modifiziert. Es wäre daher Platzverschwendung, unnötig viel Speicher bereitzustelle. Stringstreams hingegen sind dafür vorgesehen, effizient Verkettungsoperationen ausführen zu können, der Speicherbedarf ist hier also balanciert.
-
Klingt logisch, aber ich hab noch nie gesehen, dass einer, wegen der Performance, so strings zusammensetzt. stringstreams sieht man fast nur bei der Konvertierung und da oft mit lexical_cast, was die Performance wieder kaputt macht.
-
WarumSo schrieb:
Konrad Rudolph schrieb:
WarumSo schrieb:
Ich versteh den Sinn auch nicht.
Warum macht man es nicht so?Ja, und wie klappt das für eingebaute Datentypen wie Zahlen?
txt += 123;klappt nicht.Na für stringstreams klappt es auch nur, weil es da implementiert wurde. ...
Aber es wurde so entworfen (und implementiert), um auch sowas machen zu können:
void schreibweg(MyObj& obj, ostream& ost) { ost << "Hier kommt mein Objekt: " << obj; } int main() { MyObj o(1); schreibweg(o, cout); ofstream file("myfile"); schreibweg(o, file); myNetzStream netz(4, 6); schreibweg(o, file); ostringstream sstr; schreibweg(o, file); // .... }Für's reine Wegschreiben braucht man das natürlich nicht, aber wenn man eine komplexere Funktion hat, ist es schon schön, wenn sie nicht vom konkreten "Wegschreibziel" nicht abhängt.
Schön, oder ?
Gruß,
Simon2.
-
@warumso dann hast du noch nicht viel gesehen. stringstreams habe ich schon sehr oft für das zusammensetzen von meldungen oder sonstigen texten gesehen, weil es einfach bequemer ist als das ganze mit strings zu bauen und es ist dann noch effizienter, da nicht nur der stringstream normalerweise effiziert implementiert ist, sondern auch operator+ ein neues objekt erzeugt im gegensatz zu operator<< der es nur verändert. will heißen: wenn du mit strings auch nur theoretisch in der gleichen performanceliga spielen willst, müsstest du alles mit operator+= machen, was zu irrsinnig viel code führt, wenn man mal eine message mit drei oder vier parametern ausgeben will...
oder du benutzt eine andere string-klasse wie bspw qstring, die dank der möglichkeit argumente als funktionsaufrufe zu übergeben wohl geschwindigkeitsmässig in der gleichen liga wie stringstream spielen kann. (und auch noch dank shared-d-pointer das rumkopieren eher verzeiht.)