Namespaces
Variants

std:: flat_set

From cppreference.net
Definiert im Header <flat_set>
template <

class Key,
class Compare = std:: less < Key > ,
class KeyContainer = std:: vector < Key >

> class flat_set ;
(seit C++23)

Das flache Set ist ein Container-Adaptor , der die Funktionalität eines assoziativen Containers bereitstellt, der eine sortierte Menge eindeutiger Objekte vom Typ Key speichert. Die Sortierung erfolgt mithilfe der Schlüsselvergleichsfunktion Compare .

Die Klassenvorlage flat_set fungiert als Wrapper für den zugrunde liegenden sortierten Container, der als Objekt vom Typ KeyContainer übergeben wird.

Überall dort, wo die Standardbibliothek die Compare -Anforderungen verwendet, wird Eindeutigkeit durch die Verwendung der Äquivalenzrelation bestimmt. Informell gesagt werden zwei Objekte a und b als äquivalent betrachtet, wenn keines kleiner als das andere verglichen wird: ! comp ( a, b ) && ! comp ( b, a ) .

std::flat_set erfüllt die Anforderungen von Container , ReversibleContainer , optionalen Container-Anforderungen und alle Anforderungen von AssociativeContainer (einschließlich logarithmischer Suchkomplexität), außer dass:

  • Anforderungen bezüglich Knoten sind nicht anwendbar,
  • Iterator-Invalidierungsanforderungen unterscheiden sich,
  • die Komplexität von Einfüge- und Löschoperationen ist linear.

Ein flacher Satz unterstützt die meisten AssociativeContainer -Operationen, die eindeutige Schlüssel verwenden.

Alle Memberfunktionen von std::flat_set sind constexpr : Es ist möglich, std::flat_set -Objekte in der Auswertung eines konstanten Ausdrucks zu erstellen und zu verwenden.

Allerdings können std::flat_set -Objekte im Allgemeinen nicht constexpr sein, da jeder dynamisch allokierte Speicher in derselben Auswertung des konstanten Ausdrucks freigegeben werden muss.

(since C++26)

Inhaltsverzeichnis

Iterator-Invalidierung

Template-Parameter

Key - Der Typ der gespeicherten Elemente. Das Programm ist fehlerhaft, wenn Key nicht derselbe Typ wie KeyContainer::value_type ist.
Compare - Ein Compare -Typ, der eine strenge schwache Ordnung bereitstellt.
KeyContainer - Der Typ des zugrundeliegenden SequenceContainer zur Speicherung der Elemente. Die Iteratoren eines solchen Containers sollten LegacyRandomAccessIterator erfüllen oder random_access_iterator modellieren.

Die Standardcontainer std::vector und std::deque erfüllen diese Anforderungen.

Mitgliedertypen

Typ Definition
container_type Key Container
key_type Key
value_type Key
key_compare Compare
value_compare Compare
reference value_type &
const_reference const value_type &
size_type typename KeyContainer :: size_type
difference_type typename KeyContainer :: difference_type
iterator implementierungsdefiniert LegacyRandomAccessIterator , ConstexprIterator (seit C++26) und random_access_iterator zu value_type
const_iterator implementierungsdefiniert LegacyRandomAccessIterator , ConstexprIterator (seit C++26) und random_access_iterator zu const value_type
reverse_iterator std:: reverse_iterator < iterator >
const_reverse_iterator std:: reverse_iterator < const_iterator >

Member-Objekte

Member Beschreibung
container_type c (private) der adaptierte Container
( exposition-only member object* )
key_compare compare (private) das Vergleichsfunktionsobjekt
( exposition-only member object* )

Memberfunktionen

