5.
Сортировка вектора через функциональный объект
В качестве компаратора также можно указать функциональный объект, который можно создать перед вызовом функцией сортировки.
Функциональный объект (функтор) - это обычный класс/структура, у которого перегружен оператор ()
.
Например:
struct
{
bool operator()(int a, int b) const
{
return a < b;
}
} cmp;
Пример
// Функтор для сортировки по возрастанию
struct Ascending {
bool operator()(int a, int b) {
return a < b; // если a < b, то a будет перед b
}
};
int main() {
vector<int> numbers = {5, 2, 8, 1, 9};
// Сортируем используя наш функтор
sort(numbers.begin(), numbers.end(), Ascending());
for (int n : numbers) {
cout << n << " "; // 1 2 5 8 9
}
return 0;
}
Плюсы:
- Можно хранить состояние (переменные внутри)
- Быстрее чем указатели на функции
- Можно передавать параметры
Главное запомнить:
- Функциональный объект = класс с
operator()
- Для сортировки - создаем функтор с
bool operator()(a, b)
- Возвращает true если
a
должен быть перед b
- Использование:
sort(начало, конец, ИмяФунктора())
Дана последовательность, состоящая из целых чисел. Напишите программу, которая создает сортирует массив по убыванию.
Входные данные
Сначала задано число N — количество элементов в массиве (1<=N<=100). Далее через пробел записаны N чисел — элементы массива. Массив состоит из целых чисел.
Выходные данные
Необходимо вывести массив отсортированный по убыванию.
Ввод |
Вывод |
5
4 56 23 67 100 |
100 67 56 23 4 |
Вставьте недостающие фрагменты кода
C++
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N;
cin >> N;
vector<int> A (N);
for(int i = 0; i < N; i++)
cin>>A[i];
|
|
sort(A.begin(), A.end(), cmp);
for(int i = 0;i< N; i ++)
cout<<A[i]<<" ";
}
|