Сортировка 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, что ставит большие числа на первое место.
Это демонстрирует, как лямбда-выражения позволяют легко настраивать функции стандартной библиотеки без написания отдельных функций сравнения, сохраняя логику сортировки именно там, где она вам нужна.
Задание
ЛегкоСоздайте программу, которая демонстрирует пользовательскую сортировку с использованием лямбда-выражений и std::sort. Эта задача проверит ваше понимание того, как использовать лямбда-функции для определения пользовательской логики сравнения при сортировке контейнеров.
Будут предоставлены следующие входные данные:
- Целое число
n, представляющее количество элементов в векторе nцелых чисел, представляющих элементы для сортировки- Символ
order, представляющий порядок сортировки (Aдля возрастания,Dдля убывания)
Ваша программа должна:
- Создать
std::vector<int>и заполнить его входными числами - Использовать
std::sortиз заголовка<algorithm>с лямбда-выражением для сортировки вектора - Лямбда-выражение должно принимать два целочисленных параметра и возвращать логическое значение
- На основе символа порядка реализовать соответствующую логику сравнения в лямбда-выражении
- Вывести каждый элемент отсортированного вектора на отдельной строке
Поведение сортировки должно быть следующим:
- Если
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;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Указатели и память
Что такое указатель?Оператор взятия адресаОператор разыменованияНулевые указателиУказатели и массивыДинамическая память и 'new'Освобождение памяти и 'delete'Итоги: Практика с указателями2Векторы (динамические массивы)
Знакомство с std::vectorСоздание вектораДобавление элементовДоступ к элементамРазмер вектораИтерация с помощью цикла ForRange-based цикл ForУдаление элементовИтоги: операции с векторами5Проект: Инструмент инвентаризации
Настройка проектаДобавление и обновление товаров