1. Solução C ++ 20 moderna
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s;
Usamos a função lambda como comparador. Como de costume, o comparador deve retornar um valor booleano, indicando se o elemento passado como primeiro argumento é considerado anterior ao segundo na ordem estrita e fraca específica que define.
Demo online
2. Solução C ++ 11 moderna
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s(cmp);
Antes do C ++ 20, precisamos passar lambda como argumento para definir o construtor
Demo online
3. Semelhante à primeira solução, mas com função em vez de lambda
Faça comparador como função booleana usual
bool cmp(int a, int b) {
return ...;
}
Em seguida, use-o desta forma:
std::set<int, decltype(cmp)*> s(cmp);
Demo online
ou assim:
std::set<int, decltype(&cmp)> s(&cmp);
Demo online
4. Solução antiga usando struct com ()
operador
struct cmp {
bool operator() (int a, int b) const {
return ...
}
};
// ...
// later
std::set<int, cmp> s;
Demo online
5. Solução alternativa: crie uma estrutura a partir da função booleana
Pegue a função booleana
bool cmp(int a, int b) {
return ...;
}
E faça uma estrutura a partir dele usando std::integral_constant
#include <type_traits>
using Cmp = std::integral_constant<decltype(&cmp), &cmp>;
Finalmente, use a estrutura como comparador
std::set<X, Cmp> set;
Demo online