Benutzer:Koschi/Kontainer der STL

Aus Spieleprogrammierer-Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
(Allgemeines)
Zeile 45: Zeile 45:
 
== Allgemeines ==
 
== Allgemeines ==
 
Alle Kontainer der Standard Template Libary befinden sich im Namensraum std.
 
Alle Kontainer der Standard Template Libary befinden sich im Namensraum std.
 +
{| class="wikitable"
 +
|-
 +
! align="center" style="background-color:#C2C2C2;" | Kontainer Name
 +
! align="center" style="background-color:#E2E2E2;" | array
 +
! align="center" style="background-color:#E2E2E2;" | deque
 +
! align="center" style="background-color:#E2E2E2;" | forward_list
 +
! align="center" style="background-color:#E2E2E2;" | list
 +
! align="center" style="background-color:#E2E2E2;" | vector
 +
|-
 +
! align="center" style="background-color:#C2C2C2;" | <span style="color:#0000C2;">#include</span>
 +
! align="center" | <span style="color:#0000C2;"><array></span>
 +
! align="center" | <span style="color:#0000C2;"><deque></span>
 +
! align="center" | <span style="color:#0000C2;"><list></span>
 +
! align="center" | <span style="color:#0000C2;"><list></span>
 +
! align="center" | <span style="color:#0000C2;"><vector></span>
 +
|-
 +
! colspan="6" style="text-align:center" style="background-color:#A2A2A2;" | Laufzeitverhalten nach O-Notation
 +
|-
 +
! style="background-color:#C2C2C2;" | Element zugriff
 +
! align="center" | O?
 +
! align="center" | O(1)
 +
! align="center" | O?
 +
! align="center" | O(n)
 +
! align="center" | O(1)
 +
|-
 +
! style="background-color:#C2C2C2;" | einfügen/löschen Anfang
 +
! align="center" | O?
 +
! align="center" | O(1)
 +
! align="center" | O?
 +
! align="center" | O(n)
 +
! align="center" | O(1)
 +
|-
 +
! style="background-color:#C2C2C2;" | Einfügen/löschen Mitte
 +
! align="center" | O?
 +
! align="center" | O(1)
 +
! align="center" | O?
 +
! align="center" | O(n)
 +
! align="center" | O(1)
 +
|-
 +
! style="background-color:#C2C2C2;" | Einfügen/löschen Ende
 +
! align="center" | O?
 +
! align="center" | O(1)
 +
! align="center" | O?
 +
! align="center" | O(n)
 +
! align="center" | O(1)
 +
 +
|}
 +
 +
{| class="wikitable"
 +
|-
 +
! align="center" style="background-color:#C2C2C2;" | Kontainer Name
 +
! align="center" style="background-color:#E2E2E2;" | map
 +
! align="center" style="background-color:#E2E2E2;" | multimap
 +
! align="center" style="background-color:#E2E2E2;" | unordered_map
 +
! align="center" style="background-color:#E2E2E2;" | unordered_multimap
 +
! align="center" style="background-color:#E2E2E2;" | set
 +
! align="center" style="background-color:#E2E2E2;" | multiset
 +
! align="center" style="background-color:#E2E2E2;" | unordered_set
 +
! align="center" style="background-color:#E2E2E2;" | unordered_multiset
 +
|-
 +
! align="center"  style="background-color:#C2C2C2;" | <span style="color:#0000C2;">#include</span>
 +
! align="center" | <span style="color:#0000C2;"><map></span>
 +
! align="center" | <span style="color:#0000C2;"><map></span>
 +
! align="center" | <span style="color:#0000C2;"><unordered_map></span>
 +
! align="center" | <span style="color:#0000C2;"><unordered_map></span>
 +
! align="center" | <span style="color:#0000C2;"><set></span>
 +
! align="center" | <span style="color:#0000C2;"><set></span>
 +
! align="center" | <span style="color:#0000C2;"><unordered_set></span>
 +
! align="center" | <span style="color:#0000C2;"><unordered_set></span>
 +
|}
 +
 +
{| class="wikitable"
 +
|-
 +
! align="center" style="background-color:#C2C2C2;" | Kontainer Name
 +
! align="center" style="background-color:#E2E2E2;" | priority_queue
 +
! align="center" style="background-color:#E2E2E2;" | queue
 +
! align="center" style="background-color:#E2E2E2;" | stack
 +
|-
 +
! align="center" style="background-color:#C2C2C2;" | <span style="color:#0000C2;">#include</span>
 +
! align="center" | <span style="color:#0000C2;"><queue></span>
 +
! align="center" | <span style="color:#0000C2;"><queue></span>
 +
! align="center" | <span style="color:#0000C2;"><stack></span>
 +
|}

