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 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;
Онлайн-демонстрация