Namensräume
Varianten
Aktionen

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

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

Referenzen und Iteratoren auf die gelöschten Elemente sind ungültig. Andere Referenzen und Iteratoren werden nicht beeinträchtigt.

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

[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 gilt, wird der aktualisierte end()-Iterator zurückgegeben.
Wenn [firstlast) ein leerer Bereich ist, wird last zurückgegeben.

[bearbeiten] Ausnahmen

(keine)

[bearbeiten] Komplexität

1) Konstant.
2) Linear in der Distanz zwischen first und last.

[bearbeiten] Hinweise

Wenn Container-Elemente basierend auf einem Prädikat gelöscht werden müssen, wird anstelle des Iterierens durch den Container und des Aufrufs von unären erase die Iterator-Bereich-Ü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 <list>
#include <iostream>
#include <iterator>
 
void print_container(const std::list<int>& c)
{
    for (int i : c)
        std::cout << i << ' ';
    std::cout << '\n';
}
 
int main()
{
    std::list<int> c{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    print_container(c);
 
    c.erase(c.begin());
    print_container(c);
 
    std::list<int>::iterator range_begin = c.begin();
    std::list<int>::iterator range_end = c.begin();
    std::advance(range_begin, 2);
    std::advance(range_end, 5);
 
    c.erase(range_begin, range_end);
    print_container(c);
 
    // Erase all even numbers
    for (std::list<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 Löschens einer leeren list wurde als undefiniert markiert.
nicht erforderlich, wenn
first == last

[bearbeiten] Siehe auch

entfernt alle Elemente, die bestimmte Kriterien erfüllen
(function template) [edit]
leert den Inhalt
(public member function) [edit]