Namespaces
Variants

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

From cppreference.net

(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.

1) Entfernt das Element an Position pos .
2) Entfernt die Elemente im Bereich [ 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, falls first == last : Das Löschen eines leeren Bereichs ist eine No-Op.

Inhaltsverzeichnis

Parameter

pos - Iterator auf das zu entfernende Element
first, last - Das Paar von Iteratoren, die den Bereich der zu entfernenden Elemente definieren
Typanforderungen
-
Wenn T nicht MoveAssignable ist, ist das Verhalten undefiniert.

Rückgabewert

Iterator, der dem letzten entfernten Element folgt.

1) Wenn pos auf das letzte Element verweist, dann wird der end() Iterator zurückgegeben.
2) Wenn last == end ( ) vor dem Entfernen, dann wird der aktualisierte end() Iterator zurückgegeben.
Wenn [ first , last ) ein leerer Bereich ist, dann wird last zurückgegeben.

Exceptions

Wirft keine Ausnahme, es sei denn, eine Ausnahme wird vom Zuweisungsoperator von T geworfen.

Komplexität

Linear: Die Anzahl der Aufrufe des Destruktors von T entspricht der Anzahl der gelöschten Elemente, die Anzahl der Aufrufe des Zuweisungsoperators von T ist nicht größer als das Minimum der Anzahl der Elemente vor den gelöschten Elementen und der Anzahl der Elemente nach den gelöschten Elementen.

Hinweise

Wenn Containerelemente basierend auf einem Prädikat gelöscht werden müssen, wird anstatt den Container zu iterieren und unär 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 <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);
    // Alle geraden Zahlen löschen
    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

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 eines leeren deque undefiniert machte
nicht erforderlich, wenn
first == last
LWG 638 C++98 der Past-the-End-Iterator wurde nicht invalidisiert er wird invalidisiert, wenn die Elemente
aus der Mitte oder dem Ende gelöscht werden

Siehe auch

löscht alle Elemente, die bestimmte Kriterien erfüllen
(Funktions-Template)
löscht den Inhalt
(öffentliche Elementfunktion)