std::unordered_set<Key,Hash,KeyEqual,Allocator>::erase
Von cppreference.com
< cpp | container | unordered set
| (1) | ||
iterator erase( iterator pos ); |
(seit C++11) (bis C++23) |
|
| iterator erase( iterator pos ) requires(!std::same_as<iterator, const_iterator>); |
(seit C++23) | |
| iterator erase( const_iterator pos ); |
(2) | (seit C++11) |
| iterator erase( const_iterator first, const_iterator last ); |
(3) | (seit C++11) |
| size_type erase( const Key& key ); |
(4) | (seit C++11) |
template< class K > size_type erase( K&& x ); |
(5) | (seit C++23) |
Entfernt angegebene Elemente aus dem Container. Die Reihenfolge der verbleibenden Elemente bleibt erhalten. (Dies ermöglicht das Löschen einzelner Elemente während der Iteration durch den Container.)
1,2) Entfernt das Element an der Position pos. Nur ein Überladung ist vorhanden, wenn
iterator und const_iterator vom selben Typ sind.3) Entfernt die Elemente im Bereich
[first, last), was ein gültiger Bereich in *this sein muss.4) Entfernt das Element (falls vorhanden) mit dem Schlüssel, das zu key äquivalent ist.
5) Entfernt alle Elemente mit einem Schlüssel, der äquivalent zu dem Wert x ist. Diese Überladung nimmt nur an der Overload-Auflösung teil, wenn Hash::is_transparent und KeyEqual::is_transparent gültig sind und jeweils einen Typ bezeichnen und weder
iterator noch const_iterator implizit von K konvertierbar sind. Dies setzt voraus, dass ein solches Hash sowohl mit dem Typ K als auch mit dem Typ Key aufrufbar ist und dass KeyEqual transparent ist, was zusammen die Aufrufbarkeit dieser Funktion ohne die Erzeugung einer Instanz von Key ermöglicht.Referenzen und Iteratoren auf die gelöschten Elemente werden ungültig. Andere Iteratoren und Referenzen werden nicht 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.
Inhalt |
[edit] Parameter
| pos | - | Iterator auf das zu entfernende Element |
| first, last | - | Das Iteratorenpaar, das den Bereich der zu entfernenden Elemente definiert |
| key | - | Schlüsselwert der zu entfernenden Elemente |
| x | - | Ein Wert eines beliebigen Typs, der transparent mit einem Schlüssel verglichen werden kann, der die zu entfernenden Elemente bezeichnet |
[edit] Rückgabewert
1-3) Iterator nach dem zuletzt entfernten Element.
4) Anzahl der entfernten Elemente (0 oder 1).
5) Anzahl der entfernten Elemente.
[edit] Ausnahmen
1-3) Wirft nichts.
4,5) Alle Ausnahmen, die vom
Hash- und KeyEqual-Objekt ausgelöst werden.[edit] Komplexität
Gegeben eine Instanz c von unordered_set
1,2) Durchschnittlicher Fall: konstant, schlimmster Fall: c.size().
4) Durchschnittlicher Fall: c.count(key), schlimmster Fall: c.size().
5) Durchschnittlicher Fall: c.count(x), schlimmster Fall: c.size().
Anmerkungen
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_associative_heterogeneous_erasure |
202110L |
(C++23) | Heterogene Löschung in assoziativen Containern und unordentlichen assoziativen Containern; Überladung (5) |
[edit] Beispiel
Führen Sie diesen Code aus
#include <unordered_set> #include <iostream> int main() { std::unordered_set<int> c = {1, 2, 3, 4, 1, 2, 3, 4}; auto print = [&c] { std::cout << "c = { "; for (int n : c) std::cout << n << ' '; std::cout << "}\n"; }; print(); std::cout << "Erase all odd numbers:\n"; for (auto it = c.begin(); it != c.end();) { if (*it % 2 != 0) it = c.erase(it); else ++it; } print(); std::cout << "Erase 1, erased count: " << c.erase(1) << '\n'; std::cout << "Erase 2, erased count: " << c.erase(2) << '\n'; std::cout << "Erase 2, erased count: " << c.erase(2) << '\n'; print(); }
Mögliche Ausgabe
c = { 1 2 3 4 }
Erase all odd numbers:
c = { 2 4 }
Erase 1, erased count: 0
Erase 2, erased count: 1
Erase 2, erased count: 0
c = { 4 }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 2059 | C++11 | Es gab Mehrdeutigkeit für die Überladung (2) | Überladung (1) hinzugefügt |
| LWG 2356 | C++11 | die Reihenfolge nicht-äquivalenter Elemente, die nicht gelöscht wurden, war nicht garantiert beibehalten zu werden |
musste erhalten bleiben |
[edit] Siehe auch
| leert den Inhalt (public member function) |