Breymann Der C++-Programmierer
5. überarbeitete Auflage 2017
ISBN: 978-3-446-45386-9
Verlag: Hanser, Carl
Format: PDF
Kopierschutz: Adobe DRM (»Systemvoraussetzungen)
C++ lernen – professionell anwenden – Lösungen nutzen.Aktuell zu C++17
E-Book, Deutsch, 1010 Seiten
ISBN: 978-3-446-45386-9
Verlag: Hanser, Carl
Format: PDF
Kopierschutz: Adobe DRM (»Systemvoraussetzungen)
Autoren/Hrsg.
Weitere Infos & Material
1; Inhaltsverzeichnis;6
2;Vorwort;24
3;Teil I: Einführung in C++;28
3.1;1 Es geht los!;30
3.1.1;1.1 Historisches;30
3.1.2;1.2 Objektorientierte Programmierung;31
3.1.3;1.3 Werkzeuge zum Programmieren;33
3.1.4;1.4 Das erste Programm;34
3.1.4.1;1.4.1 Namenskonventionen;40
3.1.5;1.5 Integrierte Entwicklungsumgebung;40
3.1.6;1.6 Einfache Datentypen und Operatoren;43
3.1.6.1;1.6.1 Ausdruck;43
3.1.6.2;1.6.2 Ganze Zahlen;43
3.1.6.3;1.6.3 Reelle Zahlen;50
3.1.6.4;1.6.4 Konstanten;54
3.1.6.5;1.6.5 Zeichen;55
3.1.6.6;1.6.6 Logischer Datentyp bool;59
3.1.6.7;1.6.7 Referenzen;60
3.1.6.8;1.6.8 Regeln zum Bilden von Ausdrücken;61
3.1.6.9;1.6.9 Standard-Typumwandlungen;62
3.1.7;1.7 Gültigkeitsbereich und Sichtbarkeit;63
3.1.7.1;1.7.1 Namespace std;65
3.1.8;1.8 Kontrollstrukturen;66
3.1.8.1;1.8.1 Anweisungen;66
3.1.8.2;1.8.2 Sequenz (Reihung);68
3.1.8.3;1.8.3 Auswahl (Selektion, Verzweigung);68
3.1.8.4;1.8.4 Fallunterscheidungen mit switch;73
3.1.8.5;1.8.5 Wiederholungen;76
3.1.8.6;1.8.6 Kontrolle mit break und continue;83
3.1.9;1.9 Benutzerdefinierte und zusammengesetzte Datentypen;85
3.1.9.1;1.9.1 Aufzählungstypen;85
3.1.9.2;1.9.2 Strukturen;88
3.1.9.3;1.9.3 Der C++-Standardtyp vector;89
3.1.9.4;1.9.4 Zeichenketten: Der C++-Standardtyp string;94
3.1.9.5;1.9.5 Container und Schleifen;96
3.1.9.6;1.9.6 Typermittlung mit auto;98
3.1.9.7;1.9.7 Deklaration einer strukturierten Bindung mit auto;99
3.1.9.8;1.9.8 Unions und Bitfelder;100
3.1.10;1.10 Einfache Ein- und Ausgabe;102
3.1.10.1;1.10.1 Standardein- und -ausgabe;102
3.1.10.2;1.10.2 Ein- und Ausgabe mit Dateien;105
3.2;2 Programmstrukturierung;110
3.2.1;2.1 Funktionen;110
3.2.1.1;2.1.1 Aufbau und Prototypen;111
3.2.1.2;2.1.2 Gültigkeitsbereiche und Sichtbarkeit in Funktionen;113
3.2.1.3;2.1.3 Lokale static-Variable: Funktion mit Gedächtnis;114
3.2.2;2.2 Schnittstellen zum Datentransfer;115
3.2.2.1;2.2.1 Übergabe per Wert;116
3.2.2.2;2.2.2 Übergabe per Referenz;120
3.2.2.3;2.2.3 Gefahren bei der Rückgabe von Referenzen;121
3.2.2.4;2.2.4 Vorgegebene Parameterwerte und unterschiedliche Parameterzahl;122
3.2.2.5;2.2.5 Überladen von Funktionen;123
3.2.2.6;2.2.6 Funktion main();124
3.2.2.7;2.2.7 Beispiel Taschenrechnersimulation;125
3.2.2.8;2.2.8 Spezifikation von Funktionen;130
3.2.2.9;2.2.9 Alternative Funktions-Syntax;130
3.2.3;2.3 Modulare Programmgestaltung;130
3.2.3.1;2.3.1 Steuerung der Übersetzung nur mit #include;131
3.2.3.2;2.3.2 Einbinden vorübersetzter Programmteile;131
3.2.3.3;2.3.3 Übersetzungseinheit, Deklaration, Definition;133
3.2.3.4;2.3.4 Dateiübergreifende Gültigkeit und Sichtbarkeit;135
3.2.3.5;2.3.5 Präprozessordirektiven und Makros;137
3.2.4;2.4 Namensräume;145
3.2.5;2.5 inline-Funktionen und -Variable;147
3.2.5.1;2.5.1 inline-Variablen;148
3.2.6;2.6 constexpr-Funktionen;148
3.2.7;2.7 Rückgabetyp auto;150
3.2.8;2.8 Funktions-Templates;152
3.2.8.1;2.8.1 Spezialisierung von Templates;154
3.2.8.2;2.8.2 Einbinden von Templates;155
3.2.9;2.9 C++-Header;157
3.2.9.1;2.9.1 Einbinden von C-Funktionen;159
3.3;3 Objektorientierung 1;160
3.3.1;3.1 Abstrakter Datentyp;161
3.3.2;3.2 Klassen und Objekte;162
3.3.2.1;3.2.1 const-Objekte und Methoden;165
3.3.2.2;3.2.2 inline-Elementfunktionen;166
3.3.3;3.3 Initialisierung und Konstruktoren;167
3.3.3.1;3.3.1 Standardkonstruktor;167
3.3.3.2;3.3.2 Direkte Initialisierung der Attribute;169
3.3.3.3;3.3.3 Allgemeine Konstruktoren;169
3.3.3.4;3.3.4 Kopierkonstruktor;172
3.3.3.5;3.3.5 Typumwandlungskonstruktor;175
3.3.3.6;3.3.6 Konstruktor und mehr vorgeben oder verbieten;177
3.3.3.7;3.3.7 Einheitliche Initialisierung und Sequenzkonstruktor;177
3.3.3.8;3.3.8 Delegierender Konstruktor;180
3.3.3.9;3.3.9 constexpr-Konstruktor und -Methoden;181
3.3.4;3.4 Beispiel: Rationale Zahlen;184
3.3.4.1;3.4.1 Aufgabenstellung;184
3.3.4.2;3.4.2 Entwurf;185
3.3.4.3;3.4.3 Implementation;188
3.3.5;3.5 Destruktoren;193
3.3.6;3.6 Wie kommt man zu Klassen und Objekten? Ein Beispiel;195
3.3.7;3.7 Gegenseitige Abhängigkeit von Klassen;200
3.4;4 Intermezzo: Zeiger;202
3.4.1;4.1 Zeiger und Adressen;203
3.4.2;4.2 C-Arrays;206
3.4.2.1;4.2.1 C-Array, std::size() und sizeof;208
3.4.2.2;4.2.2 Initialisierung von C-Arrays;209
3.4.2.3;4.2.3 Zeigerarithmetik;209
3.4.2.4;4.2.4 Indexoperator bei C-Arrays;210
3.4.2.5;4.2.5 C-Array mit begin() und end() durchlaufen;210
3.4.3;4.3 C-Zeichenketten;211
3.4.3.1;4.3.1 Schleifen und C-Strings;214
3.4.4;4.4 Dynamische Datenobjekte;218
3.4.4.1;4.4.1 Freigeben dynamischer Objekte;221
3.4.5;4.5 Zeiger und Funktionen;223
3.4.5.1;4.5.1 Parameterübergabe mit Zeigern;223
3.4.5.2;4.5.2 Array als Funktionsparameter;225
3.4.5.3;4.5.3 const und Zeiger-Parameter;226
3.4.5.4;4.5.4 Parameter des main-Programms;226
3.4.5.5;4.5.5 Gefahren bei der Rückgabe von Zeigern;227
3.4.6;4.6 this-Zeiger;228
3.4.7;4.7 Mehrdimensionale C-Arrays;230
3.4.7.1;4.7.1 Statische mehrdimensionale C-Arrays;230
3.4.7.2;4.7.2 Mehrdimensionales Array als Funktionsparameter;231
3.4.7.3;4.7.3 Dynamisch erzeugte mehrdimensionale Arrays;234
3.4.7.4;4.7.4 Klasse für dynamisches zweidimensionales Array;236
3.4.8;4.8 Binäre Ein-/Ausgabe;242
3.4.9;4.9 Zeiger auf Funktionen;245
3.4.10;4.10 Typumwandlungen für Zeiger;249
3.4.11;4.11 Zeiger auf Elementfunktionen und -daten;250
3.4.11.1;4.11.1 Zeiger auf Elementfunktionen;250
3.4.11.2;4.11.2 Zeiger auf Elementdaten;251
3.4.12;4.12 Komplexe Deklarationen lesen;251
3.4.12.1;4.12.1 Lesbarkeit mit typedef und using verbessern;252
3.4.13;4.13 Alternative zu rohen Zeigern, new und delete;254
3.5;5 Objektorientierung 2;256
3.5.1;5.1 Eine String-Klasse;256
3.5.1.1;5.1.1 friend-Funktionen;262
3.5.2;5.2 String-Ansicht;263
3.5.3;5.3 Klassenspezifische Daten und Funktionen;266
3.5.3.1;5.3.1 Klassenspezifische Konstante;270
3.5.4;5.4 Klassen-Templates;272
3.5.4.1;5.4.1 Ein Stack-Template;272
3.5.4.2;5.4.2 Stack mit statisch festgelegter Größe;274
3.5.5;5.5 Typbestimmung mit decltype und declval;276
3.6;6 Vererbung;280
3.6.1;6.1 Vererbung und Initialisierung;286
3.6.2;6.2 Zugriffsschutz;287
3.6.3;6.3 Typbeziehung zwischen Ober- und Unterklasse;289
3.6.4;6.4 Code-Wiederverwendung;290
3.6.4.1;6.4.1 Konstruktor erben;291
3.6.5;6.5 Überschreiben von Funktionen in abgeleiteten Klassen;293
3.6.5.1;6.5.1 Virtuelle Funktionen;295
3.6.5.2;6.5.2 Abstrakte Klassen;300
3.6.5.3;6.5.3 Virtueller Destruktor;305
3.6.5.4;6.5.4 Private virtuelle Funktionen;308
3.6.6;6.6 Probleme der Modellierung mit Vererbung;310
3.6.7;6.7 Mehrfachvererbung;313
3.6.7.1;6.7.1 Namenskonflikte;315
3.6.7.2;6.7.2 Virtuelle Basisklassen;316
3.6.8;6.8 Standard-Typumwandlungsoperatoren;320
3.6.9;6.9 Typinformationen zur Laufzeit;323
3.6.10;6.10 Using-Deklaration für protected-Funktionen;324
3.6.11;6.11 Private- und Protected-Vererbung;325
3.7;7 Fehlerbehandlung;330
3.7.1;7.1 Ausnahmebehandlung;332
3.7.1.1;7.1.1 Exception-Spezifikation in Deklarationen;335
3.7.1.2;7.1.2 Exception-Hierarchie in C++;336
3.7.1.3;7.1.3 Besondere Fehlerbehandlungsfunktionen;338
3.7.1.4;7.1.4 Erkennen logischer Fehler;339
3.7.1.5;7.1.5 Arithmetische Fehler / Division durch 0;341
3.7.2;7.2 Speicherbeschaffung mit new;342
3.7.3;7.3 Exception-Sicherheit;343
3.8;8 Überladen von Operatoren;346
3.8.1;8.1 Rationale Zahlen — noch einmal;348
3.8.1.1;8.1.1 Arithmetische Operatoren;348
3.8.1.2;8.1.2 Ausgabeoperator <<;350
3.8.2;8.2 Eine Klasse für Vektoren;352
3.8.2.1;8.2.1 Index-Operator [ ];355
3.8.2.2;8.2.2 Zuweisungsoperator =;357
3.8.2.3;8.2.3 Mathematische Vektoren;360
3.8.2.4;8.2.4 Multiplikationsoperator;361
3.8.3;8.3 Inkrement-Operator ++;362
3.8.4;8.4 Typumwandlungsoperator;366
3.8.5;8.5 Smart Pointer: Operatoren -> und *;368
3.8.5.1;8.5.1 Smart Pointer und die C++-Standardbibliothek;373
3.8.6;8.6 Objekt als Funktion;374
3.8.7;8.7 new und delete überladen;376
3.8.7.1;8.7.1 Unterscheidung zwischen Heap- und Stack-Objekten;379
3.8.7.2;8.7.2 Fehlende delete-Anweisung entdecken;381
3.8.7.3;8.7.3 Eigene Speicherverwaltung für einen bestimmten Typ;382
3.8.7.4;8.7.4 Empfehlungen im Umgang mit new und delete;386
3.8.8;8.8 Operatoren für Literale;387
3.8.8.1;8.8.1 Stringliterale;388
3.8.8.2;8.8.2 Benutzerdefinierte Literale;389
3.8.9;8.9 Mehrdimensionale Matrizen;391
3.8.9.1;8.9.1 Zweidimensionale Matrix als Vektor von Vektoren;392
3.8.9.2;8.9.2 Dreidimensionale Matrix;395
3.8.10;8.10 Zuweisung und Vergleich bei Vererbung;397
3.9;9 Dateien und Ströme;406
3.9.1;9.1 Ausgabe;408
3.9.1.1;9.1.1 Formatierung der Ausgabe;408
3.9.2;9.2 Eingabe;411
3.9.3;9.3 Manipulatoren;414
3.9.3.1;9.3.1 Eigene Manipulatoren;419
3.9.4;9.4 Fehlerbehandlung;421
3.9.5;9.5 Typumwandlung von Dateiobjekten nach bool;422
3.9.6;9.6 Arbeit mit Dateien;423
3.9.6.1;9.6.1 Positionierung in Dateien;424
3.9.6.2;9.6.2 Lesen und Schreiben in derselben Datei;425
3.9.7;9.7 Umleitung auf Strings;426
3.9.8;9.8 Tabelle formatiert ausgeben;428
3.9.9;9.9 Formatierte Daten lesen;429
3.9.9.1;9.9.1 Eingabe benutzerdefinierter Typen;429
3.9.10;9.10 Blockweise lesen und schreiben;430
3.9.10.1;9.10.1 vector-Objekt binär lesen und schreiben;431
3.9.10.2;9.10.2 array-Objekt binär lesen und schreiben;432
3.9.10.3;9.10.3 Matrix binär lesen und schreiben;433
3.9.11;9.11 Ergänzungen;435
3.10;10 Die Standard Template Library (STL);436
3.10.1;10.1 Container, Iteratoren, Algorithmen;437
3.10.2;10.2 Iteratoren im Detail;442
3.10.3;10.3 Beispiel verkettete Liste;443
4;Teil II: Fortgeschrittene Themen;448
4.1;11 Performance, Wert- und Referenzsemantik;450
4.1.1;11.1 Performanceproblem Wertsemantik;451
4.1.1.1;11.1.1 Auslassen der Kopie;452
4.1.1.2;11.1.2 Temporäre Objekte bei der Zuweisung;453
4.1.2;11.2 Referenzsemantik für R-Werte;454
4.1.3;11.3 Optimierung durch Referenzsemantik für R-Werte;456
4.1.3.1;11.3.1 Bewegender Konstruktor;459
4.1.3.2;11.3.2 Bewegender Zuweisungsoperator;459
4.1.4;11.4 Die move()-Funktion;460
4.1.4.1;11.4.1 Regel zur Template-Auswertung von &&-Parametern;462
4.1.5;11.5 Ein effizienter binärer Plusoperator;463
4.1.5.1;11.5.1 Return Value Optimization (RVO);464
4.1.5.2;11.5.2 Kopien temporärer Objekte eliminieren;464
4.1.5.3;11.5.3 Verbesserung durch verzögerte Auswertung;465
4.1.5.4;11.5.4 Weitere Optimierungsmöglichkeiten;467
4.1.6;11.6 Rule of three/five/zero;468
4.1.6.1;11.6.1 Rule of three;468
4.1.6.2;11.6.2 Rule of five;468
4.1.6.3;11.6.3 Rule of zero;469
4.2;12 Lambda-Funktionen;470
4.2.1;12.1 Eigenschaften;471
4.2.1.1;12.1.1 Äquivalenz zum Funktionszeiger;472
4.2.1.2;12.1.2 Lambda-Funktion und Klasse;473
4.2.2;12.2 Generische Lambda-Funktionen;473
4.2.3;12.3 Parametererfassung mit [];476
4.3;13 Template-Metaprogrammierung;478
4.3.1;13.1 Grundlagen;478
4.3.2;13.2 Variadic Templates: Templates mit variabler Parameterzahl;481
4.3.2.1;13.2.1 Ablauf der Auswertung durch den Compiler;482
4.3.2.2;13.2.2 Anzahl der Parameter;483
4.3.2.3;13.2.3 Parameterexpansion;483
4.3.3;13.3 Fold-Expressions;485
4.3.3.1;13.3.1 Weitere Varianten;486
4.3.3.2;13.3.2 Fold-Expression mit Kommaoperator;487
4.3.4;13.4 Klassen-Template mit variabler Stelligkeit;489
4.4;14 Reguläre Ausdrücke;490
4.4.1;14.1 Elemente regulärer Ausdrücke;491
4.4.1.1;14.1.1 Greedy oder lazy?;493
4.4.2;14.2 Interaktive Auswertung;494
4.4.3;14.3 Auszug des regex-API;497
4.4.4;14.4 Verarbeitung von \n;499
4.4.5;14.5 Anwendungen;500
4.5;15 Threads;502
4.5.1;15.1 Zeit und Dauer;503
4.5.2;15.2 Threads;504
4.5.3;15.3 Die Klasse thread;508
4.5.3.1;15.3.1 Thread-Group;510
4.5.4;15.4 Synchronisation kritischer Abschnitte;511
4.5.5;15.5 Thread-Steuerung: Pausieren, Fortsetzen, Beenden;514
4.5.5.1;15.5.1 Data Race;519
4.5.6;15.6 Warten auf Ereignisse;519
4.5.7;15.7 Reader/Writer-Problem;525
4.5.7.1;15.7.1 Wenn Threads verhungern;529
4.5.7.2;15.7.2 Reader/Writer-Varianten;530
4.5.8;15.8 Atomare Veränderung von Variablen;530
4.5.9;15.9 Asynchrone verteilte Bearbeitung einer Aufgabe;533
4.5.10;15.10 Thread-Sicherheit;535
4.6;16 Grafische Benutzungsschnittstellen;536
4.6.1;16.1 Ereignisgesteuerte Programmierung;537
4.6.2;16.2 GUI-Programmierung mit Qt;538
4.6.2.1;16.2.1 Installation und Einsatz;538
4.6.2.2;16.2.2 Meta-Objektsystem;539
4.6.2.3;16.2.3 Der Programmablauf;540
4.6.2.4;16.2.4 Ereignis abfragen;541
4.6.3;16.3 Signale, Slots und Widgets;542
4.6.4;16.4 Dialog;551
4.6.5;16.5 Qt oder Standard-C++?;554
4.6.5.1;16.5.1 Threads;555
4.6.5.2;16.5.2 Verzeichnisbaum durchwandern;556
4.7;17 Internet-Anbindung;558
4.7.1;17.1 Protokolle;559
4.7.2;17.2 Adressen;559
4.7.3;17.3 Socket;563
4.7.3.1;17.3.1 Bidirektionale Kommunikation;566
4.7.3.2;17.3.2 UDP-Sockets;568
4.7.3.3;17.3.3 Atomuhr mit UDP abfragen;569
4.7.4;17.4 HTTP;572
4.7.4.1;17.4.1 Verbindung mit GET;573
4.7.4.2;17.4.2 Verbindung mit POST;578
4.7.5;17.5 Mini-Webserver;579
4.8;18 Datenbankanbindung;588
4.8.1;18.1 C++-Interface;589
4.8.2;18.2 Anwendungsbeispiel;593
5;Teil III: Ausgewählte Methoden und Werkzeuge der Softwareentwicklung;600
5.1;19 Effiziente Programmerzeugung mit make;602
5.1.1;19.1 Wirkungsweise;604
5.1.2;19.2 Variablen und Muster;606
5.1.3;19.3 Universelles Makefile für einfache Projekte;607
5.1.4;19.4 Automatische Ermittlung von Abhängigkeiten;608
5.1.4.1;19.4.1 Getrennte Verzeichnisse: src, obj, bin;610
5.1.5;19.5 Makefile für Verzeichnisbäume;612
5.1.5.1;19.5.1 Rekursive Make-Aufrufe;613
5.1.5.2;19.5.2 Ein Makefile für alles;615
5.1.6;19.6 Automatische Erzeugung von Makefiles;616
5.1.6.1;19.6.1 Makefile für rekursive Aufrufe erzeugen;617
5.1.7;19.7 Erzeugen von Bibliotheken;618
5.1.7.1;19.7.1 Statische Bibliotheksmodule;618
5.1.7.2;19.7.2 Dynamische Bibliotheksmodule;620
5.1.8;19.8 Code Bloat bei der Instanziierung von Templates vermeiden;623
5.1.8.1;19.8.1 extern-Template;624
5.1.9;19.9 CMake;625
5.1.10;19.10 GNU Autotools;627
5.2;20 Unit-Test;628
5.2.1;20.1 Werkzeuge;629
5.2.2;20.2 Test Driven Development;630
5.2.3;20.3 Boost Unit Test Framework;631
5.2.3.1;20.3.1 Beispiel: Testgetriebene Entwicklung einer Operatorfunktion;633
5.2.3.2;20.3.2 Fixture;637
5.2.3.3;20.3.3 Testprotokoll und Log-Level;638
5.2.3.4;20.3.4 Prüf-Makros;639
5.2.3.5;20.3.5 Kommandozeilen-Optionen;643
6;Teil IV: Das C++-Rezeptbuch: Tipps und Lösungen für typische Aufgaben;644
6.1;21 Sichere Programmentwicklung;646
6.1.1;21.1 Regeln zum Design von Methoden;646
6.1.2;21.2 Defensive Programmierung;648
6.1.2.1;21.2.1 double- und float-Werte richtig vergleichen;649
6.1.2.2;21.2.2 const und constexpr verwenden;650
6.1.2.3;21.2.3 Anweisungen nach for/if/while einklammern;650
6.1.2.4;21.2.4 int und unsigned/size_t nicht mischen;650
6.1.2.5;21.2.5 size_t oder auto statt unsigned int verwenden;651
6.1.2.6;21.2.6 Postfix++ mit Präfix++ implementieren;651
6.1.2.7;21.2.7 Ein Destruktor darf keine Exception werfen;652
6.1.2.8;21.2.8 explicit-Typumwandlungsoperator bevorzugen;652
6.1.2.9;21.2.9 explicit-Konstruktor für eine Typumwandlung bevorzugen;652
6.1.2.10;21.2.10 Leere Standardkonstruktoren vermeiden;652
6.1.2.11;21.2.11 Mit override Schreibfehler reduzieren;652
6.1.2.12;21.2.12 Kopieren und Zuweisung verbieten;652
6.1.2.13;21.2.13 Vererbung verbieten;653
6.1.2.14;21.2.14 Überschreiben einer virtuellen Methode verhindern;654
6.1.2.15;21.2.15 >>Rule of zero<< beachten;654
6.1.2.16;21.2.16 One Definition Rule;654
6.1.2.17;21.2.17 Defensiv Objekte löschen;654
6.1.2.18;21.2.18 Speicherbeschaffung und -freigabe kapseln;655
6.1.2.19;21.2.19 Programmierrichtlinien einhalten;655
6.1.3;21.3 Exception-sichere Beschaffung von Ressourcen;655
6.1.3.1;21.3.1 Sichere Verwendung von unique_ptr und shared_ptr;655
6.1.3.2;21.3.2 So vermeiden Sie new und delete!;656
6.1.3.3;21.3.3 shared_ptr für Arrays korrekt verwenden;657
6.1.3.4;21.3.4 unique_ptr für Arrays korrekt verwenden;658
6.1.3.5;21.3.5 Exception-sichere Funktion;659
6.1.3.6;21.3.6 Exception-sicherer Konstruktor;659
6.1.3.7;21.3.7 Exception-sichere Zuweisung;660
6.1.4;21.4 Empfehlungen zur Thread-Programmierung;661
6.1.4.1;21.4.1 Warten auf die Freigabe von Ressourcen;661
6.1.4.2;21.4.2 Deadlock-Vermeidung;662
6.1.4.3;21.4.3 notify_all oder notify_one?;662
6.1.4.4;21.4.4 Performance mit Threads verbessern?;663
6.2;22 Von der UML nach C++;664
6.2.1;22.1 Vererbung;664
6.2.2;22.2 Interface anbieten und nutzen;665
6.2.3;22.3 Assoziation;667
6.2.3.1;22.3.1 Aggregation;670
6.2.3.2;22.3.2 Komposition;670
6.3;23 Algorithmen für verschiedene Aufgaben;672
6.3.1;23.1 Algorithmen mit Strings;673
6.3.1.1;23.1.1 String splitten;673
6.3.1.2;23.1.2 String in Zahl umwandeln;674
6.3.1.3;23.1.3 Zahl in String umwandeln;676
6.3.1.4;23.1.4 Strings sprachlich richtig sortieren;677
6.3.1.5;23.1.5 Umwandlung in Klein- bzw. Großschreibung;679
6.3.1.6;23.1.6 Strings sprachlich richtig vergleichen;681
6.3.1.7;23.1.7 Von der Groß-/Kleinschreibung unabhängiger Zeichenvergleich;682
6.3.1.8;23.1.8 Von der Groß-/Kleinschreibung unabhängige Suche;683
6.3.2;23.2 Textverarbeitung;684
6.3.2.1;23.2.1 Datei durchsuchen;684
6.3.2.2;23.2.2 Ersetzungen in einer Datei;686
6.3.2.3;23.2.3 Lines of Code (LOC) ermitteln;688
6.3.2.4;23.2.4 Zeilen, Wörter und Zeichen einer Datei zählen;689
6.3.2.5;23.2.5 CSV-Datei lesen;689
6.3.2.6;23.2.6 Kreuzreferenzliste;690
6.3.3;23.3 Operationen auf Folgen;693
6.3.3.1;23.3.1 Container anzeigen;694
6.3.3.2;23.3.2 Folge mit gleichen Werten initialisieren;694
6.3.3.3;23.3.3 Folge mit Werten eines Generators initialisieren;695
6.3.3.4;23.3.4 Folge mit fortlaufenden Werten initialisieren;695
6.3.3.5;23.3.5 Summe und Produkt;696
6.3.3.6;23.3.6 Mittelwert und Standardabweichung;697
6.3.3.7;23.3.7 Skalarprodukt;697
6.3.3.8;23.3.8 Folge der Teilsummen oder -produkte;698
6.3.3.9;23.3.9 Folge der Differenzen;699
6.3.3.10;23.3.10 Kleinstes und größtes Element finden;700
6.3.3.11;23.3.11 Elemente rotieren;702
6.3.3.12;23.3.12 Elemente verwürfeln;703
6.3.3.13;23.3.13 Dubletten entfernen;703
6.3.3.14;23.3.14 Reihenfolge umdrehen;705
6.3.3.15;23.3.15 Stichprobe;706
6.3.3.16;23.3.16 Anzahl der Elemente, die einer Bedingung genügen;707
6.3.3.17;23.3.17 Gilt ein Prädikat für alle, keins oder wenigstens ein Element einer Folge?;708
6.3.3.18;23.3.18 Permutationen;709
6.3.3.19;23.3.19 Lexikografischer Vergleich;712
6.3.4;23.4 Sortieren und Verwandtes;713
6.3.4.1;23.4.1 Partitionieren;713
6.3.4.2;23.4.2 Sortieren;715
6.3.4.3;23.4.3 Stabiles Sortieren;716
6.3.4.4;23.4.4 Partielles Sortieren;717
6.3.4.5;23.4.5 Das n.-größte oder n.-kleinste Element finden;718
6.3.4.6;23.4.6 Verschmelzen (merge);719
6.3.5;23.5 Suchen und Finden;722
6.3.5.1;23.5.1 Element finden;722
6.3.5.2;23.5.2 Element einer Menge in der Folge finden;723
6.3.5.3;23.5.3 Teilfolge finden;724
6.3.5.4;23.5.4 Teilfolge mit speziellem Algorithmus finden;725
6.3.5.5;23.5.5 Bestimmte benachbarte Elemente finden;727
6.3.5.6;23.5.6 Bestimmte aufeinanderfolgende Werte finden;728
6.3.5.7;23.5.7 Binäre Suche;729
6.3.6;23.6 Mengenoperationen auf sortierten Strukturen;731
6.3.6.1;23.6.1 Teilmengenrelation;732
6.3.6.2;23.6.2 Vereinigung;733
6.3.6.3;23.6.3 Schnittmenge;734
6.3.6.4;23.6.4 Differenz;734
6.3.6.5;23.6.5 Symmetrische Differenz;735
6.3.7;23.7 Heap-Algorithmen;736
6.3.7.1;23.7.1 pop_heap;737
6.3.7.2;23.7.2 push_heap;738
6.3.7.3;23.7.3 make_heap;738
6.3.7.4;23.7.4 sort_heap;739
6.3.7.5;23.7.5 is_heap;739
6.3.8;23.8 Vergleich von Containern auch ungleichen Typs;740
6.3.8.1;23.8.1 Unterschiedliche Elemente finden;740
6.3.8.2;23.8.2 Prüfung auf gleiche Inhalte;742
6.3.9;23.9 Rechnen mit komplexen Zahlen: Der C++-Standardtyp complex;743
6.3.10;23.10 Schnelle zweidimensionale Matrix;745
6.3.10.1;23.10.1 Optimierung mathematischer Array-Operationen;748
6.3.11;23.11 Vermischtes;751
6.3.11.1;23.11.1 Erkennung eines Datums;751
6.3.11.2;23.11.2 Erkennung einer IPv4-Adresse;753
6.3.11.3;23.11.3 Erzeugen von Zufallszahlen;754
6.3.11.4;23.11.4 for_each — Auf jedem Element eine Funktion ausführen;759
6.3.11.5;23.11.5 Verschiedene Möglichkeiten, Container-Bereiche zu kopieren;759
6.3.11.6;23.11.6 Vertauschen von Elementen, Bereichen und Containern;762
6.3.11.7;23.11.7 Elemente transformieren;762
6.3.11.8;23.11.8 Ersetzen und Varianten;764
6.3.11.9;23.11.9 Elemente herausfiltern;765
6.3.11.10;23.11.10 Grenzwerte von Zahltypen;767
6.3.11.11;23.11.11 Minimum und Maximum;767
6.3.11.12;23.11.12 Wert begrenzen;769
6.3.11.13;23.11.13 ggT und kgV;770
6.3.12;23.12 Parallelisierbare Algorithmen;771
6.4;24 Datei- und Verzeichnisoperationen;772
6.4.1;24.1 Übersicht;773
6.4.2;24.2 Pfadoperationen;774
6.4.3;24.3 Datei oder Verzeichnis löschen;775
6.4.3.1;24.3.1 Möglicherweise gefülltes Verzeichnis löschen;776
6.4.4;24.4 Datei oder Verzeichnis kopieren;777
6.4.5;24.5 Datei oder Verzeichnis umbenennen;778
6.4.6;24.6 Verzeichnis anlegen;778
6.4.7;24.7 Verzeichnis anzeigen;779
6.4.8;24.8 Verzeichnisbaum anzeigen;780
7;Teil V: Die C++-Standardbibliothek;782
7.1;25 Aufbau und Übersicht;784
7.1.1;25.1 Auslassungen;786
7.1.2;25.2 Beispiele des Buchs und die C++-Standardbibliothek;787
7.2;26 Hilfsfunktionen und -klassen;790
7.2.1;26.1 Relationale Operatoren;790
7.2.2;26.2 Unterstützung der Referenzsemantik für R-Werte;791
7.2.2.1;26.2.1 move();791
7.2.2.2;26.2.2 forward();792
7.2.3;26.3 Paare;793
7.2.4;26.4 Tupel;795
7.2.5;26.5 bitset;797
7.2.6;26.6 Indexfolgen;800
7.2.7;26.7 variant statt union;801
7.2.8;26.8 Funktionsobjekte;802
7.2.8.1;26.8.1 Arithmetische, vergleichende und logische Operationen;802
7.2.8.2;26.8.2 Binden von Argumentwerten;803
7.2.8.3;26.8.3 Funktionen in Objekte umwandeln;805
7.2.9;26.9 Templates für rationale Zahlen;807
7.2.10;26.10 Hüllklasse für Referenzen;808
7.2.11;26.11 Optionale Objekte;809
7.2.12;26.12 Type Traits;811
7.2.12.1;26.12.1 Wie funktionieren Type Traits? — ein Beispiel;812
7.2.12.2;26.12.2 Abfrage von Eigenschaften;814
7.2.12.3;26.12.3 Abfrage numerischer Eigenschaften;816
7.2.12.4;26.12.4 Typbeziehungen;816
7.2.12.5;26.12.5 Typumwandlungen;817
7.2.13;26.13 Auswahl weiterer Traits;817
7.2.13.1;26.13.1 decay;817
7.2.13.2;26.13.2 enable_if;817
7.2.13.3;26.13.3 conditional;818
7.2.13.4;26.13.4 default_order;818
7.3;27 Container;820
7.3.1;27.1 Gemeinsame Eigenschaften;822
7.3.1.1;27.1.1 Initialisierungslisten;824
7.3.1.2;27.1.2 Konstruktion an Ort und Stelle;824
7.3.1.3;27.1.3 Reversible Container;825
7.3.2;27.2 Sequenzen;826
7.3.2.1;27.2.1 vector;827
7.3.2.2;27.2.2 vector