1. Moderne C ++ 20-Lösung
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s;
Wir verwenden die Lambda-Funktion als Komparator. Wie üblich sollte der Komparator einen booleschen Wert zurückgeben, der angibt, ob das als erstes Argument übergebene Element in der von ihm definierten spezifischen strengen schwachen Reihenfolge vor dem zweiten steht .
Online-Demo
2. Moderne C ++ 11-Lösung
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s(cmp);
Vor C ++ 20 müssen wir Lambda als Argument übergeben, um den Konstruktor zu setzen
Online-Demo
3. Ähnlich wie bei der ersten Lösung, jedoch mit Funktion anstelle von Lambda
Komparator wie gewohnt boolesche Funktion machen
bool cmp(int a, int b) {
return ...;
}
Dann benutze es entweder so:
std::set<int, decltype(cmp)*> s(cmp);
Online-Demo
oder so:
std::set<int, decltype(&cmp)> s(&cmp);
Online-Demo
4. Alte Lösung mit struct mit ()
Operator
struct cmp {
bool operator() (int a, int b) const {
return ...
}
};
// ...
// later
std::set<int, cmp> s;
Online-Demo
5. Alternative Lösung: Erstellen Sie eine Struktur aus einer Booleschen Funktion
Nehmen Sie die Boolesche Funktion
bool cmp(int a, int b) {
return ...;
}
Und machen Sie daraus Struktur mit std::integral_constant
#include <type_traits>
using Cmp = std::integral_constant<decltype(&cmp), &cmp>;
Verwenden Sie schließlich die Struktur als Komparator
std::set<X, Cmp> set;
Online-Demo