|
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 |
|