1. Moderna soluzione C ++ 20
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s;
Usiamo la funzione lambda come comparatore. Come al solito, il comparatore dovrebbe restituire un valore booleano, indicando se l'elemento passato come primo argomento è considerato prima del secondo nello specifico ordine rigoroso debole che definisce.
Demo online
2. Moderna soluzione C ++ 11
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s(cmp);
Prima di C ++ 20 dobbiamo passare lambda come argomento per impostare il costruttore
Demo online
3. Simile alla prima soluzione, ma con funzione invece di lambda
Crea comparatore come una normale funzione booleana
bool cmp(int a, int b) {
return ...;
}
Quindi usalo, in questo modo:
std::set<int, decltype(cmp)*> s(cmp);
Demo online
o in questo modo:
std::set<int, decltype(&cmp)> s(&cmp);
Demo online
4. Vecchia soluzione utilizzando struct con ()
operatore
struct cmp {
bool operator() (int a, int b) const {
return ...
}
};
// ...
// later
std::set<int, cmp> s;
Demo online
5. Soluzione alternativa: creare una struttura dalla funzione booleana
Prendi la funzione booleana
bool cmp(int a, int b) {
return ...;
}
E crea struct da esso usando std::integral_constant
#include <type_traits>
using Cmp = std::integral_constant<decltype(&cmp), &cmp>;
Infine, usa la struttura come comparatore
std::set<X, Cmp> set;
Demo online