std::list<T,Allocator>:: erase
| (1) | ||
|
iterator erase
(
iterator pos
)
;
|
(bis C++11) | |
|
iterator erase
(
const_iterator pos
)
;
|
(seit C++11)
(constexpr seit C++26) |
|
| (2) | ||
|
iterator erase
(
iterator first, iterator last
)
;
|
(bis C++11) | |
|
iterator erase
(
const_iterator first, const_iterator last
)
;
|
(seit C++11)
(constexpr seit C++26) |
|
Löscht die angegebenen Elemente aus dem Container.
[
first
,
last
)
.
Referenzen und Iteratoren zu den gelöschten Elementen werden ungültig. Andere Referenzen und Iteratoren sind nicht betroffen.
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, falls first == last : Das Löschen eines leeren Bereichs ist eine No-Op.
Inhaltsverzeichnis |
Parameter
| pos | - | Iterator zum zu entfernenden Element |
| first, last | - | Das Iteratorpaar, das den Bereich der zu entfernenden Elemente definiert |
Rückgabewert
Iterator, der dem letzten entfernten Element folgt.
[
first
,
last
)
ein leerer Bereich ist, dann wird
last
zurückgegeben.
Komplexität
Hinweise
Wenn Containerelemente basierend auf einem Prädikat gelöscht werden müssen, wird anstatt den Container zu iterieren und unäres
erase
aufzurufen, generell die Iteratorbereich-Überladung mit
std::remove()/std::remove_if()
verwendet, um die Anzahl der Verschiebungen der verbleibenden (nicht gelöschten) Elemente zu minimieren — dies ist das Erase-Remove Idiom.
std::erase_if()
ersetzt das Erase-Remove Idiom.
(since C++20)
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); // Alle geraden Zahlen löschen 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
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 151 | C++98 |
first
musste dereferenzierbar sein, was
das Verhalten beim Löschen einer leeren
list
undefiniert machte
|
nicht erforderlich, wenn
first == last |
Siehe auch
|
löscht alle Elemente, die bestimmte Kriterien erfüllen
(Funktions-Template) |
|
|
löscht den Inhalt
(öffentliche Elementfunktion) |