Die Containers-Bibliothek ist eine generische Sammlung von Klassenvorlagen und Algorithmen, die es Programmierern ermöglicht, gängige Datenstrukturen wie Queues, Listen und Stacks einfach zu implementieren. Es gibt zwei(bis C++11)drei(seit C++11) Arten von Containern: Sequenzcontainer, assoziative Container und ungeordnete assoziative Container, von denen jeder für eine andere Menge von Operationen ausgelegt ist.
- Sequenzcontainer,
- assoziative Container,
- ungeordnete assoziative Container,
|
(seit C++11) |
von denen jeder für eine andere Menge von Operationen ausgelegt ist.
Der Container verwaltet den für seine Elemente zugewiesenen Speicherplatz und stellt Mitgliedsfunktionen zum Zugriff darauf bereit, entweder direkt oder über Iteratoren (Objekte mit Zeiger-ähnlichen Eigenschaften).
Die meisten Container haben mindestens mehrere gemeinsame Mitgliedsfunktionen und teilen sich Funktionalitäten. Welcher Container für die jeweilige Anwendung am besten geeignet ist, hängt nicht nur von der angebotenen Funktionalität ab, sondern auch von seiner Effizienz bei verschiedenen Arbeitslasten.
[edit] Sequenzcontainer
Sequenzcontainer implementieren Datenstrukturen, auf die sequenziell zugegriffen werden kann.
|
|
fest dimensioniertes, inplace, zusammenhängendes Array (Klassenvorlage) [edit] |
|
|
reservierbares, zusammenhängendes Array (Klassenvorlage) [edit] |
|
|
reservierbares, festes Kapazitäts-Array, Inplace, zusammenhängend (Klassenvorlage) [edit] |
|
|
Sammlung, die den Speicher von gelöschten Elementen wiederverwendet (Klassenvorlage) [edit] |
|
|
Doppelt-endende Warteschlange (Klassenvorlage) [edit] |
|
|
Einfach verkettete Liste (Klassenvorlage) [edit] |
|
|
Doppelt verkettete Liste (Klassenvorlage) [edit] |
[edit] Assoziative Container
Assoziative Container implementieren sortierte Datenstrukturen, die schnell durchsucht werden können (Komplexität O(log n)).
|
|
Sammlung eindeutiger Schlüssel, sortiert nach Schlüsseln (Klassenvorlage) [edit] |
|
|
Sammlung von Schlüssel-Wert-Paaren, sortiert nach Schlüsseln, Schlüssel sind eindeutig (Klassenvorlage) [edit] |
|
|
Sammlung von Schlüsseln, sortiert nach Schlüsseln (Klassenvorlage) [edit] |
|
|
Sammlung von Schlüssel-Wert-Paaren, sortiert nach Schlüsseln (Klassenvorlage) [edit] |
[edit] Ungeordnete assoziative Container (seit C++11)
Ungeordnete assoziative Container implementieren unsortierte (gehashte) Datenstrukturen, die schnell durchsucht werden können (durchschnittlich O(1), Worst-Case O(n) Komplexität).
|
|
Sammlung eindeutiger Schlüssel, gehasht nach Schlüsseln (Klassenvorlage) [edit] |
|
|
Sammlung von Schlüssel-Wert-Paaren, gehasht nach Schlüsseln, Schlüssel sind eindeutig (Klassenvorlage) [edit] |
|
|
Sammlung von Schlüsseln, gehasht nach Schlüsseln (Klassenvorlage) [edit] |
|
|
Sammlung von Schlüssel-Wert-Paaren, gehasht nach Schlüsseln (Klassenvorlage) [edit] |
[edit] Container-Adapter
Container-Adapter bieten eine andere Schnittstelle für Sequenzcontainer.
|
|
passt einen Container an, um einen Stack (LIFO-Datenstruktur) bereitzustellen (Klassenvorlage) [edit] |
|
|
passt einen Container an, um eine Queue (FIFO-Datenstruktur) bereitzustellen (Klassenvorlage) [edit] |
|
|
passt einen Container an, um eine Prioritätswarteschlange bereitzustellen (Klassenvorlage) [edit] |
|
|
passt einen Container an, um eine Sammlung eindeutiger Schlüssel, sortiert nach Schlüsseln, bereitzustellen (Klassenvorlage) [edit] |
|
|
passt zwei Container an, um eine Sammlung von Schlüssel-Wert-Paaren, sortiert nach eindeutigen Schlüsseln, bereitzustellen (Klassenvorlage) [edit] |
|
|
passt einen Container an, um eine Sammlung von Schlüsseln, sortiert nach Schlüsseln, bereitzustellen (Klassenvorlage) [edit] |
|
|
passt zwei Container an, um eine Sammlung von Schlüssel-Wert-Paaren, sortiert nach Schlüsseln, bereitzustellen (Klassenvorlage) [edit] |
[edit] Views (seit C++20)
Views bieten flexible Einrichtungen zur Interaktion mit ein- oder mehrdimensionalen Views über ein nicht-besitzendes Array von Elementen.
|
|
eine nicht besitzende Ansicht über eine zusammenhängende Sequenz von Objekten (class template) [bearbeiten] |
|
|
eine mehrdimensionale, nicht-besitzende Array-View (Klassenvorlage) [edit] |
[edit] Iterator-Invalidierung
Nur-Lese-Methoden invalidieren niemals Iteratoren oder Referenzen. Methoden, die den Inhalt eines Containers ändern, können Iteratoren und/oder Referenzen ungültig machen, wie in dieser Tabelle zusammengefasst.
| Kategorie |
Container |
Nach Einfügung, sind... |
Nach Löschung, sind... |
Bedingt |
| Iteratoren gültig? |
Referenzen gültig? |
Iteratoren gültig? |
Referenzen gültig? |
| Sequenzcontainer |
array
|
N/A
|
N/A
|
|
| vector
|
Nein |
N/A
|
Einfügung hat Kapazität geändert |
| Ja |
Ja |
Vor dem/den modifizierten Element(en) (bei Einfügung nur, wenn Kapazität sich nicht geändert hat) |
| Nein |
Nein |
Bei oder nach dem/den modifizierten Element(en) |
| deque
|
Nein |
Ja |
Ja, außer gelöschte(n) Element(e) |
Erstes oder letztes Element modifiziert |
| Nein |
Nein |
Nur mittleres Element modifiziert |
| list
|
Ja |
Ja, außer gelöschte(n) Element(e) |
|
| forward_list
|
Ja |
Ja, außer gelöschte(n) Element(e) |
|
| Assoziative Container |
setzt multiset map multimap
|
Ja |
Ja, außer gelöschte(n) Element(e) |
|
| Ungeordnete assoziative Container |
unordered_set unordered_multiset unordered_map unordered_multimap
|
Nein |
Ja |
N/A
|
Einfügung hat Rehash verursacht |
| Ja |
Ja, außer gelöschte(n) Element(e) |
Kein Rehash |
Hier bezieht sich Einfügung auf jede Methode, die ein oder mehrere Elemente zum Container hinzufügt, und Löschung bezieht sich auf jede Methode, die ein oder mehrere Elemente aus dem Container entfernt.
Sofern nicht anders angegeben (entweder explizit oder durch Definition einer Funktion in Bezug auf andere Funktionen), macht das Übergeben eines Containers als Argument an eine Bibliotheksfunktion niemals Iteratoren zu oder ändert die Werte von Objekten innerhalb dieses Containers.
Der Past-the-End-Iterator verdient besondere Erwähnung. Im Allgemeinen wird dieser Iterator so behandelt, als ob er ein normaler Iterator zu einem nicht gelöschten Element wäre. Daher wird std::set::end niemals ungültig gemacht, std::unordered_set::end wird nur bei Rehash ungültig gemacht(seit C++11), std::vector::end wird immer ungültig gemacht (da er sich immer hinter den modifizierten Elementen befindet) und so weiter.
Es gibt eine Ausnahme: eine Löschung, die das letzte Element eines std::deque löscht, macht den Past-the-End-Iterator *doch* ungültig, auch wenn es sich nicht um ein gelöschtes Element des Containers handelt (oder überhaupt um ein Element). Kombiniert mit den allgemeinen Regeln für std::deque-Iteratoren, ist das Nettoergebnis, dass die einzige modifizierende Operation, die std::deque::end *nicht* ungültig macht, eine Löschung ist, die das erste Element, aber nicht das letzte löscht.
Thread-Sicherheit
- Alle Containerfunktionen können von verschiedenen Threads auf verschiedenen Containern gleichzeitig aufgerufen werden. Allgemeiner gesagt, lesen die C++-Standardbibliotheksfunktionen keine Objekte, auf die von anderen Threads zugegriffen werden kann, es sei denn, diese Objekte sind direkt oder indirekt über die Funktionsargumente, einschließlich des this-Zeigers, zugänglich.
- Alle const-Mitgliedsfunktionen können von verschiedenen Threads auf demselben Container gleichzeitig aufgerufen werden. Zusätzlich verhalten sich die Mitgliedsfunktionen
begin(), end(), rbegin(), rend(), front(), back(), data(), find(), lower_bound(), upper_bound(), equal_range(), at() und (außer in assoziativen Containern) operator[] für die Thread-Sicherheit wie const (d. h., sie können auch von verschiedenen Threads auf demselben Container gleichzeitig aufgerufen werden). Allgemeiner gesagt, ändern die C++-Standardbibliotheksfunktionen keine Objekte, es sei denn, diese Objekte sind direkt oder indirekt über die Nicht-const-Argumente der Funktion, einschließlich des this-Zeigers, zugänglich. - Verschiedene Elemente im selben Container können von verschiedenen Threads gleichzeitig modifiziert werden, mit Ausnahme der Elemente von std::vector<bool> (z. B. kann ein Vektor von std::future-Objekten Werte von mehreren Threads empfangen).
- Iterator-Operationen (z. B. das Inkrementieren eines Iterators) lesen, aber modifizieren nicht den zugrunde liegenden Container und können gleichzeitig mit Operationen auf anderen Iteratoren desselben Containers, mit den const-Mitgliedsfunktionen oder mit Lesevorgängen auf den Elementen ausgeführt werden. Containeroperationen, die Iteratoren ungültig machen, modifizieren den Container und können nicht gleichzeitig mit Operationen auf vorhandenen Iteratoren ausgeführt werden, selbst wenn diese Iteratoren nicht ungültig sind.
- Elemente desselben Containers können gleichzeitig mit den Mitgliedsfunktionen modifiziert werden, die nicht angegeben sind, diese Elemente zu verarbeiten. Allgemeiner gesagt, lesen die C++-Standardbibliotheksfunktionen keine Objekte, die indirekt über ihre Argumente zugänglich sind (einschließlich anderer Elemente eines Containers), es sei denn, dies ist durch ihre Spezifikation erforderlich.
- In jedem Fall können Containeroperationen (sowie Algorithmen oder andere C++-Standardbibliotheksfunktionen) intern parallelisiert werden, solange dies die für den Benutzer sichtbaren Ergebnisse nicht ändert (z. B. kann std::transform parallelisiert werden, aber nicht std::for_each, das spezifiziert ist, jedes Element einer Sequenz in Ordnung zu besuchen).
|
(seit C++11) |
[edit] Funktionstabelle
Hinweis: std::basic_string wird vom Standard nicht als Container behandelt, verhält sich aber aufgrund seiner Ähnlichkeit stark wie einer. Er ist hier der Bequemlichkeit halber als 'Pseudo-Container' aufgeführt.
|
|
- Funktionen, die in C++03 vorhanden sind |
|
|
- Funktionen, die seit C++11 vorhanden sind |
|
|
- Funktionen, die seit C++17 vorhanden sind |
|
|
- Funktionen, die seit C++20 vorhanden sind |
|
|
- Funktionen, die seit C++23 vorhanden sind |
[edit] Mitgliedsfunktionstabelle
- Hinweis: Funktionen in zwei verschiedenen extract-Zeilen haben unterschiedliche Bedeutungen und Syntax
- ↑ z. B. node_type extract(const_iterator) oder node_type extract(Key&)
- ↑ z. B. container_type extract() &&
[edit] Nicht-Mitgliedsfunktionstabelle
|
Die Operatoren <, <=, >, >= und != sind synthetisiert aus operator<=> und operator== beziehungsweise.
|
(seit C++20) |
[edit] Defect reports
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 51
|
C++98 |
Container-Iteratoren könnten ungültig gemacht werden durch beliebige Bibliotheksoperationen |
sie werden nur ungültig gemacht wenn angegeben |
[edit] Siehe auch
C++ benannte Anforderungen
|
|
numerische Arrays, Array-Masken und Array-Slices (Klassenvorlage) [edit] |
|
|
speichert und manipuliert Zeichenfolgen (Klassenvorlage) [edit] |
|
|
schreibgeschützte String-Ansicht (class template) [bearbeiten] |