std::unordered_multiset
ist ein assoziativer Container, der eine Menge möglicherweise nicht 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 Wertes ab. Dies ermöglicht schnellen Zugriff auf einzelne Elemente, da sobald der Hash berechnet ist, dieser auf den exakten Bucket verweist, in dem das Element platziert ist.
Die Iterationsreihenfolge dieses Containers muss nicht stabil sein (daher kann beispielsweise
std::equal
nicht verwendet werden, um zwei
std::unordered_multiset
s zu vergleichen), außer dass jede Gruppe von Elementen, deren Schlüssel als
äquivalent
verglichen werden (Vergleich auf Gleichheit mit
key_eq()
als Komparator), einen zusammenhängenden Teilbereich in der Iterationsreihenfolge bildet, der auch mit
equal_range()
zugänglich ist.
Alle Memberfunktionen von
std::unordered_multiset
sind
constexpr
: Es ist möglich,
std::unordered_multiset
-Objekte in der Auswertung eines konstanten Ausdrucks zu erstellen und zu verwenden.
Allerdings können
std::unordered_multiset
-Objekte im Allgemeinen nicht
constexpr
sein, da jeder dynamisch allokierte Speicher in derselben Auswertung des konstanten Ausdrucks freigegeben werden muss.
einem Iteratortyp, dessen Kategorie, Wert, Differenz, Zeiger- und Referenztypen identisch mit iterator sind. Dieser Iterator kann verwendet werden, um durch einen einzelnen Bucket, aber nicht über Buckets hinweg zu iterieren
const_local_iterator
ein Iteratortyp, dessen Kategorie, Wert, Differenz, Zeiger- und Referenztypen identisch mit const_iterator sind. Dieser Iterator kann verwendet werden, um durch einen einzelnen Bucket, aber nicht über Buckets hinweg zu iterieren
node_type(seit C++17)
eine Spezialisierung von node handle die einen Container-Knoten repräsentiert
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.