Lambda Sort
Teil des Abschnitts Logik & Ablauf der C++-Journey von Coddy — Lektion 47 von 56.
Die C++-Standardbibliothek bietet eine leistungsstarke Funktion namens std::sort aus dem <algorithm> Header, die Container wie Vektoren sortieren kann.
Standardmäßig ordnet std::sort Elemente in aufsteigender Reihenfolge (vom kleinsten zum größten) an. Sie können dieses Verhalten jedoch anpassen, indem Sie einen Lambda-Ausdruck bereitstellen, der definiert, wie Elemente verglichen werden sollen:
#include <vector>
#include <algorithm>
std::vector<int> numbers = {5, 2, 8, 1, 9};
// In absteigender Reihenfolge mit einem Lambda sortieren
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a > b; // Gibt true zurück, wenn a vor b stehen soll
});Der Lambda-Ausdruck nimmt zwei Parameter entgegen, die die zu vergleichenden Elemente darstellen, und gibt true zurück, wenn das erste Element im sortierten Ergebnis vor dem zweiten stehen soll. Für eine absteigende Reihenfolge geben wir true zurück, wenn a > b gilt, wodurch größere Zahlen zuerst platziert werden.
Dies zeigt, wie Lambdas es einfach machen, Standardbibliotheksfunktionen anzupassen, ohne separate Vergleichsfunktionen zu schreiben, wodurch Ihre Sortierlogik genau dort bleibt, wo Sie sie benötigen.
Aufgabe
EinfachErstellen Sie ein Programm, das benutzerdefiniertes Sortieren unter Verwendung von Lambda-Ausdrücken mit std::sort demonstriert. Diese Herausforderung testet Ihr Verständnis dafür, wie Lambda-Funktionen verwendet werden, um eine benutzerdefinierte Vergleichslogik zum Sortieren von Containern zu definieren.
Die folgenden Eingaben werden bereitgestellt:
- Eine Ganzzahl
n, die die Anzahl der Elemente im Vektor darstellt nGanzzahlen, die die zu sortierenden Elemente darstellen- Ein Zeichen
order, das die Sortierreihenfolge darstellt (Afür aufsteigend,Dfür absteigend)
Ihr Programm sollte:
- Einen
std::vector<int>erstellen und ihn mit den eingegebenen Zahlen füllen std::sortaus dem<algorithm>-Header mit einem Lambda-Ausdruck verwenden, um den Vektor zu sortieren- Das Lambda sollte zwei Ganzzahl-Parameter entgegennehmen und einen booleschen Wert zurückgeben
- Basierend auf dem Zeichen für die Reihenfolge die entsprechende Vergleichslogik im Lambda implementieren
- Jedes Element des sortierten Vektors in einer separaten Zeile ausgeben
Das Sortierverhalten sollte wie folgt sein:
- Wenn
ordergleichAist: aufsteigend sortieren (vom kleinsten zum größten) - Wenn
ordergleichDist: absteigend sortieren (vom größten zum kleinsten)
Verwenden Sie das folgende exakte Ausgabeformat:
[first_sorted_element]
[second_sorted_element]
...
[last_sorted_element]Denken Sie daran, dass std::sort drei Parameter erwartet: den Anfangs-Iterator, den End-Iterator und eine Vergleichsfunktion. Verwenden Sie vector.begin() und vector.end() für die Iteratoren. Die Lambda-Vergleichsfunktion sollte true zurückgeben, wenn der erste Parameter im sortierten Ergebnis vor dem zweiten Parameter stehen soll. Für aufsteigende Reihenfolge geben Sie a < b zurück; für absteigende Reihenfolge geben Sie a > b zurück.
Spickzettel
Die Funktion std::sort aus dem Header <algorithm> sortiert Container wie Vektoren. Standardmäßig sortiert sie in aufsteigender Reihenfolge, aber Sie können das Sortierverhalten mithilfe eines Lambda-Ausdrucks anpassen.
Grundlegende Syntax:
std::sort(container.begin(), container.end(), comparison_lambda);Das Lambda nimmt zwei Parameter entgegen, die die zu vergleichenden Elemente darstellen, und gibt true zurück, wenn das erste Element im sortierten Ergebnis vor dem zweiten stehen soll.
Beispiel - absteigende Reihenfolge:
#include <algorithm>
#include <vector>
std::vector<int> numbers = {5, 2, 8, 1, 9};
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a > b; // Größere Zahlen kommen zuerst
});Beispiel - aufsteigende Reihenfolge:
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a < b; // Kleinere Zahlen kommen zuerst
});Probier es selbst
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// Eingabe lesen
int n;
cin >> n;
vector<int> numbers(n);
for (int i = 0; i < n; i++) {
cin >> numbers[i];
}
char order;
cin >> order;
// TODO: Schreiben Sie Ihren Code unten
// Verwenden Sie std::sort mit einem Lambda-Ausdruck, um den Vektor zu sortieren
// basierend auf dem Sortierzeichen (A für aufsteigend, D für absteigend)
// Die sortierten Elemente ausgeben
for (int num : numbers) {
cout << num << endl;
}
return 0;
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Pointer und Speicher
Was ist ein Pointer?AdressoperatorDereferenzierungsoperatorNull-PointerPointer und ArraysDynamischer Speicher mit 'new'Speicher freigeben mit 'delete'Zusammenfassung – Pointer-Übung4Maps (Schlüssel-Wert-Paare)
Einführung in std::mapErstellen einer MapWerte abrufen und ändernAuf Schlüssel prüfenPaare entfernenÜber eine Map iterierenZusammenfassung – Wortfrequenz7Fortgeschrittene Funktionen
ReferenzübergabeEinführung in Lambda-AusdrückeLambdas mit ParameternLambdas mit RückgabewertenEinführung in die RekursionRekursive FakultätLambda Sort2Vektoren (Dynamische Arrays)
Einführung in std::vectorEinen Vector erstellenElemente hinzufügenAuf Elemente zugreifenVector-GrößeIterieren mit einer For-SchleifeRange-based For-SchleifeElemente entfernenZusammenfassung – Vector-Operationen3Projekt: Aufgabenlisten-Tool
ProjektübersichtEine Aufgabe hinzufügen