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
EinfachLassen Sie uns einen Score-Analyzer erstellen, der eine Sammlung von Zahlen mithilfe von STL-Algorithmen verarbeitet. Sie werden Hilfsfunktionen erstellen, die demonstrieren, wie sort, find, transform und accumulate zusammenarbeiten, um Daten zu analysieren.
Sie werden Ihren Code auf zwei Dateien verteilen:
ScoreAnalyzer.h: Definieren Sie Hilfsfunktionen, die STL-Algorithmen verwenden, um Vektoren von Ganzzahlen zu verarbeiten.Erstellen Sie eine Funktion namens
sortScores, die einenstd::vector<int>&entgegennimmt und ihn mitstd::sortin aufsteigender Reihenfolge sortiert.Erstellen Sie eine Funktion namens
findScore, die einenconst std::vector<int>&und einenint-Zielwert entgegennimmt. Verwenden Siestd::find, um nach dem Zielwert zu suchen. Wenn er gefunden wird, geben Sie den Index (Abstand vom Anfang) zurück. Wenn er nicht gefunden wird, geben Sie-1zurück.Erstellen Sie eine Funktion namens
applyBonus, die einenconst std::vector<int>&und einenint-Bonusbetrag entgegennimmt. Verwenden Siestd::transform, um einen neuen Vektor zu erstellen und zurückzugeben, bei dem zu jedem Score der Bonus addiert wurde.Erstellen Sie eine Funktion namens
calculateAverage, die einenconst std::vector<int>&entgegennimmt und den Durchschnitt alsdoublezurückgibt. Verwenden Siestd::accumulate, um die Summe zu berechnen, und teilen Sie diese dann durch die Größe.Erstellen Sie eine Funktion namens
printVector, die einenconst std::vector<int>&entgegennimmt und alle Elemente durch Leerzeichen getrennt ausgibt, gefolgt von einem Zeilenumbruch.main.cpp: Lesen Sie sechs Eingaben ein (jede in einer separaten Zeile):- Erster Score (Ganzzahl)
- Zweiter Score (Ganzzahl)
- Dritter Score (Ganzzahl)
- Vierter Score (Ganzzahl)
- Ein Score, nach dem gesucht werden soll (Ganzzahl)
- Ein anzuwendender Bonusbetrag (Ganzzahl)
Erstellen Sie einen Vektor mit den vier Scores und demonstrieren Sie die Algorithmen:
- Geben Sie
Original:gefolgt vom Inhalt des Vektors aus - Sortieren Sie die Scores und geben Sie
Sorted:gefolgt vom sortierten Vektor aus - Suchen Sie nach dem Ziel-Score im sortierten Vektor. Wenn er gefunden wird, geben Sie
Found <value> at index <index>aus. Wenn er nicht gefunden wird, geben Sie<value> not foundaus - Wenden Sie den Bonus auf die sortierten Scores an und geben Sie
With bonus:gefolgt vom neuen Vektor aus - Berechnen und geben Sie den Durchschnitt der ursprünglichen sortierten Scores (vor dem Bonus) 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.2Denken Sie daran, <algorithm> für sort, find und transform sowie <numeric> für accumulate einzubinden. Verwenden Sie std::fixed und std::setprecision(1) aus <iomanip> für die Formatierung des Durchschnitts.
Spickzettel
STL-Algorithmen sind Template-Funktionen aus <algorithm> und <numeric>, die auf durch Iteratoren definierten Bereichen operieren.
std::sort ordnet Elemente 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 nichts 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 arbeiten mit Iterator-Bereichen, was sie flexibel für Teilbereiche oder verschiedene Containertypen macht.
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 & 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