STL-Übersicht & Philosophie
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy. Lektion 70 von 104.
Die Standard Template Library (STL) ist eine Sammlung von klassen- und funktionsbasierten Vorlagen, die gängige Datenstrukturen und Algorithmen bereitstellt. Die STL basiert auf den Vorlagenkonzepten, die du kennengelernt hast, und verkörpert eine leistungsstarke Designphilosophie: die Datenspeicherung von der Datenverarbeitung zu trennen.
Die STL ist um drei zentrale Komponenten organisiert, die zusammenarbeiten:
| Komponente | Zweck | Beispiele |
|---|---|---|
| Container | Sammlungen von Objekten speichern | vector, map, set |
| Iteratoren | Zugriff auf Elemente von Containern bereitstellen | Eingabe, Ausgabe, wahlfreier Zugriff |
| Algorithmen | Operationen auf Daten ausführen | sort, find, transform |
Die zentrale Erkenntnis ist, dass Algorithmen Container nicht direkt kennen – sie arbeiten über Iteratoren. Das bedeutet, dass ein einzelner sort-Algorithmus mit Vektoren, Arrays und jedem Container funktioniert, der den passenden Iteratortyp bereitstellt:
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> nums = {5, 2, 8, 1, 9};
std::sort(nums.begin(), nums.end());
for (int n : nums) {
std::cout << n << " ";
}
// Ausgabe: 1 2 5 8 9
}Diese Trennung bedeutet, dass du beliebig kombinieren kannst – verwende jeden Algorithmus mit jedem kompatiblen Container, ohne neuen Code schreiben zu müssen. Die STL stellt gründlich erprobte, optimierte Implementierungen bereit, sodass du dich auf das Lösen von Problemen konzentrieren kannst, anstatt gängige Datenstrukturen neu zu erfinden.
Aufgabe
EinfachErstellen wir ein einfaches Datenverarbeitungssystem, das die Designphilosophie der STL veranschaulicht: die Trennung von Containern, Iteratoren und Algorithmen. Du erstellst ein Dienstprogrammmodul, das mit STL-Komponenten arbeitet, sowie ein Hauptprogramm, das zeigt, wie diese Teile zusammenpassen.
Du erstellst zwei Dateien:
DataProcessor.h: Definiere Dienstprogrammfunktionen, die über Iteratoren mit STL-Containern arbeiten und dabei die Designphilosophie der STL veranschaulichen.Erstelle eine Funktion namens
printVector, die einstd::vector<int>&entgegennimmt und alle Elemente durch Leerzeichen getrennt ausgibt, gefolgt von einem Zeilenumbruch. Verwende Iteratoren (begin()undend()), um den Container zu durchlaufen.Erstelle eine Funktion namens
sortAndPrint, die einstd::vector<int>&entgegennimmt, ihn mitstd::sortsortiert und anschließend die sortierten Elemente durch Leerzeichen getrennt ausgibt, gefolgt von einem Zeilenumbruch.Erstelle eine Funktion namens
findElement, die einstd::vector<int>&und einen zu suchendenint-Wert entgegennimmt. Verwendestd::find, um das Element zu finden. Wenn es gefunden wird, gibFound: <value>aus. Wenn es nicht gefunden wird, gibNot found: <value>aus.Erstelle eine Funktion namens
getSum, die einstd::vector<int>&entgegennimmt und die Summe aller Elemente zurückgibt. Du kannst dafür eine einfache Schleife mit Iteratoren verwenden.main.cpp: Lies Eingaben ein und veranschauliche, wie STL-Komponenten zusammenarbeiten.Lies fünf Eingaben ein (jede in einer eigenen Zeile):
- Erste ganze Zahl
- Zweite ganze Zahl
- Dritte ganze Zahl
- Vierte ganze Zahl
- Ein zu suchender Wert
Erstelle einen
std::vector<int>und füge die ersten vier ganzen Zahlen hinzu. Veranschauliche anschließend die STL-Philosophie, indem du:Original:ausgibst und danachprintVectoraufrufstSorted:ausgibst und danachsortAndPrintaufrufstfindElementmit dem Suchwert aufrufstSum: <result>mithilfe vongetSumausgibst
Bei den Eingaben 5, 2, 8, 1 und 8 erhältst du beispielsweise:
Original: 5 2 8 1
Sorted: 1 2 5 8
Found: 8
Sum: 16Bei den Eingaben 10, 30, 20, 40 und 15 erhältst du:
Original: 10 30 20 40
Sorted: 10 20 30 40
Not found: 15
Sum: 100Beachte, wie deine Funktionen über Iteratoren mit dem Vektor arbeiten und wie std::sort und std::find auf jedem Container funktionieren, der den richtigen Iteratortyp bereitstellt. Das ist die Stärke des STL-Designs: Algorithmen sind von Containern entkoppelt und nur über Iteratoren miteinander verbunden.
Probier es selbst
#include <iostream>
#include <vector>
#include "DataProcessor.h"
using namespace std;
int main() {
// Lese fünf Ganzzahlen von der Eingabe
int num1, num2, num3, num4, searchValue;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> num4;
cin >> searchValue;
// TODO: Erstelle einen Vektor und füge die ersten vier Ganzzahlen hinzu
// TODO: Gib "Original: " aus und rufe printVector auf
// TODO: Gib "Sorted: " aus und rufe sortAndPrint auf
// TODO: Rufe findElement mit dem Suchwert auf
// TODO: Gib "Sum: " gefolgt vom Ergebnis von getSum aus
return 0;
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienC++ Build & KompilierungHeader-Dateien & QuelldateienNamespaces & GültigkeitsbereichEinführung in OOP mit C++Klassen vs. ObjekteDer „this“-ZeigerMethoden (Member-Funktionen)Attribute (Datenmember)Grundlagen zu Ctors & DtorsRückblick – Einfacher Taschenrechner4Klassenattribute
Instanz- vs. statische MemberGetter und SetterConst-MemberfunktionenMutable-SchlüsselwortStatische Methoden und VariablenFriend-Funktionen und -KlassenZusammenfassung – Bankkontoverwaltung7Vererbung
Grundlagen der VererbungZugriffsebenen bei der VererbungAufrufreihenfolge von Ctor & DtorÜberschreiben von MethodenVirtuelle Funktionen & VTableMehrfachvererbungVirtuelle VererbungRückblick – Mitarbeiterhierarchie10STL-Übersicht
STL-Übersicht & PhilosophieSTL-ContainerIteratorenSTL-AlgorithmenFunktoren & Lambda-AusdrückeRückblick – Worthäufigkeit2Speicherverwaltung
Stack- vs. Heap-SpeicherZeiger und ReferenzenDynamischer Speicher (new/delete)Intelligente Zeiger in C++RAII in C++Rückblick – Dynamischer Array-Manager5Kapselung
Zugriffsbezeichner in C++Zugriffsbezeichner im DetailInformationsverbergungStruct vs. KlasseVerschachtelte und innere KlassenWiederholung – Studierendenverwaltungssystem8Polymorphie
Polymorphie zur Compilezeit vs. LaufzeitFunktionsüberladungVirtuelle Funktionen erneut betrachtetRein virtuelle FunktionenAbstrakte KlassenInterface-Design in C++Dynamic Casting & RTTIRückblick – Shape-Calculator3Konstruktoren & Destruktoren
StandardkonstruktorParametrisierter KonstruktorKopierkonstruktorMove-KonstruktorKonstruktor-InitialisierungslistenDelegierende KonstruktorenDestruktor im DetailDrei-/Fünf-/Null-RegelZusammenfassung – String-Klasse6Operatorüberladung
Einführung in die OperatorüberladungArithmetische OperatorüberladungVergleichsoperatorüberladungStream-OperatorenZuweisungsoperatorüberladungÜberladung der Operatoren [] und ()TypkonvertierungsoperatorenWiederholung – Matrix-Klasse9Templates
FunktionstemplatesKlassen-TemplatesTemplate-SpezialisierungVariadische TemplatesGrundlagen zu SFINAE und Type TraitsRückblick – Generischer ContainerÜbe selbstständig: Online-C++-Compiler