Namensräume
Varianten
Aktionen

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

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

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

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.

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