Version vom 21. November 2015, 09:20 Uhr

In der Spieleentwicklung ist es oft nötig, ein gewisse Menge an identischen Daten zu verwalten. Um die Verwaltung der Daten nicht nicht von Grund auf selber zu programmieren bietet die Standard Template Libary eine umfangreiche Sammlung an Kontainern, die das Verwalten der Daten erheblich erleichtert. Die Arbeitsweise und wofür die Verschiedenen Kontainer sind soll in diesem Artikel näher beschrieben werden.

Inhaltsverzeichnis

Was ist ein Kontainer

Einen Kontainer kann man sich als Behältnis für Daten vorstellen, diese Daten werden auch Elemente genannt. Einen bekannter (nicht STL) Kontainer, den wohl jeder bereits kennt und benutzt hat, ist ein simples eindimenionales Array. Der Vorteil bei den STL Kontainer ist, dass die Anzahl der Elemente in den meinsten Fällen dynamisch wachsen können. Es spielt dabei keine Rolle ob diese Daten Structs, Klassen oder eines der Grunddatentypen sind. Wie das "Befüllen" mit Daten erfolgt, hängt aber vom Konatainer selber ab, da sich die Interne Datenstrukture von Kontainertyp zu Kontainertyp unterscheiden kann. Bedingt durch den Aufbau der Kontainer kann man diese in 3 Kategorien aufteilen:

Um die Verwaltung des benötigten Speichers, kümmern sich die Kontainer selber.

Sequentielle Kontainer

Die Daten in einem Sequentiellen Kontainer liegen in der Reihenfolge vor wie sie Eingefügt wurden. Das heist wurde ein Element als drittes hinzugefügt ist es auch später wieder an dieser stelle zu finden. Für Sequentielle Kontainer kann ein Iterator erstellt werde, der es ermöglicht alle Elemente des Kontainers über eine Schleife zu erreichen.

Zu den Sequentille Kontainer gehören:

Assoziative Kontainer

Die Assoziative Kontainer können weiter unterteilt werden in Map- und Set-Kontainer, sowie jeweils in eine multi Version. An welche Stelle im Kontainer die Elemente eingeordnet werden, kann über eine eigene Vergleichsfunktion bestimmt werden.

Mit C++11 wurden noch jeweils eine ungeordnete Versionen eingeführt. Ungeordnet heist in diesem Zusammenhang aber nur, dass nicht die Möglichkeit gegeben ist eine (eigene) Vergleichsfunktion einzusetzen. Intern arbeiten diese ungeordneten Kontainer mit Hashwerten, der Zugriff auf die Daten ist so wesentlich schneller. Es besteht aber die Möglichkeit einen eigenen Hash-Algorithmus einzusetzen, um die Reihenfolge der Daten festzulegen.

Der Zugriff auf ein Elemente kann bei allen Assoziative Kontainer über einen Schlüssel erfolgen. Die Map-Kontainer besitzen ein Schlüssel-Werte-Paar, Schlüssel und Wert können (müssen aber nicht) unterschiedliche Datentypen sein. Die Set-Kontainer besitzen lediglich den Schlüssel, der gleichzeitig auch den Wert darstellt. Der Schlüssel darf dabei nur einmalig im Kontainer vorkommen, es sei den es handelt sich um die multi Version, hier darf der Schlüssel mehrfach vorkommen.

Für Assoziative Kontainer kann ein Iterator erstellt werde, der es ermöglicht alle Elemente des Kontainers über eine Schleife zu erreichen.

Zu den Assoziative Kontainer gehören:

Kontaineradapter

Zu den Kontaineradapter gehören:

Allgemeines

Alle Kontainer der Standard Template Libary befinden sich im Namensraum std.

Kontainer Name array deque forward_list list vector
#include <array> <deque> <list> <list> <vector>
Laufzeitverhalten nach O-Notation
Element zugriff O? O(1) O? O(n) O(1)
einfügen/löschen Anfang O? O(1) O? O(n) O(1)
Einfügen/löschen Mitte O? O(1) O? O(n) O(1)
Einfügen/löschen Ende O? O(1) O? O(n) O(1)
Kontainer Name map multimap unordered_map unordered_multimap set multiset unordered_set unordered_multiset
#include <map> <map> <unordered_map> <unordered_map> <set> <set> <unordered_set> <unordered_set>
Kontainer Name priority_queue queue stack
#include <queue> <queue> <stack>
Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Werkzeuge