Dringend: --end() == letztes gültiges element



  • Wenn ich bei einer Liste den Iterator von end() um 1 dekrementiere, habe ich dann einen gültigen Iterator auf das (letzte) Element der Liste?



  • cppreference.com schrieb:

    "Note that before you can access the last element of the list using an iterator that you get from a call to end(), you'll have to decrement the iterator first."

    Also sollte --end() funktionieren.

    Sicher, dass du aber nicht lieber eins von denen hier benützen willst:
    rbegin()
    back()

    ?

    MfG SideWinder



  • back() liefert mir ja eine Referenz ich will aber einen Iterator und rbegin liefert ja einen reverse_iterator, den ich erst umwandeln müsste zu einem iterator

    Daher ist das halt der direkteste Weg.


  • Mod

    SideWinder schrieb:

    Also sollte --end() funktionieren.

    leider nicht. end() ist ein rvalue. zwar wird ein listiterator niemals ein einfacher pointer sein. aber operator-- muss nicht so überladen sein, dass dieser auf rvalues aufrufbar ist. das wäre der fall, wenn operator-- als freie funktion implementiert ist. ein variable, die end() direkt entgegennimmt, ist also notwendig.



  • Du meinst also:

    iterator it = myList.end();
    --it;
    

    So verwende ich das auch, aber es war mir nicht bewusst, dass --end() nicht unbedingt fuktionieren muss. Danke.



  • Afaik ist die gängige Praxis folgende:

    if(!container.empty() && iter == container.end()-1){...
    

    Wie camper schon saget das mit dem --end() "kann" gut gehen muss aber nicht. Und deshalb ist es besser container.end()-1 zu wählen.

    BR
    Vinzenz


  • Mod

    container.end()-1
    

    funktioniert allerdings nur mit random-access-iteratoren. allerdings gibt es ja auch noch boost::next und boost::prior für diesen zweck. also

    if(!container.empty() && iter == boost::prior(container.end()))
    

    nat. könnte man in diesem falle tatsächlich genausogut mit back() arbeiten:

    if(!container.empty() && &*iter == &container.back())
    

Anmelden zum Antworten