1. Einführung
Konventionen
Typografie
Quellcode
Wert versus Objekt
Index
Danksagungen
C++ versus C++11
2. Die Standardbibliothek
Die Chronologie
Überblick
Praktische Werkzeuge
Die Standard Template Library
Numerik
Textverarbeitung
Ein- und Ausgabe
Multithreading
Bibliotheken verwenden
Header-Dateien einbinden
Namensräume verwenden
Namen qualifiziert verwenden
Namen unqualifiziert verwenden
using-Deklaration
using-Anweisung
Namensraum-Alias
Ein ausführbares Programm erzeugen
3. Praktische Werkzeuge
Praktische Funktionen
std::min, std::max und std::minmax
std::move
std::forward
std::swap
Adaptoren für Funktionen
std::bind
std::function
Paare
std::make_pair
Tupel
std::make_tuple
std::tie und std::ignore
Referenz-Wrapper
std::ref und std::cref
Smart Pointer
std::unique_ptr
Spezielle Löschfunktionen
std::make_unique
std::shared_ptr
std::make_shared
std::shared_ptr von this
std::weak_ptr
Zyklische Referenzen
Type-Traits
Typeigenschaften abfragen
Primäre Typkategorien
Zusammengesetzte Typkategorien
Typeigenschaften
Typen vergleichen
Typen modifizieren
Zeitbibliothek
Zeitpunkt
Zeitdauer
Zeitgeber
4. Gemeinsamkeiten der Container
Erzeugen und Löschen
Größe bestimmen
Zugriff auf die Elemente
Zuweisen und Tauschen
Vergleiche
5. Sequenzielle Container
Arrays
Vektoren
size <= capacity
Deque
Listen
Einfach verkettete Listen
6. Assoziative Container
Überblick
Geordnete assoziative Container
Überblick
Schlüssel und Wert
Das Vergleichskriterium
Besondere Suchfunktionen
Einfügen und Löschen von Elementen
std::map
Ungeordnete assoziative Container
Überblick
Schlüssel und Wert
Performance
Die Hashfunktion
Die Details
7. Adaptoren für Container
Stack
Queue
Priority Queue
8. Iteratoren
Kategorien
Iteratoren erzeugen
Nützliche Funktionen
Adaptoren
Einfügeiteratoren
Stream-Iteratoren
9. Aufrufbare Einheiten
Funktionen
Funktionsobjekte
Vordefinierte Funktionsobjekte
Lambda-Funktionen
10. Algorithmen
Konventionen für Algorithmen
Iteratoren als Bindeglied
for::each
Nicht modifizierende Algorithmen
Elemente suchen
Elemente zählen
Bedingungen auf Bereichen testen
Bereiche vergleichen
Bereiche in Bereichen suchen
Modifizierende Algorithmen
Elemente und Bereiche kopieren
Elemente und Bereiche ersetzen
Elemente und Bereiche entfernen
Bereiche füllen und erzeugen
Bereiche verschieben
Bereiche vertauschen
Bereiche transformieren
Bereiche umdrehen
Bereiche rotieren
Bereiche zufällig neu ordnen
Duplikate entfernen
Partitionierungen
Sortieren
Binäres Suchen
Merge-Operationen
Heap
Min und Max
Permutationen
Numerik
11. Numerik
Zufallszahlen
Zufallszahlenerzeuger
Zufallszahlenverteilung
Numerische Funktionen von C
12. Strings
Erzeugen und Löschen
Konvertierungen zwischen C++-Strings und C-Strings
size versus capacity
Vergleiche
Stringkonkatenation
Elementzugriff
Ein- und Ausgabe
Suchen
Modifizierende Operationen
Numerische Konvertierungen
13. Reguläre Ausdrücke
Zeichentypen
Reguläre-Ausdrücke-Objekte
Das Suchergebnis match_results
std::sub_match
Exakte Treffer
Suchen
Ersetzen
Formatieren
Wiederholtes Suchen
std::regex_iterator
std::regex_token_iterator
14. Ein- und Ausgabestreams
Hierarchie
Ein- und Ausgabefunktionen
Eingabe
Formatierte Eingabe
Unformatierte Eingabe
Ausgabe
Formatangabe
Streams
Stringstreams
Dateistreams
Dateistreams: wahlfreier Zugriff
Streamzustand
Eigene Datentypen
15. Multithreading
Das C++-Speichermodell
Atomare Datentypen
Threads
Erzeugen eines Threads
Lebenszeit eines Threads
Datenübergabe an einen Thread
Operationen auf Threads
Gemeinsam von Threads genutzte Daten
Kritischer Wettlauf
Schutz der Daten mit Mutexen
Verklemmung
Locks
std::lock_guard
std::unique_lock
Sichere Initialisierung der Daten
Konstante Ausdrücke
Statische Variablen mit Blockgültigkeit
std::call_once und std::once_flag
Thread-lokale Daten
Bedingungsvariablen
Tasks
Thread versus Task
std::async
std::packaged_task
std::promise und std::future
Stichwortverzeichnis
C++-Standardbibliothek – kurz & gut ist eine Schnellreferenz zur Standardbibliothek des C++-Standards C++11. Der internationale Standard ISO/IEC 14882:2011 umfasst gut 1.300 Seiten und wurde 2011 veröffentlicht, also 13 Jahre nach dem bisher einzigen C++-Standard C++98. Formal betrachtet, ist zwar C++03 ein weiterer C++-Standard, der 2003 verabschiedet wurde. C++03 hat aber nur den Charakter einer technischen Korrektur.
Ziel dieser Kurzreferenz ist es, die Standardbibliothek von C++ kompakt vorzustellen. Im O'Reilly Verlag ist auch ein Buch zur C++-Kernsprache in der Reihe Taschenbibliothek erschienen. Ein Buch zur C++-Standardbibliothek setzt die Features der C++-Kernsprache voraus. Gegebenenfalls werde ich Features der Kernsprache vorstellen, um die Funktionalität der Standardbibliothek besser darstellen zu können. Beide Bücher dieser Reihe sind in Stil und Umfang sehr ähnlich und ergänzen sich ideal. 2014, beim Schreiben dieses Werks, wurde eine Ergänzung des C++11-Standards verabschiedet: C++14. In diesem Buch werde ich auf einige Neuerungen für C++ eingehen, die C++14 für die Standardbibliothek mit sich bringt.
Dieses Buch wurde für den Leser geschrieben, der eine gewisse Vertrautheit mit C++ besitzt. Dieser C++-Programmierer wird aus der konzentrierten Referenz der Standardbibliothek von C++ den größten Nutzen ziehen. Wenn C++ für Sie hingegen noch neu ist, sollten Sie im ersten Schritt ein Lehrbuch über C++ dieser Kurzreferenz vorziehen. Haben Sie das Lehrbuch aber gemeistert, hilft Ihnen dieses Werk mit den vielen kurzen Codebeispielen, die Komponenten der Standardbibliothek von C++ in einem weiteren Schritt sicher anzuwenden.
Mit diesen wenigen Konventionen sollte das Buch leichter lesbar sein.
In dem Buch werden die folgenden typografischen Konventionen verwendet:
Diese Schrift wird für Dateinamen und Hervorhebungen verwendet.
Nichtproportionalschrift
Diese Schrift wird für Code, Befehle, Schlüsselwörter und Namen von Typen, Variablen, Funktionen und Klassen verwendet.
Obwohl ich kein Freund von using
-Anweisungen und using
-Deklarationen bin, da sie die Herkunft einer Bibliotheksfunktion verschleiern, werde ich gegebenenfalls in den Codebeispielen davon Gebrauch machen, und zwar einfach, weil die Länge einer Seitenzeile beschränkt ist. Es wird aber immer aus dem Codebeispiel hervorgehen, ob ich eine using
-Deklaration (using std::cout;
) oder eine using
-Anweisung (using namespace std;
) verwendet habe.
In den Codebeispielen werde ich nur die Header-Datei verwenden, dessen Funktionalität in dem Kapitel dargestellt wird.
Wahrheitswerte werde ich in den Ausgaben der Codebeispiele immer als true
oder false
darstellen, auch wenn das std::boolalpha
-Flag (siehe „Formatangabe“) in dem Beispiel nicht verwendet wird.
Built-in-Datentypen, die C++ von C geerbt hat, nenne ich der Einfachheit halber Werte. Anspruchsvollere Datentypen, die oft Built-in-Datentypen enthalten, nenne ich Objekte. Dies sind in der Regel benutzerdefinierte Datentypen oder auch Container.
Da die Namen der Standardbibliothek mit dem Namensraum std
beginnen, verwende ich diesen im Index der Einfachheit halber nicht, sodass zum Beispiel die Information zum Vektor std::vector
im Index unter vector
zu finden ist.
Ich möchte Alexandra Follenius, meiner Lektorin bei O'Reilly, für ihre Unterstützung und Anleitung bei der Arbeit mit diesem Buch danken. Danke vor allem aber auch an Karsten Ahnert, Guntram Berti, Dmitry Ganyushin, Sven Johannsen, Torsten Robitzki und Bart Vandewoestyne, die sich die Zeit genommen haben, das Manuskript auf sprachliche und insbesondere inhaltliche Fehler zu durchleuchten.
Wer könnte C++11 besser charakterisieren als Bjarne Stroustrup, Erfinder von C++:
Surprisingly, C++11 feels like a new language: The pieces just fit together better than they used to and I find a higher-level style of programming more natural than before and as efficient as ever.
—Bjarne Stroustrup,
http://www.stroustrup.com/C++11FAQ.html
Bjarne Stroustrup hat recht. C++11 fühlt sich wie eine neue Sprache an, denn C++11 hat einiges gegenüber klassischem C++ zu bieten. Dies trifft nicht nur auf die Kernsprache, dies triff vor allem auch auf die verbesserte und deutlich erweiterte Standardbibliothek zu. Die Bibliothek mit den regulären Ausdrücken für die mächtigere Verarbeitung von Texten, die Type-Traits-Bibliothek, um Typinformationen zu erhalten, zu vergleichen oder zu modifizieren, sowie die neue Zufallszahlen- oder Zeitbibliothek sind nun genauso auf der Habenseite von C++ wie die erweiterten Smart Pointer für die explizite Speicherverwaltung oder die neuen Container std::array
und std::tuple
. Neu ist vor allem aber auch, dass sich C++ zum ersten Mal mit der Multithreading-Bibliothek der Existenz von mehreren Threads bewusst ist.