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 template-basierten Klassen und Funktionen, die gängige Datenstrukturen und Algorithmen bereitstellen. Aufbauend auf den Template-Konzepten, die Sie gelernt haben, verkörpert die STL eine leistungsstarke Designphilosophie: die Trennung von Datenspeicherung und Datenmanipulation.
Die STL ist um drei Kernkomponenten herum organisiert, die zusammenarbeiten:
| Komponente | Zweck | Beispiele |
|---|---|---|
| Container | Speichern Sammlungen von Objekten | vector, map, set |
| Iteratoren | Ermöglichen den Zugriff auf Container-Elemente | Eingabe, Ausgabe, wahlfreier Zugriff |
| Algorithmen | Führen Operationen auf Daten aus | sort, find, transform |
Die entscheidende Erkenntnis ist, dass Algorithmen nichts direkt über Container wissen – sie arbeiten über Iteratoren. Das bedeutet, dass ein einziger sort-Algorithmus mit Vektoren, Arrays und jedem Container funktioniert, der den richtigen 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 Sie kombinieren können – verwenden Sie jeden Algorithmus mit jedem kompatiblen Container, ohne neuen Code zu schreiben. Die STL bietet praxiserprobte, optimierte Implementierungen, sodass Sie sich auf das Lösen von Problemen konzentrieren können, anstatt gängige Datenstrukturen neu zu erfinden.
Aufgabe
EinfachLassen Sie uns ein einfaches Datenverarbeitungssystem erstellen, das die STL-Philosophie der Trennung von Containern, Iteratoren und Algorithmen demonstriert. Sie werden ein Utility-Modul erstellen, das mit STL-Komponenten arbeitet, und ein Hauptprogramm, das zeigt, wie diese Teile zusammenpassen.
Sie werden zwei Dateien erstellen:
DataProcessor.h: Definieren Sie Utility-Funktionen, die über Iteratoren mit STL-Containern arbeiten und so die Designphilosophie der STL demonstrieren.Erstellen Sie eine Funktion namens
printVector, die einenstd::vector<int>&entgegennimmt und alle Elemente durch Leerzeichen getrennt ausgibt, gefolgt von einem Zeilenumbruch. Verwenden Sie Iteratoren (begin()undend()), um den Container zu durchlaufen.Erstellen Sie eine Funktion namens
sortAndPrint, die einenstd::vector<int>&entgegennimmt, diesen mitstd::sortsortiert und dann die sortierten Elemente durch Leerzeichen getrennt ausgibt, gefolgt von einem Zeilenumbruch.Erstellen Sie eine Funktion namens
findElement, die einenstd::vector<int>&und einen zu suchendenint-Wert entgegennimmt. Verwenden Siestd::find, um das Element zu lokalisieren. Wenn es gefunden wird, geben SieFound: <value>aus. Wenn es nicht gefunden wird, geben SieNot found: <value>aus.Erstellen Sie eine Funktion namens
getSum, die einenstd::vector<int>&entgegennimmt und die Summe aller Elemente zurückgibt. Sie können hierfür eine einfache Schleife mit Iteratoren verwenden.main.cpp: Lesen Sie Eingaben ein und demonstrieren Sie, wie STL-Komponenten zusammenarbeiten.Lesen Sie fünf Eingaben ein (jede in einer separaten Zeile):
- Erste Ganzzahl
- Zweite Ganzzahl
- Dritte Ganzzahl
- Vierte Ganzzahl
- Ein zu suchender Wert
Erstellen Sie einen
std::vector<int>und fügen Sie die ersten vier Ganzzahlen hinzu. Demonstrieren Sie dann die STL-Philosophie durch:- Ausgabe von
Original:gefolgt vom Aufruf vonprintVector - Ausgabe von
Sorted:gefolgt vom Aufruf vonsortAndPrint - Aufruf von
findElementmit dem Suchwert - Ausgabe von
Sum: <result>unter Verwendung vongetSum
Zum Beispiel bei den Eingaben 5, 2, 8, 1 und 8:
Original: 5 2 8 1
Sorted: 1 2 5 8
Found: 8
Sum: 16Bei den Eingaben 10, 30, 20, 40 und 15:
Original: 10 30 20 40
Sorted: 10 20 30 40
Not found: 15
Sum: 100Beachten Sie, wie Ihre Funktionen über Iteratoren mit dem Vektor arbeiten und wie std::sort und std::find auf jedem Container operieren, der den richtigen Iteratortyp bereitstellt. Dies ist die Stärke des STL-Designs — Algorithmen sind von Containern entkoppelt und nur über Iteratoren miteinander verbunden.
Spickzettel
Die Standard Template Library (STL) ist eine Sammlung von template-basierten Klassen und Funktionen, die gängige Datenstrukturen und Algorithmen bereitstellen. Sie trennt die Datenspeicherung von der Datenmanipulation.
Die STL besteht aus drei Kernkomponenten:
| Komponente | Zweck | Beispiele |
|---|---|---|
| Container | Speichern Sammlungen von Objekten | vector, map, set |
| Iteratoren | Ermöglichen den Zugriff auf Container-Elemente | Eingabe, Ausgabe, Direktzugriff |
| Algorithmen | Führen Operationen auf Daten aus | sort, find, transform |
Algorithmen arbeiten über Iteratoren, nicht direkt mit Containern. Dies ermöglicht es einem einzelnen Algorithmus, mit jedem kompatiblen Container zu arbeiten:
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> nums = {5, 2, 8, 1, 9};
// Sortieren unter Verwendung von Iteratoren
std::sort(nums.begin(), nums.end());
// Durchlaufen unter Verwendung von Iteratoren
for (int n : nums) {
std::cout << n << " ";
}
// Ausgabe: 1 2 5 8 9
}Gängige Iterator-Methoden:
begin()- gibt einen Iterator auf das erste Element zurückend()- gibt einen Iterator auf die Position nach dem letzten Element zurück
Gängige STL-Algorithmen:
std::sort(begin, end)- sortiert Elemente in einem Bereichstd::find(begin, end, value)- sucht nach einem Wert in einem Bereich
Probier es selbst
#include <iostream>
#include <vector>
#include "DataProcessor.h"
using namespace std;
int main() {
// Lies fünf Ganzzahlen aus der Eingabe
int num1, num2, num3, num4, searchValue;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> num4;
cin >> searchValue;
// TODO: Erstelle einen vector 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 & QuelldateienNamensräume & GültigkeitsbereicheEinführung in OOP in C++Klassen vs. ObjekteDer 'this'-PointerMethoden (Elementfunktionen)Attribute (Datenelemente)Grundlagen zu Ctors & DtorsRückblick - Einfacher Taschenrechner4Klasseneigenschaften
Instanz- vs. statische MemberGetter und SetterConst-MemberfunktionenMutable-SchlüsselwortStatische Methoden und VariablenFriend-Funktionen & KlassenZusammenfassung - Bankkonto-Manager7Vererbung
Grundlagen der VererbungZugriffsstufen bei VererbungAufrufreihenfolge von Ctor & DtorÜberschreiben von MethodenVirtuelle Funktionen & VTableMehrfachvererbungVirtuelle VererbungRückblick - Mitarbeiter-Hierarchie10STL-Übersicht
STL-Übersicht & PhilosophieSTL-ContainerIteratorenSTL-AlgorithmenFunktoren & Lambda-AusdrückeRückblick – Wortfrequenz2Speicherverwaltung
Stack vs. Heap SpeicherZeiger und ReferenzenDynamischer Speicher (new/delete)Smart Pointers in C++RAII in C++Rückblick – Dynamischer Array-Manager5Kapselung
Zugriffsspezifizierer in C++Zugriffsspezifizierer im DetailInformation HidingStruct vs. ClassVerschachtelte & innere KlassenRückblick - Studentenverwaltungssystem8Polymorphie
Kompilierzeit- vs. Laufzeit-PolymorphieFunktionsüberladungVirtuelle Funktionen – WiederholungRein virtuelle FunktionenAbstrakte KlassenInterface-Design in C++Dynamic Casting & RTTIZusammenfassung – Formen-Rechner3Konstruktoren & Destruktoren
StandardkonstruktorParametrisierter KonstruktorKopierkonstruktorVerschiebekonstruktorKonstruktor-InitialisierungslistenDelegierende KonstruktorenDestruktoren im DetailRule of Three / Five / ZeroZusammenfassung - String-Klasse6Operatorüberladung
Einführung in die OperatorüberladungArithmetische OperatorüberladungVergleichsoperatorüberladungStream-OperatorenZuweisungsoperatorüberladungÜberladen der [] und () OperatorenTypumwandlungsoperatorenRückblick - Matrix-Klasse9Templates
FunktionstemplatesKlassentemplatesTemplate-SpezialisierungVariadische TemplatesSFINAE & Type Traits GrundlagenRückblick - Generische Container