Vorwort XI 1 C++-Programme kompilieren 1 1.1 GCC beschaffen und installieren 16 1.2 Ein einfaches „Hallo Welt“-Programm von der Kommandozeile aus kompilieren 19 1.3 Eine statische Bibliothek von der Kommandozeile aus kompilieren 26 1.4 Eine dynamische Bibliothek von der Kommandozeile aus kompilieren 27 1.5 Eine komplexe Anwendung von der Kommandozeile aus kompilieren 36 1.6 Boost.Build installieren 42 1.7 Ein einfaches „Hallo Welt“-Programm mit Boost.Build kompilieren 44 1.8 Eine statische Bibliothek mit Boost.Build kompilieren 48 1.9 Eine dynamische Bibliothek mit Boost.Build kompilieren 50 1.10 Ein komplexes Programm mit Boost.Build kompilieren 51 1.11 Eine statische Bibliothek mit einer IDE kompilieren 55 1.12 Eine dynamische Bibliothek mit einer IDE kompilieren 59 1.13 Ein komplexes Programm mit einer IDE kompilieren 63 1.14 GNU make beschaffen 69 1.15 Ein einfaches „Hallo Welt“-Programm mit GNU make kompilieren 72 1.16 Eine statische Bibliothek mit GNU make kompilieren 80 1.17 Eine dynamische Bibliothek mit GNU make kompilieren 85 1.18 Ein komplexes Programm mit GNU make kompilieren 87 1.19 Ein Makro definieren 92 1.20 Einen Kommandozeilen-Parameter in einer IDE angeben 94 1.21 Einen Debug Build erstellen 95 1.22 Einen Release Build erstellen 99 1.23 Eine Version der Laufzeitbibliothek auswählen 102 1.24 Die strikte Einhaltung des C++-Standards erzwingen 106 1.25 Eine Quelldatei automatisch gegen eine bestimmte Bibliothek linken lassen 110 1.26 Exportierte Templates verwenden 112 2 Code organisieren 117 2.1 Headerdateien nur einmal einbinden 119 2.2 Eine Instanz einer Variablen über mehrere Quelldateien hinweg verwenden 121 2.3 Die Zahl der #includes mit Hilfe vorgezogener Klassendeklarationen reduzieren 123 2.4 Namenskollisionen mit Hilfe von Namensräumen verhindern 125 2.5 Eine Inline-Datei einbinden 132 3 Zahlen 133 3.1 Einen String in einen numerischen Typ umwandeln 134 3.2 Zahlen in Strings umwandeln 136 3.3 Herausfinden, ob ein String eine gültige Zahl enthält 140 3.4 Fließkommazahlen innerhalb einer beschränkten Genauigkeit vergleichen 143 3.5 Einen String mit einer Zahl in wissenschaftlicher Notation parsen 145 3.6 Zahlen zwischen verschiedenen numerischen Typen konvertieren 147 3.7 Den größten und den kleinsten möglichen Wert eines numerischen Typs bestimmen 150 4 Strings und Text 153 4.1 Einen String mit Füllzeichen auffüllen 154 4.2 Einen String trimmen 156 4.3 Strings als Sequenz ablegen 162 4.4 Die Länge eines Strings ermitteln 166 4.5 Einen String umkehren 169 4.6 Einen String in Teilstrings aufspalten 170 4.7 Einen String in Tokens zerlegen 173 4.8 Eine Sequenz von Strings zu einem String vereinen 176 4.9 Suchen in Strings 178 4.10 Das n-te Vorkommen eines Teilstrings ermitteln 182 4.11 Einen Teilstring aus einem String entfernen 183 4.12 Alle Zeichen eines Strings in Klein- oder Großbuchstaben umwandeln 185 4.13 String-Vergleiche ohne Beachtung von Groß- und Kleinschreibung 188 4.14 Einen String ohne Beachtung von Groß- und Kleinschreibung durchsuchen 191 4.15 Tabulatoren und Leerzeichen in einer Textdateiineinander konvertieren 193 4.16 Zeilen in einer Textdatei umbrechen 196 4.17 Die Anzahl der Zeichen, Wörter und Zeilen in einer Textdatei ermitteln 198 4.18 Die Häufigkeit jedes in einer Textdatei vorkommenden Wortes zählen 201 4.19 Eine Textdatei mit Rändern versehen 204 4.20 Eine Textdatei links- oder rechtsbündig formatieren 207 4.21 Whitespace in Textdateien durch einzelne Leerzeichen ersetzen 210 4.22 Tippfehler in einem sich ändernden Text automatisch korrigieren 211 4.23 Eine Textdatei mit kommaseparierten Einträgen einlesen 214 4.24 Einen String mit Hilfe regulärer Ausdrücke in Tokens zerlegen 217 5 Datumswerte und Uhrzeiten 219 5.1 Das aktuelle Datum und die Uhrzeit ermitteln 220 5.2 Datum und Uhrzeit als String formatieren 222 5.3 Mit Datums- und Uhrzeitwerten rechnen 225 5.4 Zwischen Zeitzonen konvertieren 227 5.5 Die Tagesnummer in einem bestimmten Jahr ermitteln 228 5.6 Typen mit begrenztem Wertebereich definieren 230 6 Daten mit Containern verwalten 235 6.1 Vektoren statt Arrays verwenden 236 6.2 Vektoren effizient einsetzen 240 6.3 Einen Vektor kopieren 245 6.4 Zeiger in einem Vektor speichern 247 6.5 Objekte in einer Liste speichern 249 6.6 String auf andere Dinge abbilden 254 6.7 Gehashte Container nutzen 260 6.8 Objekte sortiert abspeichern 265 6.9 Container in Containern speichern 269 7 Algorithmen 272 7.1 Über einen Container iterieren 273 7.2 Objekte aus einem Container entfernen 280 7.3 Daten zufällig mischen 283 7.4 Bereiche vergleichen 285 7.5 Daten verschmelzen 289 7.6 Einen Bereich sortieren 292 7.7 Einen Bereich aufteilen 295 7.8 Mengenoperationen mit Sequenzen ausführen 297 7.9 Elemente in einer Sequenz transformieren 301 7.10 Schreiben Sie Ihren eigenen Algorithmus 303 7.11 Einen Bereich in einen Stream ausgeben 306 8 Klassen 310 8.1 Datenelemente einer Klasse initialisieren 311 8.2 Objekte mit einer Funktion erstellen (Fabrikmuster) 314 8.3 Mit Konstruktoren und Destruktoren Ressourcen verwalten (RAII) 316 8.4 Einem Container automatisch neue Klasseninstanzen hinzufügen 319 8.5 Sicherstellen, dass nur eine einzelne Version eines Datenelements existiert 321 8.6 Den Typ eines Objekts zur Laufzeit ermitteln 323 8.7 Bestimmen, ob die Klasse eines Objekts eine Unterklasse eines anderen Objekts ist 325 8.8 Jeder Instanz einer Klasse eine eindeutige Identifizierung geben 326 8.9 Eine Singleton-Klasse erstellen 329 8.10 Eine Schnittstelle mit einer abstrakten Basisklasse erstellen 331 8.11 Ein Klassen-Template schreiben 336 8.12 Ein Elementfunktions-Template schreiben 341 8.13 Die Inkrement- und Dekrementoperatoren überladen 344 8.14 Arithmetische und Zuweisungsoperatoren für einintuitives Verhalten einer Klasse überladen 347 8.15 Eine virtuelle Funktion der Superklasse aufrufen 354 9 Ausnahmen und Sicherheit 356 9.1 Eine Ausnahmeklasse erstellen 356 9.2 Einen Konstruktor ausnahmefest machen 361 9.3 Eine Initialisierungsliste ausnahmefest machen 364 9.4 Elementfunktionen ausnahmefest machen 368 9.5 Ein Objekt sicher kopieren 373 10 Streams und Dateien 378 10.1 Text bei der Ausgabe ausrichten 379 10.2 Gleitkommawerte formatieren 383 10.3 Schreiben Sie Ihre eigenen Stream-Manipulatoren 386 10.4 Eine Klasse in einen Stream schreiben können 391 10.5 Eine Klasse aus einem Stream lesen können 394 10.6 Informationen über eine Datei erhalten 396 10.7 Eine Datei kopieren 398 10.8 Eine Datei löschen oder umbenennen 402 10.9 Temporäre Dateinamen und Dateien erstellen 404 10.10 Ein Verzeichnis erstellen 406 10.11 Ein Verzeichnis löschen 408 10.12 Den Inhalt eines Verzeichnisses lesen 411 10.13 Die Dateierweiterung aus einem String extrahieren 413 10.14 Einen Dateinamen aus einem kompletten Pfad extrahieren 415 10.15 Den Pfad aus einem vollständigen Pfad mit Dateinamen ermitteln 416 10.16 Eine Dateierweiterung ersetzen 418 10.17 Zwei Pfade in einem einzelnen Pfad zusammenführen 419 11 Wissenschaft und Mathematik 423 11.1 Die Anzahl der Elemente in einem Container ermitteln 424 11.2 Den größten oder kleinsten Wert in einem Container finden 425 11.3 Die Summe und den Durchschnitt der Elemente in einem Container berechnen 429 11.4 Werte außerhalb eines bestimmten Bereichs ausfiltern 431 11.5 Varianz, Standardabweichung und andere statistische Funktionen berechnen 433 11.6 Zufallszahlen erzeugen 436 11.7 Einen Container mit Zufallszahlen initialisieren 438 11.8 Einen numerischen Vektor mit dynamischer Größe darstellen 440 11.9 Einen numerischen Vektor mit fester Größe darstellen 441 11.10 Ein Skalarprodukt berechnen 445 11.11 Die Norm eines Vektors berechnen 446 11.12 Den Abstand zwischen zwei Vektoren berechnen 447 11.13 Einen Stride-Iterator implementieren 449 11.14 Eine Matrix mit dynamischer Größe implementieren 452 11.15 Eine Matrix mit konstanter Größe implementieren 456 11.16 Matrizen multiplizieren 459 11.17 Die Fast-Fourier-Transformation berechnen 461 11.18 Mit Polar-Koordinaten arbeiten 463 11.19 Berechnungen mit Bitsets durchführen 465 11.20 Große Integer-Werte mit fester Länge darstellen 469 11.21 Zahlen mit festen Nachkommastellen implementieren 473 12 Multithreading 476 12.1 Einen Thread erstellen 477 12.2 Eine Ressource thread-sicher machen 481 12.3 Einen Thread von einem anderen aus benachrichtigen 489 12.4 Gemeinsam genutzte Ressourcen einmal initialisieren 493 12.5 Einer Thread-Funktion ein Argument übergeben 494 13 Internationalisierung 497 13.1 Einen Unicode-String im Quelltext eingeben 498 13.2 Zahlen lesen und schreiben 499 13.3 Datumswerte und Uhrzeiten lesen und schreiben 503 13.4 Währungsbeträge lesen und schreiben 509 13.5 Lokalisierte Strings sortieren 514 14 XML 516 14.1 Ein einfaches XML-Dokument parsen 517 14.2 Mit Xerces-Strings arbeiten 526 14.3 Ein komplexes XML-Dokument parsen 529 14.4 Ein XML-Dokument verändern 540 14.5 Ein XML-Dokument gegen eine DTD validieren 545 14.6 Ein XML-Dokument gegen ein Schema validieren 549 14.7 Ein XML-Dokument mit XSLT umwandeln 553 14.8 Einen XPath-Ausdruck auswerten 559 14.9 Eine Collection von Objekten mit XML speichern und laden 566 15 Verschiedenes 572 15.1 Funktionszeiger für Callbacks nutzen 572 15.2 Zeiger auf Elemente einer Klasse nutzen 574 15.3 Sicherstellen, dass eine Funktion ein Argument nicht verändert 577 15.4 Sicherstellen, dass eine Elementfunktion ihr Objekt nicht verändert 580 15.5 Einen Operator schreiben, der keine Elementfunktion ist 582 15.6 Eine Sequenz mit kommaseparierten Werten initialisieren 584 Index 587