kurze Frage zu .end()



  • Hallo, ich habe eine kurze Frage zu T.end().

    Ist der Iterator, den man erhält, wenn man den .end() Iterator dekrementiert, garantiert dereferenzierbar und zeigt garantiert AUF das letzte Element des containers/strings/was auch immer?

    container C;
    C.push_back(1);
    C.push_back(2);
    C.push_back(3);
    
    C::iterator i = C.end();
    cout<<*(i-1); //ist das garantiert dereferenzierbar und zeigt auf 3 ?
    


  • Japp, aber für diese Richtung gibt es auch noch reverse_iterator. Da kann man auch gleich rbegin nehmen. Kommt halt drauf an, was du genau machen möchtest...

    In deinem Code ist übrigens ein kleiner Fehler: container::iterator

    bb



  • unskilled schrieb:

    In deinem Code ist übrigens ein kleiner Fehler: container::iterator

    Ja, da hast du Recht 😃

    Danke für die Antwort!



  • Gilder schrieb:

    Dereferenzierbar garantiert, dekrementiert Iterator .end() den man wenn, erhält man den, Iterator der ist

    Aber aufpassen, wenn der Container leer ist, dann ist natürlich nix garantiert.



  • Gilder schrieb:

    cout<<*(i-1); //ist das garantiert dereferenzierbar und zeigt auf 3 ?
    

    Das ist vielleicht nicht einmal subtrahierbar, es muss sich schliesslich nicht um Random-Access-Iteratoren handeln.

    Aber du meinst sicher *(--i) .



  • Da will ich mich so allgemein wie möglich halten, und dann gehts doch noch allgemeiner. Aber du hast recht. Deshalb habe ich ja im Einleitungstext auch dekrementiert geschrieben 😃

    Ich wusste halt nur, dass .end() garantiert "hinter" das ende zeigt. Daher hätte der .end() iterator ja auch eine art abstrakter wert sein können, der nur "ENDE" symbolisiert. Aber jetzt weis ich, dass --(x.end()) auf das letzte element zeigt, sofern der container natürlich nicht leer ist :>



  • Gilder schrieb:

    Aber jetzt weis ich, dass --(x.end()) auf das letzte element zeigt, sofern der container natürlich nicht leer ist :>

    ...und der Iterator mindestens ein bidirektionaler Iterator ist,
    ...und der Iterator eines Klassentyps ist und operator-- als Elementfunktion implementiert ist; Du kannst Dich nicht wirklich darauf verlassen, dass --(x.end()) funktioniert. "--3" funktioniert ja auch nicht. Btw: front() und back() gibts ja meist auch noch.

    Gruß,
    SP


  • Mod

    Wenn wir hier davon sprechen, dass ein Iterator auf das letzte Element dereferenziert werden soll: Es gibt da auch noch back(), was genau das macht.



  • SeppJ schrieb:

    Wenn wir hier davon sprechen, dass ein Iterator auf das letzte Element dereferenziert werden soll: Es gibt da auch noch back(), was genau das macht.

    guck mal paar cm über deinen post, was dort steht...



  • Zeigt end() nicht immer hinter das letzte Element?



  • Zeig0r schrieb:

    Zeigt end() nicht immer hinter das letzte Element?

    Stimmt. Aber lies dir doch nochmal genau den ersten Post durch 🙂


Anmelden zum Antworten