Inhaltsverzeichnis | 6 |
Vorwort | 24 |
Teil I: Einführung in C++ | 28 |
1 Es geht los! | 30 |
1.1 Historisches | 30 |
1.2 Objektorientierte Programmierung | 31 |
1.3 Werkzeuge zum Programmieren | 33 |
1.4 Das erste Programm | 34 |
1.4.1 Namenskonventionen | 40 |
1.5 Integrierte Entwicklungsumgebung | 40 |
1.6 Einfache Datentypen und Operatoren | 43 |
1.6.1 Ausdruck | 43 |
1.6.2 Ganze Zahlen | 43 |
1.6.3 Reelle Zahlen | 50 |
1.6.4 Konstanten | 54 |
1.6.5 Zeichen | 55 |
1.6.6 Logischer Datentyp bool | 59 |
1.6.7 Referenzen | 60 |
1.6.8 Regeln zum Bilden von Ausdrücken | 61 |
1.6.9 Standard-Typumwandlungen | 62 |
1.7 Gültigkeitsbereich und Sichtbarkeit | 63 |
1.7.1 Namespace std | 65 |
1.8 Kontrollstrukturen | 66 |
1.8.1 Anweisungen | 66 |
1.8.2 Sequenz (Reihung) | 68 |
1.8.3 Auswahl (Selektion, Verzweigung) | 68 |
1.8.4 Fallunterscheidungen mit switch | 73 |
1.8.5 Wiederholungen | 76 |
1.8.6 Kontrolle mit break und continue | 83 |
1.9 Benutzerdefinierte und zusammengesetzte Datentypen | 85 |
1.9.1 Aufzählungstypen | 85 |
1.9.2 Strukturen | 88 |
1.9.3 Der C++-Standardtyp vector | 89 |
1.9.4 Zeichenketten: Der C++-Standardtyp string | 94 |
1.9.5 Container und Schleifen | 96 |
1.9.6 Typermittlung mit auto | 98 |
1.9.7 Deklaration einer strukturierten Bindung mit auto | 99 |
1.9.8 Unions und Bitfelder | 100 |
1.10 Einfache Ein- und Ausgabe | 102 |
1.10.1 Standardein- und -ausgabe | 102 |
1.10.2 Ein- und Ausgabe mit Dateien | 105 |
2 Programmstrukturierung | 110 |
2.1 Funktionen | 110 |
2.1.1 Aufbau und Prototypen | 111 |
2.1.2 Gültigkeitsbereiche und Sichtbarkeit in Funktionen | 113 |
2.1.3 Lokale static-Variable: Funktion mit Gedächtnis | 114 |
2.2 Schnittstellen zum Datentransfer | 115 |
2.2.1 Übergabe per Wert | 116 |
2.2.2 Übergabe per Referenz | 120 |
2.2.3 Gefahren bei der Rückgabe von Referenzen | 121 |
2.2.4 Vorgegebene Parameterwerte und unterschiedliche Parameterzahl | 122 |
2.2.5 Überladen von Funktionen | 123 |
2.2.6 Funktion main() | 124 |
2.2.7 Beispiel Taschenrechnersimulation | 125 |
2.2.8 Spezifikation von Funktionen | 130 |
2.2.9 Alternative Funktions-Syntax | 130 |
2.3 Modulare Programmgestaltung | 130 |
2.3.1 Steuerung der Übersetzung nur mit #include | 131 |
2.3.2 Einbinden vorübersetzter Programmteile | 131 |
2.3.3 Übersetzungseinheit, Deklaration, Definition | 133 |
2.3.4 Dateiübergreifende Gültigkeit und Sichtbarkeit | 135 |
2.3.5 Präprozessordirektiven und Makros | 137 |
2.4 Namensräume | 145 |
2.5 inline-Funktionen und -Variable | 147 |
2.5.1 inline-Variablen | 148 |
2.6 constexpr-Funktionen | 148 |
2.7 Rückgabetyp auto | 150 |
2.8 Funktions-Templates | 152 |
2.8.1 Spezialisierung von Templates | 154 |
2.8.2 Einbinden von Templates | 155 |
2.9 C++-Header | 157 |
2.9.1 Einbinden von C-Funktionen | 159 |
3 Objektorientierung 1 | 160 |
3.1 Abstrakter Datentyp | 161 |
3.2 Klassen und Objekte | 162 |
3.2.1 const-Objekte und Methoden | 165 |
3.2.2 inline-Elementfunktionen | 166 |
3.3 Initialisierung und Konstruktoren | 167 |
3.3.1 Standardkonstruktor | 167 |
3.3.2 Direkte Initialisierung der Attribute | 169 |
3.3.3 Allgemeine Konstruktoren | 169 |
3.3.4 Kopierkonstruktor | 172 |
3.3.5 Typumwandlungskonstruktor | 175 |
3.3.6 Konstruktor und mehr vorgeben oder verbieten | 177 |
3.3.7 Einheitliche Initialisierung und Sequenzkonstruktor | 177 |
3.3.8 Delegierender Konstruktor | 180 |
3.3.9 constexpr-Konstruktor und -Methoden | 181 |
3.4 Beispiel: Rationale Zahlen | 184 |
3.4.1 Aufgabenstellung | 184 |
3.4.2 Entwurf | 185 |
3.4.3 Implementation | 188 |
3.5 Destruktoren | 193 |
3.6 Wie kommt man zu Klassen und Objekten? Ein Beispiel | 195 |
3.7 Gegenseitige Abhängigkeit von Klassen | 200 |
4 Intermezzo: Zeiger | 202 |
4.1 Zeiger und Adressen | 203 |
4.2 C-Arrays | 206 |
4.2.1 C-Array, std::size() und sizeof | 208 |
4.2.2 Initialisierung von C-Arrays | 209 |
4.2.3 Zeigerarithmetik | 209 |
4.2.4 Indexoperator bei C-Arrays | 210 |
4.2.5 C-Array mit begin() und end() durchlaufen | 210 |
4.3 C-Zeichenketten | 211 |
4.3.1 Schleifen und C-Strings | 214 |
4.4 Dynamische Datenobjekte | 218 |
4.4.1 Freigeben dynamischer Objekte | 221 |
4.5 Zeiger und Funktionen | 223 |
4.5.1 Parameterübergabe mit Zeigern | 223 |
4.5.2 Array als Funktionsparameter | 225 |
4.5.3 const und Zeiger-Parameter | 226 |
4.5.4 Parameter des main-Programms | 226 |
4.5.5 Gefahren bei der Rückgabe von Zeigern | 227 |
4.6 this-Zeiger | 228 |
4.7 Mehrdimensionale C-Arrays | 230 |
4.7.1 Statische mehrdimensionale C-Arrays | 230 |
4.7.2 Mehrdimensionales Array als Funktionsparameter | 231 |
4.7.3 Dynamisch erzeugte mehrdimensionale Arrays | 234 |
4.7.4 Klasse für dynamisches zweidimensionales Array | 236 |
4.8 Binäre Ein-/Ausgabe | 242 |
4.9 Zeiger auf Funktionen | 245 |
4.10 Typumwandlungen für Zeiger | 249 |
4.11 Zeiger auf Elementfunktionen und -daten | 250 |
4.11.1 Zeiger auf Elementfunktionen | 250 |
4.11.2 Zeiger auf Elementdaten | 251 |
4.12 Komplexe Deklarationen lesen | 251 |
4.12.1 Lesbarkeit mit typedef und using verbessern | 252 |
4.13 Alternative zu rohen Zeigern, new und delete | 254 |
5 Objektorientierung 2 | 256 |
5.1 Eine String-Klasse | 256 |
5.1.1 friend-Funktionen | 262 |
5.2 String-Ansicht | 263 |
5.3 Klassenspezifische Daten und Funktionen | 266 |
5.3.1 Klassenspezifische Konstante | 270 |
5.4 Klassen-Templates | 272 |
5.4.1 Ein Stack-Template | 272 |
5.4.2 Stack mit statisch festgelegter Größe | 274 |
5.5 Typbestimmung mit decltype und declval | 276 |
6 Vererbung | 280 |
6.1 Vererbung und Initialisierung | 286 |
6.2 Zugriffsschutz | 287 |
6.3 Typbeziehung zwischen Ober- und Unterklasse | 289 |
6.4 Code-Wiederverwendung | 290 |
6.4.1 Konstruktor erben | 291 |
6.5 Überschreiben von Funktionen in abgeleiteten Klassen | 293 |
6.5.1 Virtuelle Funktionen | 295 |
6.5.2 Abstrakte Klassen | 300 |
6.5.3 Virtueller Destruktor | 305 |
6.5.4 Private virtuelle Funktionen | 308 |
6.6 Probleme der Modellierung mit Vererbung | 310 |
6.7 Mehrfachvererbung | 313 |
6.7.1 Namenskonflikte | 315 |
6.7.2 Virtuelle Basisklassen | 316 |
6.8 Standard-Typumwandlungsoperatoren | 320 |
6.9 Typinformationen zur Laufzeit | 323 |
6.10 Using-Deklaration für protected-Funktionen | 324 |
6.11 Private- und Protected-Vererbung | 325 |
7 Fehlerbehandlung | 330 |
7.1 Ausnahmebehandlung | 332 |
7.1.1 Exception-Spezifikation in Deklarationen | 335 |
7.1.2 Exception-Hierarchie in C++ | 336 |
7.1.3 Besondere Fehlerbehandlungsfunktionen | 338 |
7.1.4 Erkennen logischer Fehler | 339 |
7.1.5 Arithmetische Fehler / Division durch 0 | 341 |
7.2 Speicherbeschaffung mit new | 342 |
7.3 Exception-Sicherheit | 343 |
8 Überladen von Operatoren | 346 |
8.1 Rationale Zahlen — noch einmal | 348 |
8.1.1 Arithmetische Operatoren | 348 |
8.1.2 Ausgabeoperator << | 350 |
8.2 Eine Klasse für Vektoren | 352 |
8.2.1 Index-Operator [ ] | 355 |
8.2.2 Zuweisungsoperator = | 357 |
8.2.3 Mathematische Vektoren | 360 |
8.2.4 Multiplikationsoperator | 361 |
8.3 Inkrement-Operator ++ | 362 |
8.4 Typumwandlungsoperator | 366 |
8.5 Smart Pointer: Operatoren -> und * | 368 |
8.5.1 Smart Pointer und die C++-Standardbibliothek | 373 |
8.6 Objekt als Funktion | 374 |
8.7 new und delete überladen | 376 |
8.7.1 Unterscheidung zwischen Heap- und Stack-Objekten | 379 |
8.7.2 Fehlende delete-Anweisung entdecken | 381 |
8.7.3 Eigene Speicherverwaltung für einen bestimmten Typ | 382 |
8.7.4 Empfehlungen im Umgang mit new und delete | 386 |
8.8 Operatoren für Literale | 387 |
8.8.1 Stringliterale | 388 |
8.8.2 Benutzerdefinierte Literale | 389 |
8.9 Mehrdimensionale Matrizen | 391 |
8.9.1 Zweidimensionale Matrix als Vektor von Vektoren | 392 |
8.9.2 Dreidimensionale Matrix | 395 |
8.10 Zuweisung und Vergleich bei Vererbung | 397 |
9 Dateien und Ströme | 406 |
9.1 Ausgabe | 408 |
9.1.1 Formatierung der Ausgabe | 408 |
9.2 Eingabe | 411 |
9.3 Manipulatoren | 414 |
9.3.1 Eigene Manipulatoren | 419 |
9.4 Fehlerbehandlung | 421 |
9.5 Typumwandlung von Dateiobjekten nach bool | 422 |
9.6 Arbeit mit Dateien | 423 |
9.6.1 Positionierung in Dateien | 424 |
9.6.2 Lesen und Schreiben in derselben Datei | 425 |
9.7 Umleitung auf Strings | 426 |
9.8 Tabelle formatiert ausgeben | 428 |
9.9 Formatierte Daten lesen | 429 |
9.9.1 Eingabe benutzerdefinierter Typen | 429 |
9.10 Blockweise lesen und schreiben | 430 |
9.10.1 vector-Objekt binär lesen und schreiben | 431 |
9.10.2 array-Objekt binär lesen und schreiben | 432 |
9.10.3 Matrix binär lesen und schreiben | 433 |
9.11 Ergänzungen | 435 |
10 Die Standard Template Library (STL) | 436 |
10.1 Container, Iteratoren, Algorithmen | 437 |
10.2 Iteratoren im Detail | 442 |
10.3 Beispiel verkettete Liste | 443 |
Teil II: Fortgeschrittene Themen | 448 |
11 Performance, Wert- und Referenzsemantik | 450 |
11.1 Performanceproblem Wertsemantik | 451 |
11.1.1 Auslassen der Kopie | 452 |
11.1.2 Temporäre Objekte bei der Zuweisung | 453 |
11.2 Referenzsemantik für R-Werte | 454 |
11.3 Optimierung durch Referenzsemantik für R-Werte | 456 |
11.3.1 Bewegender Konstruktor | 459 |
11.3.2 Bewegender Zuweisungsoperator | 459 |
11.4 Die move()-Funktion | 460 |
11.4.1 Regel zur Template-Auswertung von &&-Parametern | 462 |
11.5 Ein effizienter binärer Plusoperator | 463 |
11.5.1 Return Value Optimization (RVO) | 464 |
11.5.2 Kopien temporärer Objekte eliminieren | 464 |
11.5.3 Verbesserung durch verzögerte Auswertung | 465 |
11.5.4 Weitere Optimierungsmöglichkeiten | 467 |
11.6 Rule of three/five/zero | 468 |
11.6.1 Rule of three | 468 |
11.6.2 Rule of five | 468 |
11.6.3 Rule of zero | 469 |
12 Lambda-Funktionen | 470 |
12.1 Eigenschaften | 471 |
12.1.1 Äquivalenz zum Funktionszeiger | 472 |
12.1.2 Lambda-Funktion und Klasse | 473 |
12.2 Generische Lambda-Funktionen | 473 |
12.3 Parametererfassung mit [] | 476 |
13 Template-Metaprogrammierung | 478 |
13.1 Grundlagen | 478 |
13.2 Variadic Templates: Templates mit variabler Parameterzahl | 481 |
13.2.1 Ablauf der Auswertung durch den Compiler | 482 |
13.2.2 Anzahl der Parameter | 483 |
13.2.3 Parameterexpansion | 483 |
13.3 Fold-Expressions | 485 |
13.3.1 Weitere Varianten | 486 |
13.3.2 Fold-Expression mit Kommaoperator | 487 |
13.4 Klassen-Template mit variabler Stelligkeit | 489 |
14 Reguläre Ausdrücke | 490 |
14.1 Elemente regulärer Ausdrücke | 491 |
14.1.1 Greedy oder lazy? | 493 |
14.2 Interaktive Auswertung | 494 |
14.3 Auszug des regex-API | 497 |
14.4 Verarbeitung von \n | 499 |
14.5 Anwendungen | 500 |
15 Threads | 502 |
15.1 Zeit und Dauer | 503 |
15.2 Threads | 504 |
15.3 Die Klasse thread | 508 |
15.3.1 Thread-Group | 510 |
15.4 Synchronisation kritischer Abschnitte | 511 |
15.5 Thread-Steuerung: Pausieren, Fortsetzen, Beenden | 514 |
15.5.1 Data Race | 519 |
15.6 Warten auf Ereignisse | 519 |
15.7 Reader/Writer-Problem | 525 |
15.7.1 Wenn Threads verhungern | 529 |
15.7.2 Reader/Writer-Varianten | 530 |
15.8 Atomare Veränderung von Variablen | 530 |
15.9 Asynchrone verteilte Bearbeitung einer Aufgabe | 533 |
15.10 Thread-Sicherheit | 535 |
16 Grafische Benutzungsschnittstellen | 536 |
16.1 Ereignisgesteuerte Programmierung | 537 |
16.2 GUI-Programmierung mit Qt | 538 |
16.2.1 Installation und Einsatz | 538 |
16.2.2 Meta-Objektsystem | 539 |
16.2.3 Der Programmablauf | 540 |
16.2.4 Ereignis abfragen | 541 |
16.3 Signale, Slots und Widgets | 542 |
16.4 Dialog | 551 |
16.5 Qt oder Standard-C++? | 554 |
16.5.1 Threads | 555 |
16.5.2 Verzeichnisbaum durchwandern | 556 |
17 Internet-Anbindung | 558 |
17.1 Protokolle | 559 |
17.2 Adressen | 559 |
17.3 Socket | 563 |
17.3.1 Bidirektionale Kommunikation | 566 |
17.3.2 UDP-Sockets | 568 |
17.3.3 Atomuhr mit UDP abfragen | 569 |
17.4 HTTP | 572 |
17.4.1 Verbindung mit GET | 573 |
17.4.2 Verbindung mit POST | 578 |
17.5 Mini-Webserver | 579 |
18 Datenbankanbindung | 588 |
18.1 C++-Interface | 589 |
18.2 Anwendungsbeispiel | 593 |
Teil III: Ausgewählte Methoden und Werkzeuge der Softwareentwicklung | 600 |
19 Effiziente Programmerzeugung mit make | 602 |
19.1 Wirkungsweise | 604 |
19.2 Variablen und Muster | 606 |
19.3 Universelles Makefile für einfache Projekte | 607 |
19.4 Automatische Ermittlung von Abhängigkeiten | 608 |
19.4.1 Getrennte Verzeichnisse: src, obj, bin | 610 |
19.5 Makefile für Verzeichnisbäume | 612 |
19.5.1 Rekursive Make-Aufrufe | 613 |
19.5.2 Ein Makefile für alles | 615 |
19.6 Automatische Erzeugung von Makefiles | 616 |
19.6.1 Makefile für rekursive Aufrufe erzeugen | 617 |
19.7 Erzeugen von Bibliotheken | 618 |
19.7.1 Statische Bibliotheksmodule | 618 |
19.7.2 Dynamische Bibliotheksmodule | 620 |
19.8 Code Bloat bei der Instanziierung von Templates vermeiden | 623 |
19.8.1 extern-Template | 624 |
19.9 CMake | 625 |
19.10 GNU Autotools | 627 |
20 Unit-Test | 628 |
20.1 Werkzeuge | 629 |
20.2 Test Driven Development | 630 |
20.3 Boost Unit Test Framework | 631 |
20.3.1 Beispiel: Testgetriebene Entwicklung einer Operatorfunktion | 633 |
20.3.2 Fixture | 637 |
20.3.3 Testprotokoll und Log-Level | 638 |
20.3.4 Prüf-Makros | 639 |
20.3.5 Kommandozeilen-Optionen | 643 |
Teil IV: Das C++-Rezeptbuch: Tipps und Lösungen für typische Aufgaben | 644 |
21 Sichere Programmentwicklung | 646 |
21.1 Regeln zum Design von Methoden | 646 |
21.2 Defensive Programmierung | 648 |
21.2.1 double- und float-Werte richtig vergleichen | 649 |
21.2.2 const und constexpr verwenden | 650 |
21.2.3 Anweisungen nach for/if/while einklammern | 650 |
21.2.4 int und unsigned/size_t nicht mischen | 650 |
21.2.5 size_t oder auto statt unsigned int verwenden | 651 |
21.2.6 Postfix++ mit Präfix++ implementieren | 651 |
21.2.7 Ein Destruktor darf keine Exception werfen | 652 |
21.2.8 explicit-Typumwandlungsoperator bevorzugen | 652 |
21.2.9 explicit-Konstruktor für eine Typumwandlung bevorzugen | 652 |
21.2.10 Leere Standardkonstruktoren vermeiden | 652 |
21.2.11 Mit override Schreibfehler reduzieren | 652 |
21.2.12 Kopieren und Zuweisung verbieten | 652 |
21.2.13 Vererbung verbieten | 653 |
21.2.14 Überschreiben einer virtuellen Methode verhindern | 654 |
21.2.15 >>Rule of zero<< beachten | 654 |
21.2.16 One Definition Rule | 654 |
21.2.17 Defensiv Objekte löschen | 654 |
21.2.18 Speicherbeschaffung und -freigabe kapseln | 655 |
21.2.19 Programmierrichtlinien einhalten | 655 |
21.3 Exception-sichere Beschaffung von Ressourcen | 655 |
21.3.1 Sichere Verwendung von unique_ptr und shared_ptr | 655 |
21.3.2 So vermeiden Sie new und delete! | 656 |
21.3.3 shared_ptr für Arrays korrekt verwenden | 657 |
21.3.4 unique_ptr für Arrays korrekt verwenden | 658 |
21.3.5 Exception-sichere Funktion | 659 |
21.3.6 Exception-sicherer Konstruktor | 659 |
21.3.7 Exception-sichere Zuweisung | 660 |
21.4 Empfehlungen zur Thread-Programmierung | 661 |
21.4.1 Warten auf die Freigabe von Ressourcen | 661 |
21.4.2 Deadlock-Vermeidung | 662 |
21.4.3 notify_all oder notify_one? | 662 |
21.4.4 Performance mit Threads verbessern? | 663 |
22 Von der UML nach C++ | 664 |
22.1 Vererbung | 664 |
22.2 Interface anbieten und nutzen | 665 |
22.3 Assoziation | 667 |
22.3.1 Aggregation | 670 |
22.3.2 Komposition | 670 |
23 Algorithmen für verschiedene Aufgaben | 672 |
23.1 Algorithmen mit Strings | 673 |
23.1.1 String splitten | 673 |
23.1.2 String in Zahl umwandeln | 674 |
23.1.3 Zahl in String umwandeln | 676 |
23.1.4 Strings sprachlich richtig sortieren | 677 |
23.1.5 Umwandlung in Klein- bzw. Großschreibung | 679 |
23.1.6 Strings sprachlich richtig vergleichen | 681 |
23.1.7 Von der Groß-/Kleinschreibung unabhängiger Zeichenvergleich | 682 |
23.1.8 Von der Groß-/Kleinschreibung unabhängige Suche | 683 |
23.2 Textverarbeitung | 684 |
23.2.1 Datei durchsuchen | 684 |
23.2.2 Ersetzungen in einer Datei | 686 |
23.2.3 Lines of Code (LOC) ermitteln | 688 |
23.2.4 Zeilen, Wörter und Zeichen einer Datei zählen | 689 |
23.2.5 CSV-Datei lesen | 689 |
23.2.6 Kreuzreferenzliste | 690 |
23.3 Operationen auf Folgen | 693 |
23.3.1 Container anzeigen | 694 |
23.3.2 Folge mit gleichen Werten initialisieren | 694 |
23.3.3 Folge mit Werten eines Generators initialisieren | 695 |
23.3.4 Folge mit fortlaufenden Werten initialisieren | 695 |
23.3.5 Summe und Produkt | 696 |
23.3.6 Mittelwert und Standardabweichung | 697 |
23.3.7 Skalarprodukt | 697 |
23.3.8 Folge der Teilsummen oder -produkte | 698 |
23.3.9 Folge der Differenzen | 699 |
23.3.10 Kleinstes und größtes Element finden | 700 |
23.3.11 Elemente rotieren | 702 |
23.3.12 Elemente verwürfeln | 703 |
23.3.13 Dubletten entfernen | 703 |
23.3.14 Reihenfolge umdrehen | 705 |
23.3.15 Stichprobe | 706 |
23.3.16 Anzahl der Elemente, die einer Bedingung genügen | 707 |
23.3.17 Gilt ein Prädikat für alle, keins oder wenigstens ein Element einer Folge? | 708 |
23.3.18 Permutationen | 709 |
23.3.19 Lexikografischer Vergleich | 712 |
23.4 Sortieren und Verwandtes | 713 |
23.4.1 Partitionieren | 713 |
23.4.2 Sortieren | 715 |
23.4.3 Stabiles Sortieren | 716 |
23.4.4 Partielles Sortieren | 717 |
23.4.5 Das n.-größte oder n.-kleinste Element finden | 718 |
23.4.6 Verschmelzen (merge) | 719 |
23.5 Suchen und Finden | 722 |
23.5.1 Element finden | 722 |
23.5.2 Element einer Menge in der Folge finden | 723 |
23.5.3 Teilfolge finden | 724 |
23.5.4 Teilfolge mit speziellem Algorithmus finden | 725 |
23.5.5 Bestimmte benachbarte Elemente finden | 727 |
23.5.6 Bestimmte aufeinanderfolgende Werte finden | 728 |
23.5.7 Binäre Suche | 729 |
23.6 Mengenoperationen auf sortierten Strukturen | 731 |
23.6.1 Teilmengenrelation | 732 |
23.6.2 Vereinigung | 733 |
23.6.3 Schnittmenge | 734 |
23.6.4 Differenz | 734 |
23.6.5 Symmetrische Differenz | 735 |
23.7 Heap-Algorithmen | 736 |
23.7.1 pop_heap | 737 |
23.7.2 push_heap | 738 |
23.7.3 make_heap | 738 |
23.7.4 sort_heap | 739 |
23.7.5 is_heap | 739 |
23.8 Vergleich von Containern auch ungleichen Typs | 740 |
23.8.1 Unterschiedliche Elemente finden | 740 |
23.8.2 Prüfung auf gleiche Inhalte | 742 |
23.9 Rechnen mit komplexen Zahlen: Der C++-Standardtyp complex | 743 |
23.10 Schnelle zweidimensionale Matrix | 745 |
23.10.1 Optimierung mathematischer Array-Operationen | 748 |
23.11 Vermischtes | 751 |
23.11.1 Erkennung eines Datums | 751 |
23.11.2 Erkennung einer IPv4-Adresse | 753 |
23.11.3 Erzeugen von Zufallszahlen | 754 |
23.11.4 for_each — Auf jedem Element eine Funktion ausführen | 759 |
23.11.5 Verschiedene Möglichkeiten, Container-Bereiche zu kopieren | 759 |
23.11.6 Vertauschen von Elementen, Bereichen und Containern | 762 |
23.11.7 Elemente transformieren | 762 |
23.11.8 Ersetzen und Varianten | 764 |
23.11.9 Elemente herausfiltern | 765 |
23.11.10 Grenzwerte von Zahltypen | 767 |
23.11.11 Minimum und Maximum | 767 |
23.11.12 Wert begrenzen | 769 |
23.11.13 ggT und kgV | 770 |
23.12 Parallelisierbare Algorithmen | 771 |
24 Datei- und Verzeichnisoperationen | 772 |
24.1 Übersicht | 773 |
24.2 Pfadoperationen | 774 |
24.3 Datei oder Verzeichnis löschen | 775 |
24.3.1 Möglicherweise gefülltes Verzeichnis löschen | 776 |
24.4 Datei oder Verzeichnis kopieren | 777 |
24.5 Datei oder Verzeichnis umbenennen | 778 |
24.6 Verzeichnis anlegen | 778 |
24.7 Verzeichnis anzeigen | 779 |
24.8 Verzeichnisbaum anzeigen | 780 |
Teil V: Die C++-Standardbibliothek | 782 |
25 Aufbau und Übersicht | 784 |
25.1 Auslassungen | 786 |
25.2 Beispiele des Buchs und die C++-Standardbibliothek | 787 |
26 Hilfsfunktionen und -klassen | 790 |
26.1 Relationale Operatoren | 790 |
26.2 Unterstützung der Referenzsemantik für R-Werte | 791 |
26.2.1 move() | 791 |
26.2.2 forward() | 792 |
26.3 Paare | 793 |
26.4 Tupel | 795 |
26.5 bitset | 797 |
26.6 Indexfolgen | 800 |
26.7 variant statt union | 801 |
26.8 Funktionsobjekte | 802 |
26.8.1 Arithmetische, vergleichende und logische Operationen | 802 |
26.8.2 Binden von Argumentwerten | 803 |
26.8.3 Funktionen in Objekte umwandeln | 805 |
26.9 Templates für rationale Zahlen | 807 |
26.10 Hüllklasse für Referenzen | 808 |
26.11 Optionale Objekte | 809 |
26.12 Type Traits | 811 |
26.12.1 Wie funktionieren Type Traits? — ein Beispiel | 812 |
26.12.2 Abfrage von Eigenschaften | 814 |
26.12.3 Abfrage numerischer Eigenschaften | 816 |
26.12.4 Typbeziehungen | 816 |
26.12.5 Typumwandlungen | 817 |
26.13 Auswahl weiterer Traits | 817 |
26.13.1 decay | 817 |
26.13.2 enable_if | 817 |
26.13.3 conditional | 818 |
26.13.4 default_order | 818 |
27 Container | 820 |
27.1 Gemeinsame Eigenschaften | 822 |
27.1.1 Initialisierungslisten | 824 |
27.1.2 Konstruktion an Ort und Stelle | 824 |
27.1.3 Reversible Container | 825 |
27.2 Sequenzen | 826 |
27.2.1 vector | 827 |
27.2.2 vector | 828 |
27.2.3 list | 829 |
27.2.4 deque | 832 |
27.2.5 stack | 833 |
27.2.6 queue | 835 |
27.2.7 priority_queue | 837 |
27.2.8 array | 839 |
27.3 Assoziative Container | 841 |
27.4 Sortierte assoziative Container | 843 |
27.4.1 map und multimap | 844 |
27.4.2 set und multiset | 848 |
27.5 Hash-Container | 850 |
27.5.1 unordered_map und unordered_multimap | 854 |
27.5.2 unordered_set und unordered_multiset | 856 |
28 Iteratoren | 858 |
28.1 Iterator-Kategorien | 859 |
28.1.1 Anwendung von Traits | 860 |
28.2 Abstand und Bewegen | 863 |
28.3 Zugriff auf Anfang und Ende | 864 |
28.3.1 Reverse-Iteratoren | 865 |
28.4 Insert-Iteratoren | 866 |
28.5 Stream-Iteratoren | 867 |
29 Algorithmen | 870 |
29.1 Algorithmen mit Prädikat | 871 |
29.2 Übersicht | 872 |
30 Nationale Besonderheiten | 876 |
30.1 Sprachumgebung festlegen und ändern | 876 |
30.1.1 Die locale-Funktionen | 878 |
30.2 Zeichensätze und -codierung | 880 |
30.3 Zeichenklassifizierung und -umwandlung | 884 |
30.4 Kategorien | 885 |
30.4.1 collate | 885 |
30.4.2 ctype | 886 |
30.4.3 numeric | 888 |
30.4.4 monetary | 889 |
30.4.5 time | 892 |
30.4.6 messages | 894 |
30.5 Konstruktion eigener Facetten | 896 |
31 String | 898 |
31.1 string_view für String-Literale | 908 |
32 Speichermanagement | 910 |
32.1 unique_ptr | 910 |
32.1.1 make_unique | 912 |
32.2 shared_ptr | 913 |
32.2.1 make_shared | 914 |
32.2.2 Typumwandlung in einen Oberklassentyp | 914 |
32.3 weak_ptr | 915 |
32.4 new mit Speicherortangabe | 916 |
33 Numerische Arrays (valarray) | 918 |
33.1 Konstruktoren | 919 |
33.2 Elementfunktionen | 919 |
33.3 Binäre Valarray-Operatoren | 922 |
33.4 Mathematische Funktionen | 924 |
33.5 slice und slice_array | 925 |
33.6 gslice und gslice_array | 928 |
33.7 mask_array | 931 |
33.8 indirect_array | 932 |
34 Ausgewählte C-Header | 934 |
34.1 | 934 |
34.2 | 935 |
34.3 | 935 |
34.4 | 937 |
34.5 | 937 |
34.6 | 938 |
34.7 | 940 |
A Anhang | 942 |
A.1 ASCII-Tabelle | 942 |
A.2 C++-Schlüsselwörter | 944 |
A.3 Compilerbefehle | 945 |
A.4 Rangfolge der Operatoren | 946 |
A.5 C++-Attribute für den Compiler | 947 |
A.6 Lösungen zu den Übungsaufgaben | 948 |
A.7 Installation der Software für Windows | 958 |
A.7.1 Installation des Compilers und der Entwicklungsumgebung | 958 |
A.7.2 Integrierte Entwicklungsumgebung einrichten | 959 |
A.7.3 De-Installation | 959 |
A.8 Installation der Software für Linux | 960 |
A.8.1 Installation des Compilers | 960 |
A.8.2 Installation von Boost | 961 |
A.8.3 Installation und Einrichtung von Code::Blocks | 961 |
A.8.4 Beispieldateien entpacken | 962 |
A.9 Installationshinweise für OS X | 962 |
A.9.1 Installation von Boost | 962 |
A.9.2 Beispieldateien entpacken | 963 |
Glossar | 964 |
Literaturverzeichnis | 974 |
Register | 978 |
1001_1008_Breymann_5A_Anzeigen.pdf | 1 |
CHV_Anz_Seite1001_Gloger_44723 | 1002 |
CHV_Anz_Seite1001_Gloger_44723 | 1003 |
CHV_Anz_Seite1003_Leopold_44343 | 1004 |
CHV_Anz_Seite1003_Leopold_44343 | 1005 |
CHV_Anz_Seite1005_FreundRücker_5A_45054 | 1006 |
CHV_Anz_Seite1005_FreundRücker_5A_45054 | 1007 |
CHV_Anz_Seite1007_Starke_7A_44361 | 1008 |
CHV_Anz_Seite1007_Starke_7A_44361 | 1009 |