1. Solution C ++ 20 moderne
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s;
Nous utilisons la fonction lambda comme comparateur. Comme d'habitude, le comparateur doit retourner une valeur booléenne, indiquant si l'élément passé en tant que premier argument est considéré comme précédant le second dans l'ordre strict strict qu'il définit.
Démo en ligne
2. Solution C ++ 11 moderne
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s(cmp);
Avant C ++ 20, nous devons passer lambda comme argument pour définir le constructeur
Démo en ligne
3. Similaire à la première solution, mais avec fonction au lieu de lambda
Rendre le comparateur comme une fonction booléenne habituelle
bool cmp(int a, int b) {
return ...;
}
Ensuite, utilisez-le, soit de cette façon:
std::set<int, decltype(cmp)*> s(cmp);
Démo en ligne
ou de cette façon:
std::set<int, decltype(&cmp)> s(&cmp);
Démo en ligne
4. Ancienne solution utilisant struct avec ()
opérateur
struct cmp {
bool operator() (int a, int b) const {
return ...
}
};
// ...
// later
std::set<int, cmp> s;
Démo en ligne
5. Solution alternative: créer une structure à partir d'une fonction booléenne
Prendre la fonction booléenne
bool cmp(int a, int b) {
return ...;
}
Et en faire une structure en utilisant std::integral_constant
#include <type_traits>
using Cmp = std::integral_constant<decltype(&cmp), &cmp>;
Enfin, utilisez la structure comme comparateur
std::set<X, Cmp> set;
Démo en ligne