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;
}

Плюсы:

  • Можно хранить состояние (переменные внутри)
  • Быстрее чем указатели на функции
  • Можно передавать параметры
 

Главное запомнить:

  1. Функциональный объект = класс с operator()
  2. Для сортировки - создаем функтор с bool operator()(a, b)
  3. Возвращает true если a должен быть перед b
  4. Использование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]<<" ";
}