1. Сучасне рішення C ++ 20
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s;
Ми використовуємо функцію лямбда як компаратор. Як завжди, порівняльник повинен повернути булеве значення, вказуючи, чи вважається, що елемент, переданий як перший аргумент, переходить до другого в конкретному строгому слабкому порядку, який він визначає.
Демонстрація в Інтернеті
2. Сучасне рішення C ++ 11
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s(cmp);
Перед C ++ 20 нам потрібно передати лямбда як аргумент для встановлення конструктора
Демонстрація в Інтернеті
3. Подібно до першого рішення, але з функцією замість лямбда
Зробіть компаратор як звичайну булеву функцію
bool cmp(int a, int b) {
return ...;
}
Потім використовуйте його будь-яким чином:
std::set<int, decltype(cmp)*> s(cmp);
Демонстрація в Інтернеті
або таким чином:
std::set<int, decltype(&cmp)> s(&cmp);
Демонстрація в Інтернеті
4. Старе рішення за допомогою struct з ()
оператором
struct cmp {
bool operator() (int a, int b) const {
return ...
}
};
// ...
// later
std::set<int, cmp> s;
Демонстрація в Інтернеті
5. Альтернативне рішення: створити структуру з булевої функції
Візьміть булеву функцію
bool cmp(int a, int b) {
return ...;
}
І зробіть структуру з неї, використовуючи std::integral_constant
#include <type_traits>
using Cmp = std::integral_constant<decltype(&cmp), &cmp>;
Нарешті, використовуйте структуру як компаратор
std::set<X, Cmp> set;
Демонстрація в Інтернеті