В качестве компаратора также можно указать функциональный объект, который можно создать перед вызовом функцией сортировки.
Функциональный объект (функтор) - это обычный класс/структура, у которого перегружен оператор
()
.
Например:
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(начало, конец, ИмяФунктора())