Warum hat std::string keinen Construktor der zwei positionen nimmt



  • Weiß jemand warum der "substring constructor" von String so aussieht

    string (const string& str, size_t pos, size_t len = npos);
    

    und nicht so:

    string (const string& str, size_t pos, size_t endpos = npos);
    

    ?
    Das hätte z.B. den Vorteil, dass man als Parameter direkt Ergebnisse von std::string::find als Parameter nehmen könnte.



  • Mir fallen spontan nur Sprachen ein die substring alle mit (index, length) anbieten. Irgendeiner muss immer rechnen um den zweiten Parameter zu bekommen, bei beiden Fällen. 😉



  • Verwende einfach std::find, dann kannst du zwei Iteratoren übergeben. Sparst dir so sogar den ersten Parameter.



  • std__find schrieb:

    Verwende einfach std::find, dann kannst du zwei Iteratoren übergeben. Sparst dir so sogar den ersten Parameter.

    Thema verfehlt.



  • Beides geht nicht, weil gleiche Signatur. Wenn es so ginge wie du vorschlägst, gäbe es sicher Leute, die sich wundern, warum es nicht anders gelöst wurde.

    Bei std::string haben sich aber viele schlaue Leute (bestimmt viel schlauer als du) Gedanken dazu gemacht und sich für die vorhandene Lösung entschieden.



  • std__find schrieb:

    Verwende einfach std::find, dann kannst du zwei Iteratoren übergeben. Sparst dir so sogar den ersten Parameter.

    Ist leider kein vollständiger Ersatz, da man damit nur nach einzelnen Zeichen suchen kann.



  • oenone schrieb:

    Bei std::string haben sich aber viele schlaue Leute (bestimmt viel schlauer als du) Gedanken dazu gemacht und sich für die vorhandene Lösung entschieden.

    Das ist wohl das unnötigste Argument, das man bringen kann.

    http://www.gotw.ca/gotw/084.htm



  • oenone schrieb:

    Bei std::string haben sich aber viele schlaue Leute (bestimmt viel schlauer als du) Gedanken dazu gemacht und sich für die vorhandene Lösung entschieden.

    Das vermute ich auch, aber gerade deshalb sollte es dazu valide Gründe geben.



  • Ich finde halt, dass das Interface für den String generell recht stl untypisch ist. Während sonst immer mit Iteratoren und Ranges gearbeitet wird, verwendet String eher Indizes und Längen. Die sind zwar recht effizient ineinander überführbar, aber recht unkomfortabel und fehleranfällig.



  • Naja, es passt wunderbar zu std::string::substr.



  • Länge statt Endposition entfernt den Sonderfall "Ende vor Anfang".
    Und es ist praktisch im Fall "N Zeichen ab hier".

    Ausserdem sind die begin/end Varianten ja bereits in Form der Iterator-Overloads verfügbar.


  • Mod

    TNA schrieb:

    Ich finde halt, dass das Interface für den String generell recht stl untypisch ist. Während sonst immer mit Iteratoren und Ranges gearbeitet wird, verwendet String eher Indizes und Längen. Die sind zwar recht effizient ineinander überführbar, aber recht unkomfortabel und fehleranfällig.

    Es ist ja auch kein historischer Teil der STL, sondern der schon vorhandene String wurde zurecht gedoktort, damit er zumindest halbwegs der STL-Philosophie entspricht, an den Stellen, an denen das noch zu machen war.


  • Mod

    Länge statt Endposition entfernt den Sonderfall "Ende vor Anfang".

    Das ist kein Argument. Du (bzw. der Standard) kannst einfach sagen dass genau der Fall UB erzeugt. Wie soll das auch überhaupt passieren?

    Und es ist praktisch im Fall "N Zeichen ab hier".

    Und zwei Positionen zu nehmen sind praktisch im Fall vom Zeichen i bis Zeichen j.



  • Arcoth schrieb:

    Länge statt Endposition entfernt den Sonderfall "Ende vor Anfang".

    Das ist kein Argument. Du (bzw. der Standard) kannst einfach sagen dass genau der Fall UB erzeugt. Wie soll das auch überhaupt passieren?

    Natürlich ist es ein Argument - nur weil du es nicht verstehst heisst das nicht dass es keines wäre.
    Wenn es einen Sonderfall nicht gibt, dann stellt sich die Frage nicht was in dem Sonderfall passieren soll. Je weniger solcher Sonderfälle man dokumentieren/lernen muss, desto besser.

    Wenn du's immer noch nicht verstehst, dann überleg dir einfach was besser ist: eine Funktion wo's 1000 mögliche Sonderfälle gibt, die dann alle dokumentiert und gelernt werden müssen, oder eine wo's bloss 1-2 mögliche Sonderfälle gibt.
    Und ja, das ist übertrieben, aber es ist vom Prinzip her genau das selbe.



  • Arcoth schrieb:

    Und zwei Positionen zu nehmen sind praktisch im Fall vom Zeichen i bis Zeichen j.

    Bis einschließlich j oder bis vor j? Wie das jeweils andere Verhalten hinbekommen?



  • oenone schrieb:

    Bis einschließlich j oder bis vor j? Wie das jeweils andere Verhalten hinbekommen?

    bis vor j. In der STL sind Ranges immer exklusiv.


Log in to reply