std::vector<T,Allocator>::erase
| (1) | ||
iterator erase( iterator pos ); |
(bis C++11) | |
| iterator erase( const_iterator pos ); |
(seit C++11) (constexpr seit C++20) |
|
| (2) | ||
iterator erase( iterator first, iterator last ); |
(bis C++11) | |
| iterator erase( const_iterator first, const_iterator last ); |
(seit C++11) (constexpr seit C++20) |
|
Löscht die angegebenen Elemente aus dem Container.
[first, last).Iteratoren (einschließlich des end()-Iterators) und Referenzen auf die Elemente an oder nach dem Punkt des Löschens werden ungültig.
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 an 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, der Zuweisungsoperator von T wird so oft aufgerufen wie die Anzahl der Elemente im Vektor nach den gelöschten Elementen.
[bearbeiten] Hinweise
Wenn Container-Elemente basierend auf einem Prädikat gelöscht werden müssen und nicht durch Iterieren des Containers und Aufrufen des unären erase, wird die Überladung für Iterator-Bereiche 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 <vector> #include <iostream> void print_container(const std::vector<int>& c) { for (int i : c) std::cout << i << ' '; std::cout << '\n'; } int main() { std::vector<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::vector<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 Leerens eines leeren vector undefiniert machte |
nicht erforderlich, wenn first == last |
| LWG 414 | C++98 | Iteratoren zum Zeitpunkt des Löschens wurden nicht ungültig gemacht | sie werden auch ungültig |
[bearbeiten] Siehe auch
| entfernt alle Elemente, die bestimmte Kriterien erfüllen (function template) | |
| leert den Inhalt (public member function) |