Namensräume
Varianten
Aktionen

std::flat_set

Von cppreference.com
< cpp‎ | container
 
 
 
 
Definiert in Header <flat_set>
template<

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

> class flat_set;
(seit C++23)

Das flat_set ist ein Container-Adapter, der die Funktionalität eines assoziativen Containers bietet, der eine sortierte Menge von eindeutigen Objekten vom Typ Key speichert. Die Sortierung erfolgt mithilfe der Vergleichsfunktion 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 die Eindeutigkeit mithilfe der Äquivalenzrelation bestimmt. Informell gesagt, werden zwei Objekte a und b als äquivalent betrachtet, wenn keines kleiner als das andere ist: !comp(a, b) && !comp(b, a).

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

  • Anforderungen im Zusammenhang mit Knoten nicht zutreffen,
  • die Anforderungen an die Iterator-Invalidierung unterschiedlich sind,
  • die Komplexität von Einfüge- und Löschvorgängen linear ist.

Ein flat set unterstützt die meisten Operationen von AssociativeContainer, die eindeutige Schlüssel verwenden.

Alle Member-Funktionen 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.

std::flat_set-Objekte können jedoch im Allgemeinen nicht constexpr sein, da jeder dynamisch zugewiesene Speicher im selben konstanten Ausdruck freigegeben werden muss.

(seit C++26)

Inhalt

[bearbeiten] Iterator-Invalidierung

[bearbeiten] Template-Parameter

Key - Der Typ der gespeicherten Elemente. Das Programm ist ill-formed, wenn Key nicht denselben Typ hat wie KeyContainer::value_type.
Compare - Ein Compare-Typ, der eine strikte schwache Ordnung bereitstellt.
KeyContainer - Der Typ des zugrunde liegenden SequenceContainer zum Speichern 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.

[bearbeiten] Member-Typen

Typ Definition
container_type KeyContainer[bearbeiten]
key_type Key[edit]
value_type Key[edit]
key_compare Compare[edit]
value_compare Compare[edit]
Referenz value_type&[edit]
const_reference const value_type&[edit]
size_type typename KeyContainer::size_type[bearbeiten]
difference_type typename KeyContainer::difference_type[bearbeiten]
iterator implementierungsabhängiger LegacyRandomAccessIterator, ConstexprIterator(seit C++26) und random_access_iterator zu value_type[bearbeiten]
const_iterator Implementierungsdefinierter LegacyRandomAccessIterator, ConstexprIterator(seit C++26) und random_access_iterator zu const value_type[edit]
reverse_iterator std::reverse_iterator<iterator>[edit]
const_reverse_iterator std::reverse_iterator<const_iterator>[edit]

[bearbeiten] Member-Objekte

Mitglied Beschreibung
container_type c (privat) der angepasste Container
((exposition-only member object*)
key_compare compare (privat) das Vergleichsfunktions-Objekt
((exposition-only member object*)

[bearbeiten] Member-Funktionen

konstruiert das flat_set
(public member function) [edit]
(Destruktor)
(implizit deklariert)
zerstört jedes Element des Container-Adapters
(öffentliche Memberfunktion)
weist Werte dem Container-Adapter zu
(public member function) [edit]
Iteratoren
gibt einen Iterator zum Anfang zurück
(public member function) [edit]
gibt einen Iterator zum Ende zurück
(public member function) [edit]
gibt einen Reverse-Iterator zum Anfang zurück
(public member function) [edit]
gibt einen Reverse-Iterator zum Ende zurück
(public member function) [edit]
Kapazität
prüft, ob der Container-Adapter leer ist
(public member function) [edit]
Gibt die Anzahl der Elemente zurück
(public member function) [edit]
Gibt die maximal mögliche Anzahl von Elementen zurück
(public member function) [edit]
Modifizierer
konstruiert Elemente direkt (in-place)
(public member function) [edit]
konstruiert Elemente "in place" unter Verwendung eines Hinweises
(public member function) [edit]
fügt Elemente ein
(public member function) [edit]
fügt einen Bereich von Elementen ein
(public member function) [edit]
extrahiert den zugrunde liegenden Container
(public member function) [edit]
ersetzt den zugrunde liegenden Container
(public member function) [bearbeiten]
entfernt Elemente
(public member function) [edit]
tauscht die Inhalte
(public member function) [edit]
leert den Inhalt
(public member function) [edit]
Suche
sucht ein Element mit einem bestimmten Schlüssel
(public member function) [edit]
gibt die Anzahl der Elemente zurück, die einem bestimmten Schlüssel entsprechen
(public member function) [edit]
prüft, ob der Container ein Element mit einem bestimmten Schlüssel enthält
(public member function) [edit]
gibt einen Iterator zum ersten Element zurück, das *nicht kleiner* als der gegebene Schlüssel ist
(public member function) [edit]
gibt einen Iterator zum ersten Element zurück, das *größer* als der gegebene Schlüssel ist
(public member function) [edit]
gibt den Bereich von Elementen zurück, die einem bestimmten Schlüssel entsprechen
(public member function) [edit]
Observer
gibt die Funktion zurück, die Schlüssel vergleicht
(public member function) [edit]
gibt die Funktion zurück, die Schlüssel in Objekten vom Typ value_type vergleicht
(public member function) [edit]

[bearbeiten] Nicht-Member-Funktionen

vergleicht die Werte von zwei flat_sets lexikographisch
(function template) [edit]
spezialisiert den Algorithmus std::swap
(function template) [edit]
entfernt alle Elemente, die bestimmte Kriterien erfüllen
(function template) [edit]

[bearbeiten] Hilfsklassen

spezialisiert das std::uses_allocator Typ-Trait
(Klassenvorlagenspezialisierung) [edit]

[bearbeiten] Tags

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

[bearbeiten] Deduktionshilfen

[bearbeiten] Hinweise

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.

Einige Vorteile von flat_set gegenüber anderen Standard-Container-Adaptern sind:

  • Potenziell schnellere Suche (obwohl Suchoperationen logarithmische Komplexität haben).
  • Viel schnellere Iteration: Random-Access-Iteratoren anstelle von Bidirektionalen Iteratoren.
  • Weniger Speicherverbrauch für kleine Objekte (und für große Objekte, wenn KeyContainer::shrink_to_fit() verfügbar ist).
  • Bessere Cache-Leistung (abhängig von KeyContainer werden Schlüssel in einem oder mehreren 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).
  • Typwerte, die nicht kopierbar und nicht verschiebbar sind, können nicht gespeichert werden.
  • Schwächere Exception-Sicherheit (Kopier-/Verschiebekonstruktoren können beim Verschieben von Werten beim Löschen und Einfügen auslösen).
  • Langsamere (d.h. lineare) Einfüge- und Löschvorgänge, 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_containers 202502L (C++26) constexpr std::flat_set

[bearbeiten] Beispiel

[bearbeiten] Siehe auch

passt einen Container an, um eine Sammlung von Schlüsseln, sortiert nach Schlüsseln, bereitzustellen
(Klassenvorlage) [edit]
Sammlung eindeutiger Schlüssel, sortiert nach Schlüsseln
(Klassenvorlage) [edit]
Sammlung eindeutiger Schlüssel, gehasht nach Schlüsseln
(Klassenvorlage) [edit]