std::deque<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).Alle Iteratoren und Referenzen werden ungültig, es sei denn, die gelöschten Elemente befinden sich am Ende oder am Anfang des Containers. In diesem Fall werden nur die Iteratoren und Referenzen auf die gelöschten Elemente ungültig. Der end()-Iterator wird ebenfalls ungültig, es sei denn, die gelöschten Elemente befinden sich am Anfang des Containers und das letzte Element wird nicht gelöscht.
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 |
| Typanforderungen | ||
-T muss die Anforderungen von MoveAssignable erfüllen. | ||
[bearbeiten] Rückgabewert
Iterator nach dem letzten entfernten Element.
[first, last) ein leerer Bereich ist, wird last zurückgegeben.[bearbeiten] Ausnahmen
Wirft keine Ausnahme, es sei denn, der Zuweisungsoperator von T wirft eine Ausnahme.
[bearbeiten] Komplexität
Linear: Die Anzahl der Aufrufe des Destruktors von T ist gleich der Anzahl der gelöschten Elemente. Die Anzahl der Aufrufe des Zuweisungsoperators von T ist nicht größer als der kleinere Wert aus der Anzahl der Elemente vor den gelöschten Elementen und der Anzahl der Elemente nach den gelöschten Elementen.
[bearbeiten] Hinweise
Wenn Container-Elemente basierend auf einem Prädikat gelöscht werden müssen, anstatt den Container zu durchlaufen und den unären erase aufzurufen, wird die Iterator-Bereichsü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 <deque> #include <iostream> void print_container(const std::deque<int>& c) { for (int i : c) std::cout << i << ' '; std::cout << '\n'; } int main() { std::deque<int> c{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; print_container(c); c.erase(c.begin()); print_container(c); c.erase(c.begin() + 2, c.begin() + 5); print_container(c); // Erase all even numbers for (std::deque<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 verursachte das Löschen eines leeren deque zu undefiniertem Verhalten |
nicht erforderlich, wenn first == last |
| LWG 638 | C++98 | Der Past-the-End-Iterator wurde nicht ungültig | er wird ungültig, wenn die Elemente aus der Mitte oder vom Ende gelöscht werden |
[bearbeiten] Siehe auch
| entfernt alle Elemente, die bestimmte Kriterien erfüllen (function template) | |
| leert den Inhalt (public member function) |