Menu
Coddy logo textTech

Сортировка Lambda

Часть раздела Логика и управление потоком путешествия по C++ на Coddy — урок 47 из 56.

Стандартная библиотека C++ предоставляет мощную функцию под названием std::sort из заголовочного файла <algorithm>, которая может сортировать контейнеры, такие как векторы.

По умолчанию std::sort упорядочивает элементы по возрастанию (от меньшего к большему). Однако вы можете настроить это поведение, предоставив лямбда-выражение, которое определяет, как следует сравнивать элементы:

#include <vector>
#include <algorithm>

std::vector<int> numbers = {5, 2, 8, 1, 9};

// Сортировка по убыванию с использованием лямбда-выражения
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
    return a > b;  // Возвращает true, если a должно стоять перед b
});

Лямбда-выражение принимает два параметра, представляющих сравниваемые элементы, и возвращает true, если первый элемент должен стоять перед вторым в отсортированном результате. Для сортировки по убыванию мы возвращаем true, когда a > b, что ставит большие числа на первое место.

Это демонстрирует, как лямбда-выражения позволяют легко настраивать функции стандартной библиотеки без написания отдельных функций сравнения, сохраняя логику сортировки именно там, где она вам нужна.

challenge icon

Задание

Легко

Создайте программу, которая демонстрирует пользовательскую сортировку с использованием лямбда-выражений и std::sort. Эта задача проверит ваше понимание того, как использовать лямбда-функции для определения пользовательской логики сравнения при сортировке контейнеров.

Будут предоставлены следующие входные данные:

  • Целое число n, представляющее количество элементов в векторе
  • n целых чисел, представляющих элементы для сортировки
  • Символ order, представляющий порядок сортировки (A для возрастания, D для убывания)

Ваша программа должна:

  1. Создать std::vector<int> и заполнить его входными числами
  2. Использовать std::sort из заголовка <algorithm> с лямбда-выражением для сортировки вектора
  3. Лямбда-выражение должно принимать два целочисленных параметра и возвращать логическое значение
  4. На основе символа порядка реализовать соответствующую логику сравнения в лямбда-выражении
  5. Вывести каждый элемент отсортированного вектора на отдельной строке

Поведение сортировки должно быть следующим:

  • Если order равен A: сортировка по возрастанию (от меньшего к большему)
  • Если order равен D: сортировка по убыванию (от большего к меньшему)

Используйте следующий точный формат вывода:

[first_sorted_element]
[second_sorted_element]
...
[last_sorted_element]

Помните, что std::sort принимает три параметра: итератор начала, итератор конца и функцию сравнения. Используйте vector.begin() и vector.end() для итераторов. Лямбда-функция сравнения должна возвращать true, если первый параметр должен стоять перед вторым параметром в отсортированном результате. Для порядка по возрастанию возвращайте a < b; для порядка по убыванию возвращайте a > b.

Шпаргалка

Функция std::sort из заголовка <algorithm> сортирует контейнеры, такие как векторы. По умолчанию она сортирует в порядке возрастания, но вы можете настроить поведение сортировки с помощью лямбда-выражения.

Базовый синтаксис:

std::sort(container.begin(), container.end(), comparison_lambda);

Лямбда принимает два параметра, представляющих сравниваемые элементы, и возвращает true, если первый элемент должен стоять перед вторым в отсортированном результате.

Пример — порядок убывания:

#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;  // Числа побольше идут первыми
});

Пример — порядок возрастания:

std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
    return a < b;  // Числа поменьше идут первыми
});

Попробуйте сами

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    // Чтение входных данных
    int n;
    cin >> n;
    
    vector<int> numbers(n);
    for (int i = 0; i < n; i++) {
        cin >> numbers[i];
    }
    
    char order;
    cin >> order;
    
    // TODO: Напишите ваш код ниже
    // Используйте std::sort с лямбда-выражением для сортировки вектора
    // на основе символа порядка (A для возрастания, D для убывания)
    
    // Вывод отсортированных элементов
    for (int num : numbers) {
        cout << num << endl;
    }
    
    return 0;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком