Elegante Version zu "extractstring"



  • Guten Morgen zusammen,

    motiviert durch die vielen schönen Beispiele hier im Forum versuche ich derzeit meinen eigenen Code stilistisch etwas aufzubessern.

    Konkret probiere ich mich gerade an folgender Funktion
    string extractstring(string& s, const char& delim) ,
    die als Ergebnis den Anfangsteils von s bis zum ersten Auftreten des Zeichens delim (oder ganz s , falls delim nicht vorkommt) liefern soll und dabei am Anfang von s den entsprechenden Teilstring einschließlich des Trennzeichens löscht.

    Ursprünglich habe ich das so gelöst:

    string extractstring(string& s, const char& delim){
      size_t pos=s.find(delim);
      string res=s.substr(0,pos);
      s.erase(0,pos);
      if(!s.empty())
        s.erase(0,1);
      return res;
    }
    

    Besonders am Ende ist das etwas "fummelig" und ich dachte, das geht vielleicht auch eleganter, gerade auch weil die Standard-Funktion getline beinahe das gewünschte liefert.

    Die Überarbeitung ist mir aber auch nicht recht geklückt und sieht so aus:

    string extractstring(string& s, const char& delim){
      stringstream tmp;
    
      tmp << noskipws << s;
      string res;
      getline(tmp,res,delim);
    
      stringbuf* buf=new stringbuf;
      tmp >> buf;
      s=buf->str();
      delete buf;
    
      return res;
    }
    

    Ab dem getline ist das garnicht so, wie ich mir das vorgestellt habe.

    Vermutlich hilt vor allem "mehr Erfahrung sammeln", über Hinweise für ein besseres Vorgehen würde ich mich trotzdem freuen.



  • Die erste Version war schon gut (auch wenn ich nicht erwarten würde, dass delim weder in s, noch im Return-Wert erhalten bleibt). Die zweite Version ist dagegen ziemlich umständlich und außerdem unperformant, also eine klare Verschlimmbesserung.



  • Ich finde solche Funktionen gefährlich, da sie zwar einen Rückgabewert haben, aber ein Funktionsargument verändern. Der Parameter ist zwar keine const Referenz, aber ich würde, wenn ich die Funktionssignatur sehe, nicht erwarten, dass der Eingabestring verändert wird.


Anmelden zum Antworten