konstruiert den flat_set
(öffentliche Elementfunktion)
(destructor)
(implicitly declared)
zerstört jedes Element des Container-Adapters
(public member function)
weist dem Container-Adapter Werte zu
(öffentliche Elementfunktion)
Iteratoren
gibt einen Iterator zum Anfang zurück
(öffentliche Elementfunktion)
gibt einen Iterator zum Ende zurück
(öffentliche Elementfunktion)
gibt einen umgekehrten Iterator zum Anfang zurück
(öffentliche Elementfunktion)
gibt einen umgekehrten Iterator zum Ende zurück
(öffentliche Elementfunktion)
Kapazität
prüft, ob der Container-Adapter 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
Konstruiert Element direkt vor Ort
(öffentliche Elementfunktion)
Konstruiert Elemente direkt unter Verwendung eines Hinweises
(öffentliche Elementfunktion)
fügt Elemente ein
(öffentliche Elementfunktion)
fügt eine Reihe von Elementen ein
(öffentliche Elementfunktion)
extrahiert den zugrunde liegenden Container
(öffentliche Elementfunktion)
ersetzt den zugrunde liegenden Container
(öffentliche Elementfunktion)
löscht Elemente
(öffentliche Elementfunktion)
tauscht die Inhalte aus
(öffentliche Elementfunktion)
löscht den Inhalt
(öffentliche Elementfunktion)
Lookup
findet Element mit spezifischem Schlüssel
(öffentliche Elementfunktion)
gibt die Anzahl der Elemente zurück, die einem bestimmten Schlüssel entsprechen
(öffentliche Elementfunktion)
prüft, ob der Container ein Element mit einem bestimmten Schlüssel enthält
(öffentliche Elementfunktion)
gibt einen Iterator zum ersten Element zurück, das nicht kleiner als der gegebene Schlüssel ist
(öffentliche Elementfunktion)
gibt einen Iterator zum ersten Element zurück, größer als der angegebene Schlüssel
(öffentliche Elementfunktion)
gibt den Bereich der Elemente zurück, die einem bestimmten Schlüssel entsprechen
(öffentliche Elementfunktion)
Beobachter
gibt die Funktion zurück, die Schlüssel vergleicht
(public member function)
gibt die Funktion zurück, die Schlüssel in Objekten vom Typ value_type vergleicht
(öffentliche Elementfunktion)

Nicht-Member-Funktionen

vergleicht lexikographisch die Werte zweier flat_set s
(Funktions-Template)
spezialisiert den std::swap Algorithmus
(Funktions-Template)
löscht alle Elemente, die bestimmte Kriterien erfüllen
(Funktions-Template)

Hilfsklassen

spezialisiert das std::uses_allocator Typ-Trait
(Klassen-Template-Spezialisierung)

Tags

zeigt an, dass Elemente eines Bereichs sortiert und eindeutig sind
(Tag)

Ableitungsleitfäden

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.

Einige Vorteile von Flat Set gegenüber anderen standardmäßigen Container-Adaptoren sind:

  • Möglicherweise schnellere Suche (obwohl Suchoperationen logarithmische Komplexität haben).
  • Deutlich schnellere Iteration: random access iterators statt bidirectional iterators .
  • Geringerer Speicherverbrauch für kleine Objekte (und für große Objekte falls KeyContainer :: shrink_to_fit ( ) verfügbar ist).
  • Bessere Cache-Performance (abhängig von KeyContainer , Schlüssel werden in zusammenhängenden Speicherblöcken gespeichert).

Einige Nachteile von flat set sind:

  • Nicht-stabile Iteratoren (Iteratoren werden beim Einfügen und Löschen von Elementen ungültig).
  • Nicht kopierbare und nicht verschiebbare Typwerte können nicht gespeichert werden.
  • Schwächere Ausnahmesicherheit (Kopier-/Verschiebekonstruktoren können beim Verschieben von Werten bei Löschungen und Einfügungen Ausnahmen werfen).
  • Langsamere (d.h. lineare) Einfügung und Löschung, insbesondere für nicht verschiebbare Typen.
Feature-Test Makro Wert Std Feature
__cpp_lib_flat_set 202207L (C++23) std::flat_set und std::flat_multiset
__cpp_lib_constexpr_flat_set 202502L (C++26) constexpr std::flat_set

Beispiel

Siehe auch

Passt einen Container an, um eine Sammlung von Schlüsseln zu bieten, sortiert nach Schlüsseln
(Klassentemplate)
Sammlung eindeutiger Schlüssel, sortiert nach Schlüsseln
(Klassentemplate)
Sammlung eindeutiger Schlüssel, gehasht nach Schlüsseln
(Klassentemplate)