Sortowanie za pomocą lambda
Część sekcji Logika i przepływ programu ścieżki C++ w Coddy. Lekcja 47 z 56.
Biblioteka standardowa C++ udostępnia potężną funkcję o nazwie std::sort z nagłówka <algorithm>, która może sortować kontenery, takie jak wektory.
Domyślnie std::sort układa elementy w kolejności rosnącej (od najmniejszego do największego). Możesz jednak dostosować to zachowanie, przekazując wyrażenie lambda określające sposób porównywania elementów:
#include <vector>
#include <algorithm>
std::vector<int> numbers = {5, 2, 8, 1, 9};
// Posortuj w kolejności malejącej za pomocą lambdy
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a > b; // Zwróć true, jeśli a powinno występować przed b
});Lambdę przyjmuje dwa parametry reprezentujące porównywane elementy i zwraca true, jeśli pierwszy element powinien znaleźć się przed drugim w posortowanym wyniku. W przypadku sortowania malejącego zwracamy true, gdy a > b, co umieszcza większe liczby na początku.
To pokazuje, jak lambdy ułatwiają dostosowywanie funkcji biblioteki standardowej bez pisania osobnych funkcji porównujących, dzięki czemu logika sortowania znajduje się dokładnie tam, gdzie jej potrzebujesz.
Wyzwanie
ŁatwyStwórz program demonstrujący własne sortowanie przy użyciu wyrażeń lambda i std::sort. To wyzwanie sprawdzi, czy rozumiesz, jak używać funkcji lambda do definiowania własnej logiki porównywania podczas sortowania kontenerów.
Podane zostaną następujące dane wejściowe:
- Liczba całkowita
nokreślająca liczbę elementów w wektorze nliczb całkowitych reprezentujących elementy do posortowania- Znak
orderokreślający kolejność sortowania (A— rosnąco,D— malejąco)
Twój program powinien:
- Utworzyć
std::vector<int>i wypełnić go liczbami wejściowymi - Użyć
std::sortz nagłówka<algorithm>wraz z wyrażeniem lambda, aby posortować wektor - Lambda powinna przyjmować dwa parametry typu całkowitego i zwracać wartość logiczną
- Na podstawie znaku określającego kolejność zaimplementować w lambdzie odpowiednią logikę porównywania
- Wypisać każdy element posortowanego wektora w osobnym wierszu
Sortowanie powinno działać następująco:
- Jeśli
orderma wartośćA: sortuj rosnąco (od najmniejszej do największej wartości) - Jeśli
orderma wartośćD: sortuj malejąco (od największej do najmniejszej wartości)
Użyj dokładnie następującego formatu wyjściowego:
[first_sorted_element]
[second_sorted_element]
...
[last_sorted_element]Pamiętaj, że std::sort przyjmuje trzy parametry: iterator początku, iterator końca i funkcję porównującą. Użyj vector.begin() i vector.end() jako iteratorów. Funkcja lambda porównująca powinna zwracać true, jeśli pierwszy parametr powinien znaleźć się przed drugim parametrem w posortowanym wyniku. Dla kolejności rosnącej zwracaj a < b; dla kolejności malejącej zwracaj a > b.
Spróbuj swoich sił
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// Wczytaj dane wejściowe
int n;
cin >> n;
vector<int> numbers(n);
for (int i = 0; i < n; i++) {
cin >> numbers[i];
}
char order;
cin >> order;
// TODO: Napisz swój kod poniżej
// Użyj std::sort z wyrażeniem lambda, aby posortować wektor
// na podstawie znaku określającego kolejność (A dla rosnącej, D dla malejącej)
// Wypisz posortowane elementy
for (int num : numbers) {
cout << num << endl;
}
return 0;
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ programu
1Wskaźniki i pamięć
Czym jest wskaźnik?Operator pobrania adresuOperator dereferencjiWskaźniki zeroweWskaźniki i tabliceDynamiczne zarządzanie pamięcią za pomocą „new”Zwalnianie pamięci za pomocą „delete”Podsumowanie — ćwiczenia ze wskaźnikami4Mapy (pary klucz–wartość)
Poznajemy std::mapTworzenie mapyOdczytywanie i modyfikowanie wartościSprawdzanie kluczyUsuwanie parIterowanie po mapiePodsumowanie – częstość występowania słów7Zaawansowane funkcje
Przekazywanie przez referencjęWprowadzenie do wyrażeń lambdaWyrażenia lambda z parametramiWyrażenia lambda z wartościami zwracanymiWprowadzenie do rekurencjiRekurencyjny silniaSortowanie za pomocą lambda2Wektory (tablice dynamiczne)
Wprowadzenie do std::vectorTworzenie wektoraDodawanie elementówDostęp do elementówRozmiar wektoraIterowanie za pomocą pętli forPętla for oparta na zakresieUsuwanie elementówPodsumowanie — operacje na wektorach5Projekt: Narzędzie do zarządzania zapasami
Konfiguracja projektuDodawanie i aktualizowanie produktów3Projekt: narzędzie do listy zadań
Przegląd projektuDodawanie zadaniaPoćwicz samodzielnie: Kompilator C++ online