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:
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.
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.
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.