STL-Algorithmen
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy. Lektion 73 von 104.
STL-Algorithmen sind Template-Funktionen, die auf Bereichen operieren, die durch Iteratoren definiert sind. Sie sind in den Headern <algorithm> und <numeric> zu finden und funktionieren mit jedem Container, der kompatible Iteratoren bereitstellt.
std::sort ordnet Elemente standardmäßig in aufsteigender Reihenfolge an:
#include <algorithm>
#include <vector>
std::vector<int> nums = {5, 2, 8, 1};
std::sort(nums.begin(), nums.end());
// nums: {1, 2, 5, 8}std::find sucht nach einem Wert und gibt einen Iterator auf die erste Übereinstimmung zurück, oder end(), falls dieser nicht gefunden wurde:
auto it = std::find(nums.begin(), nums.end(), 5);
if (it != nums.end()) {
std::cout << "Found at index: " << (it - nums.begin());
}std::transform wendet eine Operation auf jedes Element an und speichert die Ergebnisse in einem Zielbereich:
std::vector<int> doubled(nums.size());
std::transform(nums.begin(), nums.end(), doubled.begin(),
[](int x) { return x * 2; });
// doubled: {2, 4, 10, 16}std::accumulate aus <numeric> kombiniert alle Elemente zu einem einzigen Wert:
#include <numeric>
int sum = std::accumulate(nums.begin(), nums.end(), 0);
// sum: 16 (1 + 2 + 5 + 8)Diese Algorithmen akzeptieren Iterator-Bereiche anstatt Container direkt, was sie flexibel genug macht, um mit Teilbereichen oder verschiedenen Container-Typen mit demselben Code zu arbeiten.
Aufgabe
EinfachErstelle einen Score-Analysator, der mithilfe von STL-Algorithmen eine Sammlung von Zahlen verarbeitet. Du erstellst Hilfsfunktionen, die zeigen, wie sort, find, transform und accumulate zusammenarbeiten, um Daten zu analysieren.
Du organisierst deinen Code über zwei Dateien:
ScoreAnalyzer.h: Definiere Hilfsfunktionen, die STL-Algorithmen verwenden, um Vektoren von Ganzzahlen zu verarbeiten.Erstelle eine Funktion namens
sortScores, die einenstd::vector<int>&entgegennimmt und ihn mithilfe vonstd::sortin aufsteigender Reihenfolge sortiert.Erstelle eine Funktion namens
findScore, die einenconst std::vector<int>&und einen Zielwert vom Typintentgegennimmt. Verwendestd::find, um nach dem Zielwert zu suchen. Wenn er gefunden wird, gib den Index zurück (den Abstand vom Anfang). Wenn er nicht gefunden wird, gib-1zurück.Erstelle eine Funktion namens
applyBonus, die einenconst std::vector<int>&und einen Bonusbetrag vom Typintentgegennimmt. Verwendestd::transform, um einen neuen Vektor zu erstellen und zurückzugeben, in dem jeder Punktestand um den Bonus erhöht wurde.Erstelle eine Funktion namens
calculateAverage, die einenconst std::vector<int>&entgegennimmt und den Durchschnitt alsdoublezurückgibt. Verwendestd::accumulate, um die Summe zu berechnen, und teile sie anschließend durch die Größe.Erstelle eine Funktion namens
printVector, die einenconst std::vector<int>&entgegennimmt und alle Elemente durch Leerzeichen getrennt ausgibt, gefolgt von einem Zeilenumbruch.main.cpp: Lies sechs Eingaben ein (jede in einer eigenen Zeile):- Erster Punktestand (Ganzzahl)
- Zweiter Punktestand (Ganzzahl)
- Dritter Punktestand (Ganzzahl)
- Vierter Punktestand (Ganzzahl)
- Ein zu suchender Punktestand (Ganzzahl)
- Ein anzuwendender Bonusbetrag (Ganzzahl)
Erstelle einen Vektor mit den vier Punkteständen und führe die Algorithmen vor:
- Gib
Original:aus, gefolgt von den Inhalten des Vektors - Sortiere die Punktestände und gib
Sorted:aus, gefolgt vom sortierten Vektor - Suche im sortierten Vektor nach dem Zielpunktestand. Wenn er gefunden wird, gib
Found <value> at index <index>aus. Wenn er nicht gefunden wird, gib<value> not foundaus - Wende den Bonus auf die sortierten Punktestände an und gib
With bonus:aus, gefolgt vom neuen Vektor - Berechne den Durchschnitt der ursprünglichen sortierten Punktestände (vor dem Bonus) und gib ihn als
Average: <value>mit einer Nachkommastelle aus
Zum Beispiel mit den Eingaben 75, 90, 60, 85, 85 und 5:
Original: 75 90 60 85
Sorted: 60 75 85 90
Found 85 at index 2
With bonus: 65 80 90 95
Average: 77.5Mit den Eingaben 100, 80, 95, 70, 50 und 10:
Original: 100 80 95 70
Sorted: 70 80 95 100
50 not found
With bonus: 80 90 105 110
Average: 86.2Denke daran, <algorithm> für sort, find und transform sowie <numeric> für accumulate einzubinden. Verwende std::fixed und std::setprecision(1) aus <iomanip>, um den Durchschnitt zu formatieren.
Probier es selbst
#include <iostream>
#include <vector>
#include <iomanip>
#include "ScoreAnalyzer.h"
using namespace std;
int main() {
// Sechs Eingaben lesen
int score1, score2, score3, score4;
int searchTarget, bonusAmount;
cin >> score1;
cin >> score2;
cin >> score3;
cin >> score4;
cin >> searchTarget;
cin >> bonusAmount;
// TODO: Erstelle einen vector mit den vier Punktzahlen
// TODO: Gib "Original:" gefolgt vom Inhalt des vector aus
// TODO: Sortiere die Punktzahlen und gib "Sorted:" gefolgt vom sortierten vector aus
// TODO: Suche nach der Zielpunktzahl im sortierten vector
// Falls gefunden, gib "Found <value> at index <index>" aus
// Falls nicht gefunden, gib "<value> not found" aus
// TODO: Wende den Bonus auf die sortierten Punktzahlen an und gib "With bonus:" gefolgt vom neuen vector aus
// TODO: Berechne und gib den Durchschnitt der sortierten Punktzahlen (vor dem Bonus) aus
// Verwende fixed und setprecision(1) für die Formatierung
// Gib als "Average: <value>" 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