Was ist das Verhalten beim Löschen des 'end ()' einer 'std :: list'?

7

Ich muss ein Element aus einem std::list entfernen, nachdem ich es mit std::find gefunden habe. Wie lautet das Verhalten beim Aufruf von std::list::erase mit end() der Liste? Mein Fall ist etwa so:

%Vor%

cplusplus.com sagt:

  

Wenn die Position (oder der Bereich) gültig ist, gibt die Funktion niemals Ausnahmen aus (No-Throw-Garantie).   Andernfalls verursacht es undefiniertes Verhalten.

aber was ich nicht weiß ist, ob end() dort als gültig angesehen wird.

    
Janoma 27.02.2013, 16:03
quelle

3 Antworten

17

Diese Site verwendet den vagen (und wahrscheinlich falschen) Begriff "gültig", aber die Bibliotheksspezifikation (C ++ 11 23.2.3) verwendet den spezifischeren Begriff "dereferenzierbar" - was bedeutet, dass der Iterator auf ein Objekt verweisen muss. Der UI-Iterator kann nicht dereferenziert werden, so dass das Löschen zu undefiniertem Verhalten führt.

    
Mike Seymour 27.02.2013, 16:09
quelle
6

Es ist nicht. Der Versuch, end() zu löschen, führt zu undefiniertem Verhalten.

    
NPE 27.02.2013 16:05
quelle
2

end () Gibt einen Iterator zurück, der sich auf den Iterator der Vergangenheit und des Endes im Listencontainer und nicht auf das letzte Objekt in der Liste bezieht.

Durch das Löschen / Löschen des Endes löschen Sie außerhalb des Bereichs Ihrer Liste. Dein Code sollte sein:

%Vor%

Auch wenn find () keinen Wert in Ihrer Liste findet, gibt es den Ende-Iterator zurück, es sagt Ihnen im Grunde, dass der Wert, nach dem Sie suchen, außerhalb Ihrer Liste (nicht in Ihrer Liste) liegt.

    
Zaid Amir 27.02.2013 16:08
quelle

Tags und Links