1. Nowoczesne rozwiązanie C ++ 20
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s;
Używamy funkcji lambda jako komparatora. Jak zwykle, komparator powinien zwrócić wartość logiczną, wskazującą, czy element przekazany jako pierwszy argument jest uważany za znajdujący się przed drugim w określonym ścisłym porządku, który definiuje.
Demo online
2. Nowoczesne rozwiązanie C ++ 11
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s(cmp);
Przed C ++ 20 musimy przekazać lambdę jako argument do konstruktora set
Demo online
3. Podobny do pierwszego rozwiązania, ale z funkcją zamiast lambdy
Uczyń komparator jak zwykle funkcją boolowską
bool cmp(int a, int b) {
return ...;
}
Następnie użyj go w ten sposób:
std::set<int, decltype(cmp)*> s(cmp);
Demo online
lub w ten sposób:
std::set<int, decltype(&cmp)> s(&cmp);
Demo online
4. Stare rozwiązanie wykorzystujące strukturę struct z ()
operatorem
struct cmp {
bool operator() (int a, int b) const {
return ...
}
};
// ...
// later
std::set<int, cmp> s;
Demo online
5. Rozwiązanie alternatywne: utwórz strukturę z funkcji boolowskiej
Weź funkcję boolowską
bool cmp(int a, int b) {
return ...;
}
I utwórz z niego strukturę za pomocą std::integral_constant
#include <type_traits>
using Cmp = std::integral_constant<decltype(&cmp), &cmp>;
Na koniec użyj struktury jako komparatora
std::set<X, Cmp> set;
Demo online