1. Solución C ++ 20 moderna
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s;
Usamos la función lambda como comparador. Como de costumbre, el comparador debe devolver un valor booleano, indicando si el elemento pasado como primer argumento se considera que va antes que el segundo en el orden débil estricto específico que define.
Demostración online
2. Solución moderna de C ++ 11
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s(cmp);
Antes de C ++ 20 necesitamos pasar lambda como argumento para establecer el constructor
Demostración online
3. Similar a la primera solución, pero con función en lugar de lambda
Hacer comparador como función booleana habitual
bool cmp(int a, int b) {
return ...;
}
Luego úsalo, ya sea de esta manera:
std::set<int, decltype(cmp)*> s(cmp);
Demostración online
o de esta manera:
std::set<int, decltype(&cmp)> s(&cmp);
Demostración online
4. Solución anterior que usa estructura con ()
operador
struct cmp {
bool operator() (int a, int b) const {
return ...
}
};
// ...
// later
std::set<int, cmp> s;
Demostración online
5. Solución alternativa: cree una estructura a partir de una función booleana
Toma la función booleana
bool cmp(int a, int b) {
return ...;
}
Y haz una estructura a partir de él usando std::integral_constant
#include <type_traits>
using Cmp = std::integral_constant<decltype(&cmp), &cmp>;
Finalmente, use la estructura como comparador
std::set<X, Cmp> set;
Demostración online