Container
Container werden verwendet, um mehrere Elemente eines beliebigen
Datentyps in einem Objekt zusammenzufassen, ähnlich einem Feld von
Werten. Alle Werte in einem Container sind dabei vom selben Typ.
Dabei werden beim Einfügen generell Kopien der einzufügenden
Objekte angelegt, sodaß die einzufügenden Objekte nicht dieselbe
Lebensdauer haben müssen wie der Container.
Wenn man für einen Container im konkreten Einzelfall einen
Referenzsemantik benötigt, dann kann man das auch erreichen;
siehe [Josuttis: Stdbib.] 5.10.
Alle in einem der Container verwendeten Klassen müssen folgende
Mindestanforderungen erfüllen:
- Es muß ein korrekter copy-Konstruktor existieren (und am besten
effizient implementiert sein).
- die Objekte müssen mit einer Zuweisung kopierbar sein.
- Für einige Container ist ein parameterloser Konstruktor nötig
(Defaultkonstruktor oder ein selbst definierter).
- Es muß natürlich ein Destruktor aufrufbar sein (also public).
- Einige Container benötigen einen Vergleich auf Gleichheit
(
operator==()
), die assoziativen Container benötigen zusätzlich
den operator<()
.
- Die hier erwähnten und damit von der STL verwendeten Funktionen
sollten keine Ausnahmen werfen, da die STL diese nicht fängt und damit
der innere Zustand der Containerklassen inkonsistent wird.
- Zeiger als Containerelemente sind in aller Regel ungeeignet,
weil die internen Vergleiche auf gleich oder gegebenenfalls
kleiner die Zeiger (also Adressen) vergleichen, und nicht die
darauf verwiesenen Werte.
Es gibt folgende vollwertigen Container:
- vector stellt ein eindimensionales Feld dar mit einem
schnellen Zugriff auf einzelne Elemente über ihre Position (Index)
- queue ist eine Art Warteschlange: an einem Ende wird
angefügt (wenn sich neue Kunden am Schalter anstellen wollen, und sich
schön brav am Ende anstellen), am anderen
Ende werden Elemente entnommen (wenn jeweils ein Kunde am Anfang der
Schlange fertig ist); also ein FIFO (first in, first out)
- priority_queue sammelt Elemente ähnlich einer
queue, aber die Entnahme erfolgt anhand der Priorität, die
jedem Element zugeordnet wird (also eine bakschischgesteuerte
Warteschlange)
- deque ist eine double ended queue, also eine
Warteschlange, an deren beiden Enden Elemente angefügt oder entfernt
werden können
- list ist eine (doppelt) verkettete Liste; an jeder Stelle
kann angefügt oder entnommen werden
- stack
ermöglicht das Ablegen von Werten auf einem Stapel, und Entnehmen in
der umgekehrten Reihenfolge (LIFO, last in, first out)
- map ermöglicht die Speicherung von Paaren
aus Schlüssel (key) und
einem
Wert (value), sowie die Suche anhand eines gegebenen
Schlüssels, wobei jeder Schlüssel in der map nur einfach
vorkommen kann
- multimap ist identisch, läßt aber ein mehrfaches Vorkommen
einzelner Schlüssel zu
- set ist eine Ansammlung von einfach vorkommenden Werten,
nach denen wieder gesucht werden kann (wenn man die Werte als
Schlüssel betrachtet, weil nach ihnen gesucht werden kann, dann ist
ein set wie eine map, aber ohne Werte an den Schlüsseln)
- multiset ist wie set, aber mehrfaches Einfügen ist
möglich
map/multimap und set/multiset werden dabei als
assoziative Container bezeichnet, weil ihre Elemente über
einen Schlüssel ,,assoziiert`` werden können. Die anderen Container
bilden sequentielle Container; sie beinhalten eine Reihenfolge
ihrer Elemente.
vector, deque, list, map, multimap,
set und multiset haben insoweit eine identische
Schnittstelle, daß Iteratoren
(siehe Iteratoren)
und Algorithmen
(siehe Algorithmen)
darauf angewendet können.
Die restlichen (stack, queue und priority_queue)
sind dafür nicht geeignet. Sie sind aus den grundlegenden Containern
hergeleitet, und heißen Container-Adapter.
Daneben gibt es noch Container, die nicht den vollen Satz an
Funktionalität haben, und dafür auf ihren Einsatzzweck optimiert sind:
- basic_string ist für eine Folge von Elementen (etwa eine
Zeichenfolge als Textstring) gedacht.
- bitset
dient der kompakten Speicherung großer Mengen logischer Werte (bool), ohne für jeden true/false-Wert ein Byte (oder je
nach Rechner auch 2 oder 4 Byte) zu verbrauchen.
- valarray ist für die numerische Verarbeitung von Feldern.
Vereinbart sind diese Container jeweils in einer Headerdatei gleichen
Namens, außer priority_queue
, multimap und multiset; diese sind in
<queue>
, <map>
beziehungsweise <set>
mit enthalten.
Unterabschnitte
AnyWare@Wachtler.de