STL und Templates – eine kleine Einführung

Heute gibts leider wieder keinen Bahnbrechenden Fortschritt.
Das Wetter ist einfach zu gut, die Lust meine Zeit vor dem Rechner zu hocken dementsprechend gering.

Um nicht völlig still zu stehen gibts heute ein kleine Einführung (aber wirklich nur ganz oberflächlich und kurz) in die „STL“ und das Thema „generische Datentypen“.

Was ist die STL?

Die STL ist eine Bibliothek von Klassen, die neue Datentypen(Container) und Algorithmen bereitstellt. Ein Vorteil der Algorithmen ist, dass diese nicht nur auf die von der STL mitgebrachten Datencontainer anwendbar sind, sondern auch mit herkömmlichen Arrays funktionieren.

Einige Nützliche Operationen sind zum Beispiel:

  • find(): Suchen eines Wertes innerhalb eines Arrays (oder anderen Containers)
  • sort(): Sortiert die Werte eins Datencontainers
  • copy(): Kopieren eines Bereiches in einem Datencontainer in ein anderes Array
  • reverse(): Vertauscht die Werte eines Datencontainers in umgekehrte Reihenfolge
  • fill(): Füllt ein Datencontainer mit einem bestimmten Wert
  • equal(): Vergleicht zwei Bereiche eines (oder mehrerer Datencontainer) miteinander
  • [...]

Wenn ich hier „Datencontainer“ geschrieben habe meinte ich „Array oder STL-Datentyp“.
Die STL stellt weiterhin auch eine for-each-Schleife und eine Iteratorklasse bereit. Das würde jetzt aber zu sehr ins Detail gehen.

Neben den äußerst nützlichen Algorithmen gibt es auch einige gut zu gebrauchenden Datentypen, die nicht nur nützlich, sondern auch generisch und damit sehr vielseitig einsetzbar sind.

Containerklassen der STL:

  • vector<Typ>: Der wohl einfachste Datentyp der STL ist ein dynamisches Äquivalent zum normalen Array. Das Vektorobjekt lässt sich nicht nur als Liste aus Daten benutzen, sondern mit Hilfe einiger gegebener Methoden auch als Stack.
  • deque<Typ>: Um diesen Datentyp zu verstehen hilft vielleicht aufzuklären, dass es sich bei der Bezeichnung um eine Abküzung für „double ended queue“ handelt. Und im Endeffekt ist es nichts anderes, als ein Vektor mit der zusätzlichen Funktion, dass man auch Elemente am Anfang der Datenschlange einfügen kann. Deswegen „Vektor mit zwei Enden“.
  • list<Typ>: Hier gehts ans Eingemachte. Bei diesem Datentyp handelt es sich um eine doppelt verkettete Liste. Eine Liste ist dann sinnvoll, wenn man oft Daten einfügt oder löscht, aber nicht so oft drauf zugreifen muss. Ein Zugriff per Index wie bei einem Array oder Vektor ist hier leider nicht möglich, da alle Daten durchlaufen werden müssen, um an eine bestimmte Position zu gelangen.
  • [multi]set<Typ>: Ein „set“ ist ein Container, in dem alle Werte assoziativ zu einem Schlüssel abgespeichert werden. Wenn es sich nicht um ein „multiset“ handelt, darf jedes Element nur einmal auftreten. Ein weiterer Vorteil ist, dass die Elemente sortiert eingefügt werden.
  • [multi]map<Typ>: Die „map“ funktioniert ähnlich wie ein „set“, nur dass man den Schlüssel (und Schlüsseltyp) selber angeben kann. So kann man wie bei einem Array auf Elemente zugreifen, nur dass in den Eckigen Klammern ein beliebiger (auch String) Wert als Index stehen kann.

Das ist natürlich nicht alles, was die STL zu bieten hat, aber genug um zu veranschaulichen, wie mächtig die Bibliothek ist.

Um tiefer in die Materie einzusteigen oder sich die STL runterzuladen lohnt sich ein Blick auf die Homepage: http://www.sgi.com/tech/stl/

Ist ja ganz toll, aber was soll denn das ganze Gequatsche von wegen „generisch“ und was sollen diese „<Typ>“-Dinger sein?

Generische Datentypen

Stellen wir uns mal folgendes vor: Sie programmieren sich eine Klasse, um Integer-Werte in eine Datei zu speichern. Das geht eine Zeit gut, bis plötzlichen nicht nur Zahlen, sondern auch ganze Wörter und Texte gespeichert werden müssen. Jetzt könnte man natürlich exakt die selbe Klasse nur mit dem Datentyp String (bzw. *char) schreiben, die man dann halt benutzt. Aber das wiederspricht irgendwie dem Prinzip so wenig wie möglich doppelten Code zu haben.

Die Lösung: generische Datentypen.
Das heißt, dass man die Klasse schreibt ohne sich auf einen bestimmten Datentyp festzulegen. Das erhöht die Wiederverwedbarkeit von Klassen enorm.

Wie genau das funktioniert kann man in diversen Onlinetutorials oder in so gut wie jedem guten C++ Buch lesen. Das hier zu erklären würde diesen ohnehin schon sehr ermüdenen Artikel wohl unerträglich machen.

Deswegen gibt es noch ein kleinen Codeauszug von mir, der ansatzweise zeigt, was dieser Artikel erklärt:

Die STL im Einsatz

Die STL im Einsatz

MfG, der Dac, der ganz bestimmt bald wieder was macht.

4 Antworten zu „STL und Templates – eine kleine Einführung“

  1. Rei sagt:

    Da es hier um C++ geht, würde ich zusätzlich zu „generische Datentypen“ auch unbedingt „Template“ erwähnen.
    Im Grunde verwendet C++ Templates für generische Programmierung, aber keine generischen Datentypen an sich.
    Trotz ähnlicher Syntaxschreibweise sind generische Typen und Templates verschiedene Dinge; dein Text (1.Absatz) beschreibt auch eher Templates und keine generischen Typen.
    Bei Templates werden die entsprechenden Typen zur Compilierzeit eingesetzt, bei generischen Typen werden zur Laufzeit die entsprechenden Methoden usw. dynamisch gebunden.

  2. dac-xp sagt:

    Hey, danke für den Hinweis, Rei.
    Ich werde mich umgehend schlau machen. :D

  3. Rei sagt:

    Ich muss zugeben, ich glaub fast ich hab mich vertan, in allem Eifer :(
    Laut wiki sind Templates einfach „nur“ eine Möglichkeit, mit diesen generischen Typen umzugehen. Soweit ich seh, hat Java auch diese „Schablonen“.
    Die andere -Möglichkeit- laut wiki ist das dynamische Binden zur Laufzeit, kA wie genau das dann aussieht…

    Ich nehme meine „Kritik“ hiermit zurück, war nicht meine Absicht, Fehlinformationen oder Halbwissen zu streuen. :)

    Bin ja selber noch am lernen, hab bei C++ immer nur Template oder parametrisierter Typ gehört aber net geahnt dass es da noch mehr gibt. :D

  4. Rei sagt:

    Hachja, sorry fürs spammen :)

    „In anderen Programmiersprachen gibt es ein zu Templates ähnliches Konzept unter dem Namen „generischer Typ“.“ -> ebensfall wiki, unter Template (Programmierung).

    Vielleicht hatte ich ja doch Recht.
    Bin jetz erstmal selber verwirrt, vielleicht kommst du ja zu besseren Erkenntnissen :D

Eine Antwort schreiben