Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Stwó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 n określająca liczbę elementów w wektorze
  • n liczb całkowitych reprezentujących elementy do posortowania
  • Znak order określający kolejność sortowania (A — rosnąco, D — malejąco)

Twój program powinien:

  1. Utworzyć std::vector<int> i wypełnić go liczbami wejściowymi
  2. Użyć std::sort z nagłówka <algorithm> wraz z wyrażeniem lambda, aby posortować wektor
  3. Lambda powinna przyjmować dwa parametry typu całkowitego i zwracać wartość logiczną
  4. Na podstawie znaku określającego kolejność zaimplementować w lambdzie odpowiednią logikę porównywania
  5. Wypisać każdy element posortowanego wektora w osobnym wierszu

Sortowanie powinno działać następująco:

  • Jeśli order ma wartość A: sortuj rosnąco (od najmniejszej do największej wartości)
  • Jeśli order ma 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;
}
quiz iconSprawdź się

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

Poćwicz samodzielnie: Kompilator C++ online