C++ Kurs

C++ Standard-Bibliothek

Die Themen:

Die C++ Standard-Bibliothek stellt generische Datenstrukturen und Algorithmen auf Basis von Templates zur Verfügung. Großen Einfluss auf die Definition der Standard-Bibliothek hatte die von Hewlett-Packard entwickelte STL (Standard Template Library). Templates sind, vereinfacht ausgedrückt, generische Funktion oder Klassen die mit beliebigen Datentypen umgehen können. Ein einfaches Beispiel für ein Funktions-Template ist die Funktion swap(...), die es ermöglicht, die Inhalte zweier Variablen oder zwei Objekte zu vertauschen. Dem Funktions-Template swap(...) ist es prinzipiell gleichgültig, ob zwei float-Werte oder gar zwei Objekte (zum Beispiel der Fensterklasse Window) vertauscht werden sollen. Template-Funktionen werden wie normale Funktionen aufgerufen. Der Datentyp, mit dem die Funktion arbeitet, ergibt sich dabei automatisch aus den Datentypen der Parameter. Mehr zu Templates erfahren Sie noch im weiteren Verlaufe des Kurses.

Zur Veranschaulichung von Template-Funktionen ein Beispiel. 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 die Datentypen der Parameter bestimmen letztendlich, welche swap(...) Funktion aufgerufen wird.

PgmHeader// 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);

Entscheidend hierbei ist, dass die Template-Funktion nur einmal geschrieben werden muss, d.h. es müssen nicht, wie beim Überladen von Funktionen, mehrere Funktionen swap(...) definiert werden, um unterschiedlich Daten zu vertauschen. Dies übernimmt bei Template-Funktionen automatisch der Compiler beim Übersetzen des Programms.

HinweisWenn Sie Objekte mittels swap(...) vertauschen wollen, so sollte die entsprechende Klasse dazu den Operator = sowie die Move-Memberfunktionen überladen. Dies gilt insbesondere dann, wenn die Klasse dynamische Eigenschaften enthält.

Kommen wir nach den Funktions-Templates zu den Klassen-Templates und sehen uns an, wie ein Objekt definiert wird, dessen Klasse durch ein Klassen-Template vorgegeben ist. Da Templates den aktuellen Datentyp, mit dem sie arbeiten, über Parametern bestimmen, muss bei der Definition eines Objekts eines Klassen-Templates der Datentyp durch einen zusätzlichen Parameter spezifiziert werden. Dieser Parameter wird innerhalb einer spitzen Klammer nach dem Klassen-Templatenamen und vor dem Objektnamen angegeben.

PgmHeader// Vektor zur Ablage von int definieren
vector<int> myInts;
// Vektor zur Ablage von Window-Objekten definieren
vector<Window> myWindows

Im ersten Fall wird ein Objekt myInts vom Typ vector<int> definiert, d.h. die Template-Klasse vector 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, enthält die Standard-Bibliothek tatsächlich ein Klasse vector zur Ablage von Daten beliebigen Typs.

Solche generischen Klassen zum Abspeichern von Daten werden auch als Container bezeichnet.

Der Umgang mit Templates mag sich am Anfang vielleicht etwas kompliziert anhören. Sie werden aber sehen, so schwierig ist die Sache im Endeffekt dann aber doch nicht.

Außer solchen generischen Funktion und Klassen enthält die Standard-Bibliothek noch zahlreiche 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 später behandelt, nachdem wir uns die allgemeinen Container ansehen haben.

Die Standard-Bibliothek ist fester Bestandteil der Sprache C++ und im C++ Standard 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 verarbeiten dann die im Container abgelegten Daten, um zum Beispiel deren Inhalt zu sortieren oder auch zu modifizieren.

Sehen wir uns jetzt im Überblick an, aus welchen Teilen die Standard-Bibliothek besteht.

Bibliothekskomponenten

Container

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

Algorithmen verarbeiten die in einem Container abgelegten Elemente. So sortiert der in der Standard-Bibliothek vorhandene Algorithmus sort(...) die im Container enthaltenen Elemente.

Iteratoren

Iteratoren sind Objekte, mit deren Hilfe die in einem Container enthaltenen Elemente durchlaufen werden können. Ein Iterator verweist dabei auf eine bestimmte Position innerhalb eines Containers, d.h. er entspricht vom Prinzip her einem Zeiger auf ein bestimmtes Element im Container.

Funktionsobjekte und Adapter

Funktionsobjekte sind Objekte, die den Operator () (also den Funktionsoperator) überladen. Sie sind das C++ Gegenstück zu Funktionszeiger, jedoch viel mächtiger.

Ein Adapter dient prinzipiell zur Anpassung von Funktionen/Memberfunktionen an eine vorgegebene Signatur (gleich Funktions-/Memberfunktions-Name einschließlich Parameter).

Aber keine Angst wenn Ihnen jetzt noch nicht alles sofort verständlich ist. Dies wird sich mit Sicherheit noch ändern.

Damit genug der Vorworte, beginnen wir den ersten Teil der Einführung in die Standard-Bibliothek.