std::unordered_set
| Definiert in Header <unordered_set> |
||
| template< class Key, |
(1) | (seit C++11) |
| namespace pmr { template< |
(2) | (seit C++17) |
std::unordered_set ist ein assoziativer Container, der eine Menge eindeutiger Objekte vom Typ Key enthält. Suchen, Einfügen und Entfernen haben eine durchschnittliche konstante Zeitkomplexität.
Intern sind die Elemente nicht in irgendeiner bestimmten Reihenfolge sortiert, sondern in Buckets organisiert. Welchen Bucket ein Element erhält, hängt vollständig vom Hash seines Wertes ab. Dies ermöglicht einen schnellen Zugriff auf einzelne Elemente, da nach der Berechnung eines Hashs dieser auf den exakten Bucket verweist, in den das Element platziert wurde.
Container-Elemente können nicht modifiziert werden (auch nicht durch nicht-const Iteratoren), da eine Modifikation den Hash eines Elements ändern und den Container beschädigen könnte.
std::unordered_set erfüllt die Anforderungen von Container, AllocatorAwareContainer, UnorderedAssociativeContainer.
|
Alle Memberfunktionen von |
(seit C++26) |
Inhalt |
[edit] Iterator-Ungültigkeit
| Operationen | Invalidiert |
|---|---|
| Alle schreibgeschützten Operationen, swap, std::swap | Niemals |
| clear, rehash, reserve, operator= | Immer |
| insert, emplace, emplace_hint | Nur wenn Rehash ausgelöst wird |
| erase | Nur für das gelöschte Element |
[edit] Anmerkungen
- Die Swap-Funktionen machen keine der Iteratoren innerhalb des Containers ungültig, machen aber den Iterator, der das Ende des Swap-Bereichs markiert, ungültig.
- Referenzen und Zeiger auf im Container gespeicherte Daten werden nur durch das Löschen dieses Elements ungültig gemacht, auch wenn der entsprechende Iterator ungültig wird.
- Nach der Move-Zuweisung des Containers, es sei denn, die Element-weise Move-Zuweisung wird durch inkompatible Allokatoren erzwungen, bleiben Referenzen, Zeiger und Iteratoren (außer dem Past-the-End-Iterator) des bewegten Containers gültig, verweisen aber auf Elemente, die sich nun in *this befinden.
[edit] Template-Parameter
| Dieser Abschnitt ist unvollständig Grund: Beschreibungen der Template-Parameter hinzufügen. |
[edit] Member-Typen
| Typ | Definition |
key_type
|
Key |
value_type
|
Key |
size_type
|
Vorzeichenloser Ganzzahltyp (normalerweise std::size_t) |
difference_type
|
Vorzeichenbehafteter Ganzzahltyp (normalerweise std::ptrdiff_t) |
hasher
|
Hash |
key_equal
|
KeyEqual |
allocator_type
|
Allocator |
Referenz
|
value_type& |
const_reference
|
const value_type& |
Zeiger
|
std::allocator_traits<Allocator>::pointer |
const_pointer
|
std::allocator_traits<Allocator>::const_pointer |
iterator
|
Konstante LegacyForwardIterator und ConstexprIterator(seit C++26) zu value_type |
const_iterator
|
LegacyForwardIterator und ConstexprIterator(seit C++26) zu const value_type |
local_iterator
|
Ein Iterator-Typ, dessen Kategorie, Wert, Differenz, Zeiger und Referenztypen dieselben sind wie bei iterator. Dieser Iteratorkann verwendet werden, um durch einen einzelnen Bucket zu iterieren, aber nicht über Buckets hinweg |
const_local_iterator
|
Ein Iterator-Typ, dessen Kategorie, Wert, Differenz, Zeiger und Referenztypen dieselben sind wie bei const_iterator. Dieser Iteratorkann verwendet werden, um durch einen einzelnen Bucket zu iterieren, aber nicht über Buckets hinweg |
node_type (seit C++17) |
eine Spezialisierung von node handle, die einen Containerknoten repräsentiert |
insert_return_type (seit C++17) |
Typ, der das Ergebnis des Einfügens eines node_type beschreibt, eine Spezialisierung vontemplate<class Iter, class NodeType> |
[edit] Memberfunktionen
konstruiert den unordered_set(public member function) | |
destruiert den unordered_set(public member function) | |
| weist dem Container Werte zu (public member function) | |
| gibt den zugehörigen Allocator zurück (public member function) | |
Iteratoren | |
| gibt einen Iterator zum Anfang zurück (public member function) | |
| gibt einen Iterator zum Ende zurück (public member function) | |
Kapazität | |
| prüft, ob der Container leer ist (public member function) | |
| Gibt die Anzahl der Elemente zurück (public member function) | |
| Gibt die maximal mögliche Anzahl von Elementen zurück (public member function) | |
Modifizierer | |
| leert den Inhalt (public member function) | |
| fügt Elemente ein oder Knoten(seit C++17) (public member function) | |
| (C++23) |
fügt einen Bereich von Elementen ein (public member function) |
| konstruiert Elemente direkt (in-place) (public member function) | |
| konstruiert Elemente "in place" unter Verwendung eines Hinweises (public member function) | |
| entfernt Elemente (public member function) | |
| tauscht die Inhalte (public member function) | |
| (C++17) |
extrahiert Knoten aus dem Container (public member function) |
| (C++17) |
fügt Knoten aus einem anderen Container zusammen (public member function) |
Suche | |
| gibt die Anzahl der Elemente zurück, die einem bestimmten Schlüssel entsprechen (public member function) | |
| sucht ein Element mit einem bestimmten Schlüssel (public member function) | |
| (C++20) |
prüft, ob der Container ein Element mit einem bestimmten Schlüssel enthält (public member function) |
| gibt den Bereich von Elementen zurück, die einem bestimmten Schlüssel entsprechen (public member function) | |
Bucket-Schnittstelle | |
| gibt einen Iterator zum Anfang des angegebenen Buckets zurück (public member function) | |
| gibt einen Iterator zum Ende des angegebenen Buckets zurück (public member function) | |
| gibt die Anzahl der Buckets zurück (public member function) | |
| gibt die maximale Anzahl von Buckets zurück (public member function) | |
| gibt die Anzahl der Elemente in einem bestimmten Bucket zurück (public member function) | |
| gibt den Bucket für einen bestimmten Schlüssel zurück (public member function) | |
Hash-Politik | |
| gibt die durchschnittliche Anzahl von Elementen pro Bucket zurück (public member function) | |
| verwaltet die maximale durchschnittliche Anzahl von Elementen pro Bucket (public member function) | |
| reserviert mindestens die angegebene Anzahl von Buckets und generiert die Hashtabelle neu (public member function) | |
| reserviert Speicher für mindestens die angegebene Anzahl von Elementen und generiert die Hashtabelle neu (public member function) | |
Observer | |
| gibt die zum Hashen der Schlüssel verwendete Funktion zurück (public member function) | |
| gibt die zum Vergleichen von Schlüsseln auf Gleichheit verwendete Funktion zurück (public member function) | |
[edit] Nicht-Member-Funktionen
| (C++11)(C++11)(entfernt in C++20) |
vergleicht die Werte im unordered_set (function template) |
| spezialisiert den Algorithmus std::swap (function template) | |
| (C++20) |
entfernt alle Elemente, die bestimmte Kriterien erfüllen (function template) |
Deduction Guides |
(seit C++17) |
[edit] Anmerkungen
Die Member-Typen iterator und const_iterator können Aliase für denselben Typ sein. Das bedeutet, dass die Definition eines Paares von Funktionsüberladungen, die die beiden Typen als Parametertypen verwenden, die Ein-Definitionen-Regel (ODR) verletzen kann. Da iterator in const_iterator konvertierbar ist, funktioniert stattdessen eine einzelne Funktion mit einem const_iterator als Parametertyp.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_containers_ranges |
202202L |
(C++23) | Bereichskonstruktion und -einfügung für Container |
__cpp_lib_constexpr_containers |
202502L |
(C++26) | constexpr std::unordered_set |
[edit] Beispiel
#include <iostream> #include <unordered_set> void print(const auto& set) { for (const auto& elem : set) std::cout << elem << ' '; std::cout << '\n'; } int main() { std::unordered_set<int> mySet{2, 7, 1, 8, 2, 8}; // creates a set of ints print(mySet); mySet.insert(5); // puts an element 5 in the set print(mySet); if (auto iter = mySet.find(5); iter != mySet.end()) mySet.erase(iter); // removes an element pointed to by iter print(mySet); mySet.erase(7); // removes an element 7 print(mySet); }
Mögliche Ausgabe
8 1 7 2 5 8 1 7 2 8 1 7 2 8 1 2
[edit] Fehlerberichte
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 2050 | C++11 | die Definitionen von reference, const_reference, pointerund const_pointer basierten auf allocator_type |
basierend auf value_type undstd::allocator_traits |
[edit] Siehe auch
| (C++11) |
Sammlung von Schlüsseln, gehasht nach Schlüsseln (Klassenvorlage) |
| Sammlung eindeutiger Schlüssel, sortiert nach Schlüsseln (Klassenvorlage) | |
| (C++23) |
passt einen Container an, um eine Sammlung eindeutiger Schlüssel, sortiert nach Schlüsseln, bereitzustellen (Klassenvorlage) |