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.
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
std::unordered_set
-Objekte im Allgemeinen nicht
constexpr
sein, da jeder dynamisch allokierte Speicher in derselben Auswertung des konstanten Ausdrucks freigegeben werden muss.
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.
ein Iteratortyp, dessen Kategorie, Wert, Differenz, Zeiger und Referenztypen identisch sind mit iterator. 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 identisch sind mit const_iterator. 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 darstellt
insert_return_type(seit C++17)
Typ, der das Ergebnis des Einfügens eines node_type, eine Spezialisierung von
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.
#include <iostream>#include <unordered_set>void print(constauto& set){for(constauto& 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.