Namensräume
Varianten
Aktionen

std::inplace_vector<T,N>::erase

Von cppreference.com
 
 
 
 
constexpr iterator erase( const_iterator pos );
(1) (seit C++26)
constexpr iterator erase( const_iterator first, const_iterator last );
(2) (seit C++26)

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 Elemente an oder nach der Stelle 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

[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 vor dem Entfernen last == end() ist, 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 für die Anzahl der Elemente im Vektor nach den gelöschten Elementen aufgerufen.

[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-Aufruf zu verwenden, wird im Allgemeinen die Iterator-Bereich-Überladung 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.

[bearbeiten] Beispiel

#include <inplace_vector>
#include <print>
 
int main()
{
    std::inplace_vector<int, 10> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    std::println("{}", v);
 
    v.erase(v.begin());
    std::println("{}", v);
 
    v.erase(v.begin() + 2, v.begin() + 5);
    std::println("{}", v);
 
    // Erase all even numbers
    for (std::inplace_vector<int, 10>::iterator it{v.begin()}; it != v.end();)
        if (*it % 2 == 0)
            it = v.erase(it);
        else
            ++it;
    std::println("{}", v);
}

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]

[bearbeiten] Siehe auch

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