C++-Standardbibliothek

Inhaltsverzeichnis
1. Auflage 2015

C++-Standardbibliothek

kurz & gut

Rainer Grimm

Inhaltsverzeichnis

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

Kapitel 1. Einführung

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.

Konventionen

Mit diesen wenigen Konventionen sollte das Buch leichter lesbar sein.

Typografie

In dem Buch werden die folgenden typografischen Konventionen verwendet:

Kursiv

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.

Quellcode

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.

Wert versus Objekt

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.

Index

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.

Danksagungen

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.

C++ versus C++11

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.