Die Standard-Bibliothek stellt unter anderem allgemein gültige (generische) Datenstrukturen und Algorithmen auf Basis von Templates zur Verfügung. Großen Einfluss auf die Definition der Standard Bibliothek hatte die von HP entwickelte STL (Standard Template Library). Templates sind prinzipiell Funktion oder Klassen die mit beliebigen Datentypen umgehen können. Ein oft herangezogenes Beispiel für ein Funktions-Template ist die Funktion swap(...), die es ermöglicht, die Werte zweier Variablen oder zwei Objekte gegeneinander auszutauschen. Dem Funktions-Template swap(...) ist es prinzipiell gleichgültig, ob sie zwei float-Werte oder gar zwei Objekte (zum Beispiel der Fensterklasse Window) vertauscht wollen. Template-Funktionen werden wie normale Funktionen aufgerufen. Der Datentyp mit dem die Funktion arbeitet ergibt sich dabei automatisch aus dem Datentyp der Parameter. Mehr zu Templates erfahren Sie noch im weiteren Verlaufe des Kurses.
Zur Veranschaulichung von Template-Funktionen ein Beispiel dazu. Die erste swap(...) Funktion im nachfolgenden Beispiel dient zum Vertauschen von zwei float-Werten, während die zweite swap(...) Funktion zum Vertauschen von zwei Window-Objekten dient. Allein der Datentyp der Parameter bestimmt, mit welchen Datentyp die Funktion swap(...) arbeitet.
// Funktion swap für float-Werte float var1, var2; .... swap(var1, var2); // Funktion swap für zwei Window-Objekte Window myWin, yourWin; ... swap(myWin, yourWin); |
Wichtig hierbei ist, dass die Template-Funktion nur einmal geschrieben werden muss, d.h. Sie müssen nicht wie beim Überladen von Funktionen mehrere Funktionen swap(...) definieren um unterschiedlich Daten auszutauschen. Dies übernimmt bei Template-Funktionen automatisch der Compiler beim Übersetzen des Programms.
Noch ein Hinweis: wenn Sie Objekte mittels swap(...) vertauschen wollen, so sollte die entsprechende Klasse dazu den Operator = überladen. Dies gilt insbesondere dann, wenn die Klasse dynamische Eigenschaften enthält.
Kommen wir nun zu den Klassen-Templates und sehen wir uns einmal an, wie Sie ein Objekt definieren, dessen Klasse durch ein Klassen-Template vorgegeben ist. Da Templates den aktuellen Datentyp, mit dem sie arbeiten, über Parametern bestimmen, müssen Sie bei der Definition eines Klassen-Template Objekts den Datentyp durch einen zusätzlichen Parameter spezifizieren. Dieser Parameter wird innerhalb einer spitzen Klammer nach dem Klassen-Templatename und vor dem Objektnamen angegeben.
// Vektor zur Ablage von int definieren vector<int> myInts; // Vektor zur Ablage von Window-Objekten definieren vector<Window> myWindows |
Oben sehen Sie dazu wieder zwei Beispiele. Im ersten Falle wird ein Objekt myInts vom Typ vector<int> definiert, d.h. die Template-Klasse myInts verarbeitet int-Werte. Im zweiten Fall wird ein Objekt der gleichen Template-Klasse vector definiert, diesmal jedoch verarbeitet die Klasse Window-Objekte. Wie Sie später noch sehen werden, gibt es die Klasse vector in der Standard Bibliothek tatsächlich.
Solche generischen Klassen zum Abspeichern von Daten werden in der Standard Bibliothek auch als Container bezeichnet. In dieser Lektion werden Sie einige spezielle Container kennen lernen. Die allgemein gültigen Container werden dann in einer späteren Lektion noch behandelt.
Der Umgang mit Templates mag sich am Anfang vielleicht etwas kompliziert anhören. Sie werden aber sehen, so besonders schwierig ist die Sache im Endeffekt dann aber auch nicht.
Außer solchen generischen Funktion und Klassen enthält die Standard Bibliothek auch noch jede Menge Algorithmen. So gibt es zum Beispiel einen Algorithmus sort(...) der es erlaubt, die Elemente eines Containers nach einem bestimmten Kriterium zu sortieren. Diese Algorithmen werden ebenfalls noch später behandelt, wenn Sie die allgemeinen Container kennen gelernt haben.
Die Standard Bibliothek ist fester Bestandteil der Sprache C++ und in der ANSI-Spezifikation genau definiert. Der wichtigste Aspekt der Standard Bibliothek ist die strikte Trennung zwischen dem Abspeichern von Daten in Containern und deren Verarbeitung mittels der Algorithmen. Container können (fast) beliebige Daten aufnehmen und die Algorithmen arbeiten dann mit den verschiedensten Containern zusammen, um zum Beispiel deren Inhalt zu sortieren oder zu modifizieren.
Sehen wir uns jetzt im Überblick an, aus welchen Teilen die Standard-Bibliothek besteht.
Ein Container dient zur Aufnahme von Elementen eines beliebigen (Daten-)Typs. Einer der einfachen Containertypen ist der vector. Er entspricht prinzipiell einem Feld, dessen Größe sich aber dynamisch an die in ihm abgelegte Anzahl von Elementen anpasst
Algorithmen verarbeiten die in einem Container abgelegten Elemente. So sortiert der in der Standard Bibliothek vorhandene Algorithmus sort(...) die im Container enthaltenen Elemente.
Iteratoren sind Objekte mit deren Hilfe die in einem Container enthaltenen Elemente durchlaufen werden können. Ein Iterator repräsentiert dabei eine bestimmte Position innerhalb eines Containers, d.h. er entspricht vom Prinzip her einem Zeiger auf ein bestimmtes Element im Container.
Funktionsobjekte sind Objekte die den Operator (...) (also den Funktionsoperator) überladen. Sie sind das C++ Gegenstück zu Funktionszeiger, aber viel mächtiger.
Ein Adapter dient prinzipiell zur Anpassung von Funktionen/Memberfunktionen an eine vorgegebene Signatur (Funktions-/Memberfunktions-Name einschließlich Parameter).
Aber keine Angst wenn Ihnen jetzt noch nicht alles sofort verständlich ist. Dies wird sich mit Sicherheit im Verlaufe des Kurses noch ändern.
Damit genug der Vorwort, beginnen wir die Einführung in die Standard Bibliothek. Der Standard-Bibliothek ist später im Kurs noch eine weitere Lektionen gewidmet.