std:: unordered_set
|
Definiert im 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. Suche, Einfügung und Entfernung haben durchschnittlich konstante Zeitkomplexität.
Internally sind die Elemente nicht in einer bestimmten Reihenfolge sortiert, sondern in Buckets organisiert. In welchen Bucket ein Element platziert wird, hängt vollständig vom Hash seines Werts ab. Dies ermöglicht schnellen Zugriff auf einzelne Elemente, da sobald ein Hash berechnet wurde, dieser auf den exakten Bucket verweist, in dem das Element platziert ist.
Containerelemente dürfen nicht modifiziert werden (selbst nicht durch nicht-konstante Iteratoren), da Modifikationen den Hash eines Elements ändern und den Container beschädigen könnten.
std::unordered_set
erfüllt die Anforderungen von
Container
,
AllocatorAwareContainer
,
UnorderedAssociativeContainer
.
Alle Memberfunktionen von
std::unordered_set
sind
constexpr
: Es ist möglich,
std::unordered_set
-Objekte in der Auswertung eines konstanten Ausdrucks zu erstellen und zu verwenden.
Allerdings können
|
(seit C++26) |
Inhaltsverzeichnis |
Iterator-Invalidierung
| Operationen | Ungültig gemacht |
|---|---|
| Alle schreibgeschützten Operationen, swap , std::swap | Niemals |
| clear , rehash , reserve , operator= | Immer |
| insert , emplace , emplace_hint | Nur bei Rehash-Auslösung |
| erase | Nur für das gelöschte Element |
Hinweise
- Die Swap-Funktionen machen keine Iteratoren innerhalb des Containers ungültig, aber sie machen den Iterator ungültig, der das Ende der Swap-Region markiert.
- Referenzen und Zeiger auf im Container gespeicherte Daten werden nur durch das Löschen dieses Elements ungültig, selbst wenn der entsprechende Iterator ungültig wird.
- Nach Container-Move-Zuweisung, sofern keine elementweise Move-Zuweisung durch inkompatible Allokatoren erzwungen wird, bleiben Referenzen, Zeiger und Iteratoren (außer dem Past-the-End-Iterator) zum verschobenen Container gültig, verweisen jedoch auf Elemente, die sich nun in * this befinden.
Template-Parameter
|
Dieser Abschnitt ist unvollständig
Grund: Beschreibungen der Template-Parameter hinzufügen. |
Mitgliedertypen
| Typ | Definition |
key_type
|
Key
|
value_type
|
Key
|
size_type
|
Vorzeichenloser Ganzzahltyp (üblicherweise std::size_t ) |
difference_type
|
Vorzeichenbehafteter Ganzzahltyp (üblicherweise std::ptrdiff_t ) |
hasher
|
Hash
|
key_equal
|
KeyEqual
|
allocator_type
|
Allocator
|
reference
|
value_type & |
const_reference
|
const value_type & |
pointer
|
std:: allocator_traits < Allocator > :: pointer |
const_pointer
|
std:: allocator_traits < Allocator > :: const_pointer |
iterator
|
Konstanter
LegacyForwardIterator
und
ConstexprIterator
(seit C++26)
zu
value_type
|
const_iterator
|
LegacyForwardIterator und ConstexprIterator (seit C++26) zu const value_type |
local_iterator
|
Ein Iteratortyp, dessen Kategorie, Wert-, Differenz-, Zeiger- und
Referenztypen mit
iterator
übereinstimmen. Dieser Iterator
kann verwendet werden, um durch einen einzelnen Bucket zu iterieren, aber nicht über Buckets hinweg |
const_local_iterator
|
Ein Iteratortyp, dessen Kategorie, Wert-, Differenz-, Zeiger- und
Referenztypen mit
const_iterator
übereinstimmen. Dieser Iterator
kann 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 Container-Knoten repräsentiert |
insert_return_type
(seit C++17)
|
Typ, der das Ergebnis des Einfügens eines
node_type
beschreibt, eine Spezialisierung von
template
<
class
Iter,
class
NodeType
>
|
Memberfunktionen
konstruiert den
unordered_set
(öffentliche Member-Funktion) |
|
zerstört den
unordered_set
(öffentliche Elementfunktion) |
|
|
weist dem Container Werte zu
(öffentliche Elementfunktion) |
|
|
gibt den zugeordneten Allokator zurück
(öffentliche Elementfunktion) |
|
Iteratoren |
|
|
gibt einen Iterator zum Anfang zurück
(public member function) |
|
|
gibt einen Iterator zum Ende zurück
(öffentliche Elementfunktion) |
|
Kapazität |
|
|
prüft, ob der Container leer ist
(öffentliche Elementfunktion) |
|
|
gibt die Anzahl der Elemente zurück
(öffentliche Elementfunktion) |
|
|
gibt die maximal mögliche Anzahl von Elementen zurück
(öffentliche Elementfunktion) |
|
Modifikatoren |
|
|
löscht den Inhalt
(öffentliche Elementfunktion) |
|
|
fügt Elemente ein
oder Knoten
(seit C++17)
(öffentliche Elementfunktion) |
|
|
(C++23)
|
fügt eine Reihe von Elementen ein
(öffentliche Elementfunktion) |
|
Konstruiert Element direkt vor Ort
(öffentliche Elementfunktion) |
|
|
Konstruiert Elemente direkt unter Verwendung eines Hinweises
(öffentliche Elementfunktion) |
|
|
löscht Elemente
(öffentliche Elementfunktion) |
|
|
tauscht die Inhalte aus
(öffentliche Elementfunktion) |
|
|
(C++17)
|
extrahiert Knoten aus dem Container
(öffentliche Elementfunktion) |
|
(C++17)
|
verbindet Knoten aus einem anderen Container
(öffentliche Elementfunktion) |
Lookup |
|
|
gibt die Anzahl der Elemente zurück, die einem bestimmten Schlüssel entsprechen
(öffentliche Elementfunktion) |
|
|
findet Element mit spezifischem Schlüssel
(öffentliche Elementfunktion) |
|
|
(C++20)
|
prüft, ob der Container ein Element mit spezifischem Schlüssel enthält
(öffentliche Elementfunktion) |
|
Gibt den Bereich der Elemente zurück, die einem bestimmten Schlüssel entsprechen
(öffentliche Elementfunktion) |
|
Bucket-Schnittstelle |
|
|
gibt einen Iterator zum Anfang des angegebenen Buckets zurück
(öffentliche Elementfunktion) |
|
|
gibt einen Iterator zum Ende des angegebenen Buckets zurück
(öffentliche Member-Funktion) |
|
|
gibt die Anzahl der Buckets zurück
(öffentliche Elementfunktion) |
|
|
gibt die maximale Anzahl von Buckets zurück
(öffentliche Mitgliedsfunktion) |
|
|
gibt die Anzahl der Elemente in einem bestimmten Bucket zurück
(öffentliche Elementfunktion) |
|
|
gibt den Bucket für einen bestimmten Schlüssel zurück
(öffentliche Elementfunktion) |
|
Hash-Policy |
|
|
Gibt die durchschnittliche Anzahl von Elementen pro Bucket zurück
(öffentliche Mitgliedsfunktion) |
|
|
verwaltet die maximale durchschnittliche Anzahl von Elementen pro Bucket
(öffentliche Mitgliedsfunktion) |
|
|
reserviert mindestens die angegebene Anzahl von Buckets und regeneriert die Hashtabelle
(öffentliche Elementfunktion) |
|
|
reserviert Platz für mindestens die angegebene Anzahl von Elementen und regeneriert die Hashtabelle
(öffentliche Elementfunktion) |
|
Beobachter |
|
|
Gibt die Funktion zurück, die zum Hashen der Schlüssel verwendet wird
(öffentliche Elementfunktion) |
|
|
gibt die Funktion zurück, die zum Vergleichen von Schlüsseln auf Gleichheit verwendet wird
(öffentliche Elementfunktion) |
|
Nicht-Member-Funktionen
|
(C++11)
(C++11)
(entfernt in C++20)
|
vergleicht die Werte im unordered_set
(Funktions-Template) |
|
(C++11)
|
spezialisiert den
std::swap
Algorithmus
(Funktions-Template) |
|
(C++20)
|
löscht alle Elemente, die bestimmte Kriterien erfüllen
(Funktions-Template) |
Deduktionsleitfäden |
(seit C++17) |
Hinweise
Die Member-Typen
iterator
und
const_iterator
können Aliase für denselben Typ sein. Dies bedeutet, dass das Definieren eines Paares von Funktionsüberladungen, die die beiden Typen als Parametertypen verwenden, die
One Definition Rule
verletzen kann. Da
iterator
in
const_iterator
konvertierbar ist, wird stattdessen eine einzelne Funktion mit einem
const_iterator
als Parametertyp funktionieren.
| Feature-Test Makro | Wert | Std | Funktion |
|---|---|---|---|
__cpp_lib_containers_ranges
|
202202L
|
(C++23) | Ranges-Konstruktion und -Einfügung für Container |
__cpp_lib_constexpr_unordered_set
|
202502L
|
(C++26) |
constexpr
std::unordered_set
|
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}; // erzeugt eine Menge von ints print(mySet); mySet.insert(5); // fügt ein Element 5 in die Menge ein print(mySet); if (auto iter = mySet.find(5); iter != mySet.end()) mySet.erase(iter); // entfernt das von iter gezeigte Element print(mySet); mySet.erase(7); // entfernt ein Element 7 print(mySet); }
Mögliche Ausgabe:
8 1 7 2 5 8 1 7 2 8 1 7 2 8 1 2
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 2050 | C++11 |
die Definitionen von
reference
,
const_reference
,
pointer
und
const_pointer
basierten auf
allocator_type
|
basieren auf
value_type
und
std::allocator_traits |
Siehe auch
|
(C++11)
|
Sammlung von Schlüsseln, gehasht nach Schlüsseln
(Klassen-Template) |
|
Sammlung eindeutiger Schlüssel, sortiert nach Schlüsseln
(Klassen-Template) |
|
|
(C++23)
|
passt einen Container an, um eine Sammlung eindeutiger Schlüssel zu bieten, sortiert nach Schlüsseln
(Klassen-Template) |