std::set
| Definiert in Header <set> |
||
| template< class Key, |
(1) | |
| namespace pmr { template< |
(2) | (seit C++17) |
std::set ist ein assoziativer Container, der eine sortierte Menge eindeutiger Objekte vom Typ Key enthält. Die Sortierung erfolgt mithilfe der Vergleichsfunktion Compare. Such-, Entfernungs- und Einfügeoperationen haben logarithmische Komplexität. Sets werden normalerweise als Rot-Schwarz-Bäume implementiert.
Überall dort, wo die Standardbibliothek die Compare-Anforderungen verwendet, wird die Eindeutigkeit durch die Äquivalenzrelation bestimmt. Ungenau ausgedrückt, werden zwei Objekte a und b als äquivalent betrachtet, wenn keines von beiden kleiner als das andere ist: !comp(a, b) && !comp(b, a).
std::set erfüllt die Anforderungen von Container, AllocatorAwareContainer, AssociativeContainer und ReversibleContainer.
|
Alle Memberfunktionen von |
(seit C++26) |
Inhalt |
[edit] Template-Parameter
| Dieser Abschnitt ist unvollständig Grund: Beschreibungen der Template-Parameter hinzufügen. |
[edit] Member-Typen
| Typ | Definition | ||||
key_type
|
Key | ||||
value_type
|
Key | ||||
size_type
|
Vorzeichenloser Ganzzahltyp (normalerweise std::size_t) | ||||
difference_type
|
Vorzeichenbehafteter Ganzzahltyp (normalerweise std::ptrdiff_t) | ||||
key_compare
|
Compare | ||||
value_compare
|
Compare | ||||
allocator_type
|
Allocator | ||||
Referenz
|
value_type& | ||||
const_reference
|
const value_type& | ||||
Zeiger
|
| ||||
const_pointer
|
| ||||
iterator
|
Konstanter LegacyBidirectionalIterator und ConstexprIterator(seit C++26) zu value_type | ||||
const_iterator
|
LegacyBidirectionalIterator und ConstexprIterator(seit C++26) zu const value_type | ||||
reverse_iterator
|
std::reverse_iterator<iterator> | ||||
const_reverse_iterator
|
std::reverse_iterator<const_iterator> | ||||
node_type (seit C++17) |
eine Spezialisierung von node handle, die einen Containerknoten repräsentiert | ||||
insert_return_type (seit C++17) |
Typ, der das Ergebnis des Einfügens eines node_type beschreibt, eine Spezialisierung vontemplate<class Iter, class NodeType> |
[edit] Memberfunktionen
konstruiert das set(public member function) | |
zerstört das set(public member function) | |
| weist dem Container Werte zu (public member function) | |
| gibt den zugehörigen Allocator zurück (public member function) | |
Iteratoren | |
| (C++11) |
gibt einen Iterator zum Anfang zurück (public member function) |
| (C++11) |
gibt einen Iterator zum Ende zurück (public member function) |
| (C++11) |
gibt einen Reverse-Iterator zum Anfang zurück (public member function) |
| (C++11) |
gibt einen Reverse-Iterator zum Ende zurück (public member function) |
Kapazität | |
| prüft, ob der Container 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 | |
| leert den Inhalt (public member function) | |
| fügt Elemente ein oder Knoten(seit C++17) (public member function) | |
| (C++23) |
fügt einen Bereich von Elementen ein (public member function) |
| (C++11) |
konstruiert Elemente direkt (in-place) (public member function) |
| (C++11) |
konstruiert Elemente "in place" unter Verwendung eines Hinweises (public member function) |
| entfernt Elemente (public member function) | |
| tauscht die Inhalte (public member function) | |
| (C++17) |
extrahiert Knoten aus dem Container (public member function) |
| (C++17) |
fügt Knoten aus einem anderen Container zusammen (public member function) |
Suche | |
| gibt die Anzahl der Elemente zurück, die einem bestimmten Schlüssel entsprechen (public member function) | |
| sucht ein Element mit einem bestimmten Schlüssel (public member function) | |
| (C++20) |
prüft, ob der Container ein Element mit einem bestimmten Schlüssel enthält (public member function) |
| gibt den Bereich von Elementen zurück, die einem bestimmten Schlüssel entsprechen (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) | |
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) | |
[edit] Nicht-Member-Funktionen
| (entfernt in C++20)(entfernt in C++20)(entfernt in C++20)(entfernt in C++20)(entfernt in C++20)(C++20) |
vergleicht die Werte von zwei sets lexikografisch(function template) |
| spezialisiert den Algorithmus std::swap (function template) | |
| (C++20) |
entfernt alle Elemente, die bestimmte Kriterien erfüllen (function template) |
Deduction Guides |
(seit C++17) |
[edit] 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.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_containers_ranges |
202202L |
(C++23) | Bereichskonstruktion und -einfügung für Container |
__cpp_lib_constexpr_containers |
202502L |
(C++26) | constexpr std::set |
[edit] Beispiel
#include <algorithm> #include <iomanip> #include <iostream> #include <iterator> #include <set> #include <string_view> template<typename T> std::ostream& operator<<(std::ostream& out, const std::set<T>& set) { if (set.empty()) return out << "{}"; out << "{ " << *set.begin(); std::for_each(std::next(set.begin()), set.end(), [&out](const T& element) { out << ", " << element; }); return out << " }"; } int main() { std::set<int> set{1, 5, 3}; std::cout << set << '\n'; set.insert(2); std::cout << set << '\n'; set.erase(1); std::cout << set << "\n\n"; std::set<int> keys{3, 4}; for (int key : keys) { if (set.contains(key)) std::cout << set << " does contain " << key << '\n'; else std::cout << set << " doesn't contain " << key << '\n'; } std::cout << '\n'; std::string_view word = "element"; std::set<char> characters(word.begin(), word.end()); std::cout << "There are " << characters.size() << " unique characters in " << std::quoted(word) << ":\n" << characters << '\n'; }
Ausgabe
{ 1, 3, 5 }
{ 1, 2, 3, 5 }
{ 2, 3, 5 }
{ 2, 3, 5 } does contain 3
{ 2, 3, 5 } doesn't contain 4
There are 5 unique characters in "element":
{ e, l, m, n, t }[edit] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 103 | C++98 | iterator erlaubt Modifikation von Schlüsseln | iterator wurde konstant gemacht |
| LWG 230 | C++98 | Key musste nicht CopyConstructible sein(ein Schlüssel vom Typ Key konnte möglicherweise nicht konstruiert werden) |
Key musste außerdemCopyConstructible sein |
[edit] Siehe auch
| Sammlung von Schlüsseln, sortiert nach Schlüsseln (Klassenvorlage) | |
| (C++11) |
Sammlung eindeutiger Schlüssel, gehasht nach Schlüsseln (Klassenvorlage) |
| (C++23) |
passt einen Container an, um eine Sammlung eindeutiger Schlüssel, sortiert nach Schlüsseln, bereitzustellen (Klassenvorlage) |