std::list<T,Allocator>::erase
| (1) | ||
iterator erase( iterator pos ); |
(bis C++11) | |
| iterator erase( const_iterator pos ); |
(seit C++11) | |
| (2) | ||
iterator erase( iterator first, iterator last ); |
(bis C++11) | |
| iterator erase( const_iterator first, const_iterator last ); |
(seit C++11) | |
Löscht die angegebenen Elemente aus dem Container.
[first, last).Referenzen und Iteratoren auf die gelöschten Elemente sind ungültig. Andere Referenzen und Iteratoren werden nicht beeinträchtigt.
Der Iterator pos muss gültig und dereferenzierbar sein. Daher kann der end()-Iterator (der gültig, aber nicht dereferenzierbar ist) nicht als Wert für pos verwendet werden.
Der Iterator first muss nicht dereferenzierbar sein, wenn first == last: Das Löschen eines leeren Bereichs hat keine Auswirkung.
Inhalt |
[bearbeiten] Parameter
| pos | - | Iterator auf das zu entfernende Element |
| first, last | - | Das Iteratorenpaar, das den Bereich der zu entfernenden Elemente definiert |
[bearbeiten] Rückgabewert
Iterator nach dem letzten entfernten Element.
[first, last) ein leerer Bereich ist, wird last zurückgegeben.[bearbeiten] Ausnahmen
(keine)
[bearbeiten] Komplexität
[bearbeiten] Hinweise
Wenn Container-Elemente basierend auf einem Prädikat gelöscht werden müssen, wird anstelle des Iterierens durch den Container und des Aufrufs von unären erase die Iterator-Bereich-Überladung im Allgemeinen mit std::remove()/std::remove_if() verwendet, um die Anzahl der Verschiebungen der verbleibenden (nicht entfernten) Elemente zu minimieren. Dies ist das Erase-Remove-Idiom. std::erase_if() ersetzt das Erase-Remove-Idiom.(seit C++20)
[bearbeiten] Beispiel
#include <list> #include <iostream> #include <iterator> void print_container(const std::list<int>& c) { for (int i : c) std::cout << i << ' '; std::cout << '\n'; } int main() { std::list<int> c{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; print_container(c); c.erase(c.begin()); print_container(c); std::list<int>::iterator range_begin = c.begin(); std::list<int>::iterator range_end = c.begin(); std::advance(range_begin, 2); std::advance(range_end, 5); c.erase(range_begin, range_end); print_container(c); // Erase all even numbers for (std::list<int>::iterator it = c.begin(); it != c.end();) { if (*it % 2 == 0) it = c.erase(it); else ++it; } print_container(c); }
Ausgabe
0 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 6 7 8 9 1 7 9
Defect reports
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 151 | C++98 | first musste dereferenzierbar sein, was Das Verhalten des Löschens einer leeren list wurde als undefiniert markiert. |
nicht erforderlich, wenn first == last |
[bearbeiten] Siehe auch
| entfernt alle Elemente, die bestimmte Kriterien erfüllen (function template) | |
| leert den Inhalt (public member function) |