C++ Kochbuch D. Ryan Stephens, Christopher Diggins, Jonathan Turkanis & Jeff Cogswell Deutsche Übersetzung von Andreas Heck & Thomas Demmig O'REILT ® Beijing • Cambridge • Farnham • Köln • Paris • Sebastopol • Taipei • Tokyo Inhalt Vorwort 1 C++-Programme kompilieren XI 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 1.26 Exportierte Templates verwenden Code organisieren 2.1 Headerdateien nur einmal einbinden 2.2 Eine Instanz einer Variablen über mehrere Quelldateien hinweg verwenden 2.3 Die Zahl der #includes mit Hilfe vorgezogener Klassendeklarationen reduzieren 2.4 Namenskollisionen mit Hilfe von Namensräumen verhindern 2.5 Eine Inline-Datei einbinden 110 112 117 119 121 123 125 132 Zahlen 133 3.1 3.2 3.3 3.4 134 136 140 Einen String in einen numerischen Typ umwandeln Zahlen in Strings umwandeln Herausfinden, ob ein String eine gültige Zahl enthält Fließkommazahlen innerhalb einer beschränkten Genauigkeit vergleichen 3.5 Einen String mit einer Zahl in wissenschaftlicher Notation parsen 3.6 Zahlen zwischen verschiedenen numerischen Typen konvertieren 3.7 Den größten und den kleinsten möglichen Wert eines numerischen Typs bestimmen Strings und Text 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 4.14 143 145 147 150 153 Einen String mit Füllzeichen auffüllen 154 Einen String trimmen 156 Strings als Sequenz ablegen 162 Die Länge eines Strings ermitteln 166 Einen String umkehren 169 Einen String in Teilstrings aufspalten 170 Einen String in Tokens zerlegen 173 Eine Sequenz von Strings zu einem String vereinen 176 Suchen in Strings 178 Das n-te Vorkommen eines Teilstrings ermitteln 182 Einen Teilstring aus einem String entfernen 183 Alle Zeichen eines Strings in Klein-oder Großbuchstaben umwandeln ..185 String-Vergleiche ohne Beachtung von Groß- und Kleinschreibung 188 Einen String ohne Beachtung von Groß- und Kleinschreibung durchsuchen 191 4.15 Tabulatoren,und Leerzeichen in einer Textdatei ineinander konvertieren 193 VI I Inhalt 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 Datumswerte und Uhrzeiten 5.1 5.2 5.3 5.4 5.5 5.6 219 Das aktuelle Datum und die Uhrzeit ermitteln Datum und Uhrzeit als String formatieren Mit Datums- und Uhrzeitwerten rechnen Zwischen Zeitzonen konvertieren Die Tagesnummer in einem bestimmten Jahr ermitteln Typen mit begrenztem Wertebereich definieren 220 222 225 227 228 230 Daten mit Containern verwalten 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 235 Vektoren statt Arrays verwenden Vektoren effizient einsetzen Einen Vektor kopieren Zeiger in einem Vektor speichern Objekte in einer Liste speichern String auf andere Dinge abbilden Gehashte Container nutzen Objekte sortiert abspeichern Container in Containern speichern 236 240 245 247 249 254 260 265 269 Algorithmen 7.1 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 7.10 7.11 272 Über einen Container iterieren Objekte aus einem Container entfernen Daten zufällig mischen Bereiche vergleichen * Daten verschmelzen Einen Bereich sortieren Einen Bereich aufteilen Mengenoperationen mit Sequenzen ausführen Elemente in einer Sequenz transformieren Schreiben Sie Ihren eigenen Algorithmus Einen Bereich in einen Stream ausgeben 273 280 283 285 289 292 295 297 301 303 306 Inhalt I VII 8 9 Klassen 8.1 Datenelemente einer Klasse initialisieren 8.2 Objekte mit einer Funktion erstellen (Fabrikmuster) 8.3 Mit Konstruktoren und Destruktoren Ressourcen verwalten (RAU) 8.4 Einem Container automatisch neue Klasseninstanzen hinzufügen 8.5 Sicherstellen, dass nur eine einzelne Version eines Datenelements existiert 8.6 Den Typ eines Objekts zur Laufzeit ermitteln 8.7 Bestimmen, ob die Klasse eines Objekts eine Unterklasse eines anderen Objekts ist 8.8 Jeder Instanz einer Klasse eine eindeutige Identifizierung geben 8.9 Eine Singleton-Klasse erstellen 8.10 Eine Schnittstelle mit einer abstrakten Basisklasse erstellen 8.11 Ein Klassen-Template schreiben 8.12 Ein Elementfunktions-Template schreiben 8.13 Die Inkrement- und Dekrementoperatoren überladen 8.14 Arithmetische und Zuweisungsoperatoren für ein intuitives Verhalten einer Klasse überladen 8.15 Eine virtuelle Funktion der Superklasse aufrufen 310 311 314 316 319 Ausnahmen und Sicherheit 9.1 Eine Ausnahmeklasse erstellen 9.2 Einen Konstruktor ausnahmefest machen 9.3 Eine Initialisierungsliste ausnahmefest machen 9.4 Elementfunktionen ausnahmefest machen 9.5 Ein Objekt sicher kopieren 356 356 361 364 368 373 10 Streams und Dateien 10.1 Text bei der Ausgabe ausrichten 10.2 Gleitkommawerte formatieren 10.3 Schreiben Sie Ihre eigenen Stream-Manipulatoren 10.4 Eine Klasse in einen Stream schreiben können 10.5 Eine Klasse aus einem Stream lesen können 10.6 Informationen über eine Datei erhalten 10.7 Eine Datei kopieren 10.8 Eine Datei löschen oder umbenennen 10.9 Temporäre Dateinamen und Dateien erstellen 10.10 Ein Verzeichnis erstellen 10.11 Ein Verzeichnis löschen 10.12 Den Inhalt eines Verzeichnisses lesen 10.13 Die Dateierweiterung aus einem String extrahieren 10.14 Einen Dateinamen aus einem kompletten Pfad extrahieren VIII I Inhalt 321 323 325 326 329 331 336 341 344 347 354 378 379 383 386 391 394 396 -. . . 398 402 404 406 408 411 413 415 10.15 Den Pfad aus einem vollständigen Pfad mit Dateinamen ermitteln 10.16 Eine Dateierweiterung ersetzen 10.17 Zwei Pfade in einem einzelnen Pfad zusammenführen 416 418 419 11 Wissenschaft und Mathematik 423 11.1 Die Anzahl der Elemente in einem Container ermitteln 11.2 Den größten oder kleinsten Wert in einem Container finden 11.3 Die Summe und den Durchschnitt der Elemente in einem Container berechnen 11.4 Werte außerhalb eines bestimmten Bereichs ausfiltern 11.5 Varianz, Standardabweichung und andere statistische Funktionen berechnen 11.6 Zufallszahlen erzeugen 11.7 Einen Container mit Zufallszahlen initialisieren 11.8 Einen numerischen Vektor mit dynamischer Größe darstellen 11.9 Einen numerischen Vektor mit fester Größe darstellen 11.10 Ein Skalarprodukt berechnen 11.11 Die Norm eines Vektors berechnen 11.12 Den Abstand zwischen zwei Vektoren berechnen 11.13 Einen Stride-Iterator implementieren 11.14 Eine Matrix mit dynamischer Größe implementieren 11.15 Eine Matrix mit konstanter Größe implementieren 11.16 Matrizen multiplizieren 11.17 Die Fast-Fourier-Transformation berechnen 11.18 Mit Polar-Koordinaten arbeiten 11.19 Berechnungen mit Bitsets durchführen 11.20 Große Integer-Werte mit fester Länge darstellen 11.21 Zahlen mit festen Nachkommastellen implementieren 424 425 429 431 433 436 438 44Q 441 445 446 447 449 452 456 459 461 463 465 469 473 12 Multithreading 12.1 12.2 12.3 12.4 12.5 476 Einen Thread erstellen Eine Ressource thread-sicher machen Einen Thread von einem anderen aus benachrichtigen Gemeinsam genutzte Ressourcen einmal initialisieren Einer Thread-Funktion ein Argument übergeben 477 481 489 493 494 13 Internationalisierung ' 13.1 13.2 13.3 13.4 13.5 497 Einen Unicode-String im Quelltext eingeben Zahlen lesen und schreiben Datumswerte und Uhrzeiten lesen und schreiben Währungsbeträge lesen und schreiben Lokalisierte Strings sortieren 498 499 503 509 514 Inhalt I IX 14 XML 14.1 14.2 14.3 14.4 14.5 14.6 14.7 14.8 14.9 Ein einfaches XML-Dokument parsen Mit Xerces-Strings arbeiten Ein komplexes XML-Dokument parsen Ein XML-Dokument verändern Ein XML-Dokument gegen eine DTD validieren Ein XML-Dokument gegen ein Schema validieren Ein XML-Dokument mit XSLT umwandeln Einen XPath-Ausdruck auswerten Eine Collection von Objekten mit XML speichern und laden 15 Verschiedenes 15.1 15.2 15.3 15.4 15.5 15.6 Index Inhalt Funktionszeiger für Callbacks nutzen Zeiger auf Elemente einer Klasse nutzen Sicherstellen, dass eine Funktion ein Argument nicht verändert Sicherstellen, dass eine Elementfunktion ihr Objekt nicht verändert . . . . Einen Operator schreiben, der keine Elementfunktion ist Eine Sequenz mit kommaseparierten Werten initialisieren 516 517 526 529 540 545 549 553 559 566 572 572 574 577 580 582 584 587