Namensräume
Varianten
Aktionen

std::vector<T,Allocator>::erase

Von cppreference.com
< cpp‎ | container‎ | vector
 
 
 
 
(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.

1) Entfernt das Element an der Position pos.
2) Entfernt die Elemente im Bereich [firstlast).

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.

1) Wenn pos auf das letzte Element verweist, wird der end()-Iterator zurückgegeben.
2) Wenn last == end() vor der Entfernung, wird der aktualisierte end()-Iterator zurückgegeben.
Wenn [firstlast) 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) [edit]
leert den Inhalt
(public member function) [edit]