Was ist denn mal ne WIRKLICH gute String-Klasse?



  • bei ostringstream gefallen mir die teils hässlichen Methoden-Namen und der Operator '<<' nicht. Außerdem will ich nicht jedesmal
    objekt.str().c_str() und text.str().length() schreiben.

    Bei der Klasse string funktioniert anscheinend das verknüpfen von Text und Zahlenwerten mittels '+' nicht.

    Gibt es eigentlich keine Klasse, die so arbeitet wie die in Java?



  • Gibt es eigentlich keine Klasse, die so arbeitet wie die in Java?

    Ne. Zum Glück nicht. In C++ braucht man keine Klasse mit Sonderstatus um mit Strings zu arbeiten 🙂

    bei ostringstream gefallen mir die teils hässlichen Methoden-Namen und der Operator '<<' nicht.

    ostringstream ist doch keine String-Klasse.

    Bei der Klasse string funktioniert anscheinend das verknüpfen von Text und Zahlenwerten mittels '+' nicht.

    Richtig. Allerdings lässt sich das trivial nachimplementieren.

    Standard-C++ hat nur eine String-Klasse, nämlich std::basic_string. Wenn dir die nicht gefällt, nahezu jede Klassenbibliothek bringt ihre eigene Stringklasse mit. Wenn auch das nicht hilft, musst du dir wohl selbst eine schreiben.



  • Um z.B. Zahlen zu addieren kannst Du Dir einfach einen Operator dafür bauen:

    std::string operator+(const std::string& left, int right);
    

    Das machst Du noch für += und int, double, und dann hast Du die fehlenden Funktionen schon fast zusammen, auch ohne neue Klasse.

    Mich hat das Fehlen dieser Sachen auch schon oft genervt, AnsiString von der VCL kann das alles.



  • Und warum ist sowas nicht sofort dabei? 😡



  • majo schrieb:

    Und warum ist sowas nicht sofort dabei? 😡

    Weil man so vor unerwarteten Ergebnissen geschützt ist.
    "1" + 1 = 2
    oder
    "1" + 1 = "11"

    ?

    So muß mal deutlich was machen und jeder der das liest sieht das da string und Zahl zusammenkommen sollen.



  • @Marc++us:
    Dass du das empfiehlst verwundert mich. Viel eleganter ist doch sowas:

    template<class T, class Ch, class A> std::basic_string<Ch, std::char_traits<Ch>, A> operator+(T const &a, std::basic_string<Ch, std::char_traits<Ch>, A> const &b) {
      ostringstream s;
      s << a << b;
      return s.str();
    }
    
    template<class T, class Ch, class A> std::basic_string<Ch, std::char_traits<Ch>, A> operator+(std::basic_string<Ch, std::char_traits<Ch>, A> const &a, T const &b) {
      ostringstream s;
      s << a << b;
      return s.str();
    }
    

    <ungetestet, wie immer>



  • Optimizer schrieb:

    Gibt es eigentlich keine Klasse, die so arbeitet wie die in Java?

    nein. wäre auch nicht ok für c++.
    irgendwie hat man recht viele freiheitsgrade, und genau die richtige string-klasse hat man nie.
    - soll sie begin und end speichern, begin und length oder begin und nullterminiert sein? kann wichtig sein für schneller vergleiche, speicherplatzverbrauch und so.
    - soll der string am stück im speicher liegen oder in kleinen blöcken? für schnelles insert/replace auf langen strings natürlich nur kleine blöcke, dafür aber lahmerer op[].
    - sollen expression templates drum sein, um die längenberechnung bei a=b+c+d+e vom kopieren zu trennen? eigentlich logo, aber der arme anwender wird evtl verrecken, wenn er sich nen op+(string,int) dazubauen möchte.
    - copy-on-write? eigentlich auch logo, aber leider ist copy-on-write gar nicht so schnell, wie es scheint.
    - gehört dem string überhaupt immer sein speicher? bei memory-mapping besser nicht. normalerweise schon. kann man die unterschiedlichen besitzanforderungen kostengünstig in eine klasse sperren?

    fragen über fragen. alles, was wie haben, ist eine recht angenehme klasse std::string. aber jeder ist aufgefordert, sie zu erweitern, umzubauen, anzupassen oder zu ersetzen, wenns die eigene anwendung erfordert. bis auf regexps und expression templates geht das ja auch ganz flüssig zu schreiben.



  • Java-Strings sind trotzdem bessa 😉
    Naja mal im Ernst, bei Strings kommt es mir auf die Geschwindigkeit nicht so wahnsinnig an, da ist mir der Komfort schon wichtiger.

    Das mit "1" + 1 = "11" sollte eigentlich klar sein, in VB hat man es sogar noch besser gelöst, da verknüpft man Strings mit &.

    Naja was solls, bleib ich bei meinen ostringstreams...



  • Naja was solls, bleib ich bei meinen ostringstreams...

    hmm, um es dir nochmal zu sagen, ostringstreams sind eben keine string Klasse. Warum implementierst du nicht einfach deine + oder & Operatoren? Du benutzt eine Sprache wo du so was machen kannst! Ich versteh nicht den Sinn deiner Beschwerde.



  • Was soll das heißen, ostringstream ist keine String-Klasse? Mir reicht das, wenn ich Variablen von diesem Typ erstellen kann.
    Ich schreibe zur Zeit ein recht komplexes Spiel und möchte eine fertige Lösung haben um ein bisschen Text zu verknüpfen und auszugeben (hab ich ja auch). Man soll bekanntlich das Rad nicht immer wieder neu erfinden.

    Ich war einfach erstaunt, was die Klasse String in Java leistet und hab mich gefragt, ob es das so für C++ auch gibt.



  • Optimizer schrieb:

    Das mit "1" + 1 = "11" sollte eigentlich klar sein, in VB hat man es sogar

    Ja, da musst Du auch was anderes schreiben als + . Mit + gehts zwar aber nicht immer. Manchmal gehts halt schief.

    Wenn Du mit VB und dem & Zahl einverstanden bist, bist Du sicherlich auch mit einem foo(Zahl) einvestanden 🤡



  • Manchmal gehts halt schief.

    In VB ist es eigentlich so gedacht, dass man + gar nicht für String-Operationen verwendet. Dann geht auch nichts schief.

    Aber egal, VB lutscht halt trotzdem 😢



  • Ja aber es geht 🤡

    Ehrlich gesagt wäre es mir aber lieber es ging nicht. Hab auch schon oft geflucht weil man alles hin und her wandeln muß. Aber man kommt so zu wesentlich weniger Überraschungen....

    Aber mal so nebenbei gefragt: Für was is + bei Strings und VB gedacht ?



  • Frag mich nicht, nimms einfach nicht her. 🙂
    Wenn du & nimmst ist auch immer sofort ersichtlich, wo eine Rechnung ist und wo eine Stringverknüpfung.



  • Optimizer schrieb:

    Java-Strings sind trotzdem bessa 😉

    da hilft nur eines: benutze java.



  • Was soll das heißen, ostringstream ist keine String-Klasse?

    Welcher Teil des Satzes ist unklar?

    Mal ganz grob: Eine Stringklasse ist eine Abstraktion zur Manipulation von Zeichenketten.
    ostringstream hingegen ist eine Abstraktion eines Streams der als "physisches Ausgabegerät" einen String verwendet.

    Ich schreibe zur Zeit ein recht komplexes Spiel und möchte eine fertige Lösung haben um ein bisschen Text zu verknüpfen und auszugeben

    Neben der bereits mehrfach erwähnten Lösung finde ich persönlich boost::lexical_cast auch ganz hübsch.



  • Gut, ich muss ganz ehrlich zugeben, mir ist eigentlich nicht ganz klar was streams sind. Ich werd mich da mal schlau machen...
    Irgendwann wenn ich mal Zeit und Bock hab schreib ich mir auch ne eigene String-Klasse (ich hab sogar mal vor einem Monat damit angefangen).

    Ich persönlich finde, dass Java eigentlich (nicht nur deswegen) eine viel bessere Sprache ist, das Problem ist nur, dass ich mir nicht vorstellen kann, damit Spiele zu entwickeln.



  • dein Problem scheint mir zu sein, dass du C++ nicht verstehst. Zumindest kann ich das aus deinen Beiträgen der letzten Tagen in dem Forum erkennen.

    Und das du das Verhalten mit 4 Zeilen Code erzeugen kannst und dir keine String Klasse implementieren musst, hast du wohl auch noch nicht verstanden?



  • Ich persönlich finde, dass Java eigentlich (nicht nur deswegen) eine viel bessere Sprache ist, das Problem ist nur, dass ich mir nicht vorstellen kann, damit Spiele zu entwickeln.

    Diese Aussage ist, äh, wirr. Entweder du machst absolute Aussagen, wie "Java ist eine viel bessere Sprache als Foo". Dann nimmt dich wahrscheinlich keiner ernst und du musst sie am Ende selbst relativieren (wie hier) oder du lernst, dass Programmiersprachen nur Mittel zum Zweck sind und triffst lieber Aussagen wie "Java ist meiner Meinung nach das Beste Werkzeug zur Erstellung von Foo-Anwendungen, für Bar-Anwendungen scheint es mir aber nicht so brauchbar zu sein".

    Danach solltest du dich noch mit dem Gedanken anfreunden, dass jede Sprache ihre eigenen Idiome besitzt und das es keinen Sinn macht in einer Sprache A so zu programmieren, als würde man die Sprache B einsetzen.
    Du kannst nicht versuchen in Java C++ zu programmieren und dann der Sprache vorwerfen, dass dies nicht funktioniert. Und andersherum geht das natürlich auch nicht.



  • Guck dir mal Mr.Ns Beispiel an:

    template<class T, class Ch, class A> std::basic_string<Ch, std::char_traits<Ch>, A> operator+(T const &a, std::basic_string<Ch, std::char_traits<Ch>, A> const &b) { 
      ostringstream s; 
      s << a << b; 
      return s.str(); 
    } 
    
    template<class T, class Ch, class A> std::basic_string<Ch, std::char_traits<Ch>, A> operator+(std::basic_string<Ch, std::char_traits<Ch>, A> const &a, T const &b) { 
      ostringstream s; 
      s << a << b; 
      return s.str(); 
    }
    

    Und schon hat die String-Klass einen + Operator, mit dem du alles anhängen kannst, was auch an ostreams mit << geschickt werden kann.

    Dann funzt auch

    string a = "1";
    string b = a + 1;
    cout << b;  // 11
    

Anmelden zum Antworten