std::flat_set
| Definiert in Header <flat_set> |
||
| template< class Key, |
(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 |
(seit C++26) |
Inhalt |
[bearbeiten] Iterator-Invalidierung
| Dieser Abschnitt ist unvollständig |
[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 |
key_type
|
Key |
value_type
|
Key |
key_compare
|
Compare |
value_compare
|
Compare |
Referenz
|
value_type& |
const_reference
|
const value_type& |
size_type
|
typename KeyContainer::size_type |
difference_type
|
typename KeyContainer::difference_type |
iterator
|
implementierungsabhängiger LegacyRandomAccessIterator, ConstexprIterator(seit C++26) und random_access_iterator zu value_type |
const_iterator
|
Implementierungsdefinierter 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> |
[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) | |
| (Destruktor) (implizit deklariert) |
zerstört jedes Element des Container-Adapters (öffentliche Memberfunktion) |
| weist Werte dem Container-Adapter zu (public member function) | |
Iteratoren | |
| gibt einen Iterator zum Anfang zurück (public member function) | |
| gibt einen Iterator zum Ende zurück (public member function) | |
| gibt einen Reverse-Iterator zum Anfang zurück (public member function) | |
| gibt einen Reverse-Iterator zum Ende zurück (public member function) | |
Kapazität | |
| prüft, ob der Container-Adapter leer ist (public member function) | |
| Gibt die Anzahl der Elemente zurück (public member function) | |
| Gibt die maximal mögliche Anzahl von Elementen zurück (public member function) | |
Modifizierer | |
| konstruiert Elemente direkt (in-place) (public member function) | |
| konstruiert Elemente "in place" unter Verwendung eines Hinweises (public member function) | |
| fügt Elemente ein (public member function) | |
| fügt einen Bereich von Elementen ein (public member function) | |
| extrahiert den zugrunde liegenden Container (public member function) | |
| ersetzt den zugrunde liegenden Container (public member function) | |
| entfernt Elemente (public member function) | |
| tauscht die Inhalte (public member function) | |
| leert den Inhalt (public member function) | |
Suche | |
| sucht ein Element mit einem bestimmten Schlüssel (public member function) | |
| gibt die Anzahl der Elemente zurück, die einem bestimmten Schlüssel entsprechen (public member function) | |
| prüft, ob der Container ein Element mit einem bestimmten Schlüssel enthält (public member function) | |
| gibt einen Iterator zum ersten Element zurück, das *nicht kleiner* als der gegebene Schlüssel ist (public member function) | |
| gibt einen Iterator zum ersten Element zurück, das *größer* als der gegebene Schlüssel ist (public member function) | |
| gibt den Bereich von Elementen zurück, die einem bestimmten Schlüssel entsprechen (public member function) | |
Observer | |
| 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(public member function) | |
[bearbeiten] Nicht-Member-Funktionen
| (C++23) |
vergleicht die Werte von zwei flat_sets lexikographisch(function template) |
| (C++23) |
spezialisiert den Algorithmus std::swap (function template) |
| (C++23) |
entfernt alle Elemente, die bestimmte Kriterien erfüllen (function template) |
[bearbeiten] Hilfsklassen
| spezialisiert das std::uses_allocator Typ-Trait (Klassenvorlagenspezialisierung) |
[bearbeiten] Tags
| (C++23) |
zeigt an, dass Elemente eines Bereichs sortiert und eindeutig sind (Tag) |
[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
KeyContainerwerden 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
| Dieser Abschnitt ist unvollständig Grund: kein Beispiel |
[bearbeiten] Siehe auch
| (C++23) |
passt einen Container an, um eine Sammlung von Schlüsseln, sortiert nach Schlüsseln, bereitzustellen (Klassenvorlage) |
| Sammlung eindeutiger Schlüssel, sortiert nach Schlüsseln (Klassenvorlage) | |
| (C++11) |
Sammlung eindeutiger Schlüssel, gehasht nach Schlüsseln (Klassenvorlage) |