Satz mit benutzerdefiniertem Komparator kompilieren
Beim Versuch, einen Satz von ganzen Zahlen zu erstellen, die nach lexikografischem Vergleich statt nach numerischem Vergleich geordnet sind, können beim Kompilieren Probleme auftreten mit g .
Der aufgetretene Fehler ist auf einen falschen Vorlagenparametertyp für den Satz zurückzuführen. Im bereitgestellten Code:
set<int64_t, lex_compare> s;
lex_compare ist kein Typ, sondern eine Funktion. Um dies zu beheben, müssen wir ein Vergleichsobjekt gemäß den Vorlagenanforderungen von C erstellen.
Moderne C-Lösungen
1. C 20-Lösung:
auto cmp = [](int64_t a, int64_t b) { return ... }; std::set<int64_t, decltype(cmp)> s;
Lambdas können als Komparatoren in C 20 verwendet werden. Das Lambda sollte einen booleschen Wert zurückgeben, der die Reihenfolge der Elemente angibt.
2 . C 11-Lösung:
auto cmp = [](int64_t a, int64_t b) { return ... }; std::set<int64_t, decltype(cmp)> s(cmp);
In C 11 müssen Lambdas als Argument an den Mengenkonstruktor übergeben werden.
Traditionelle Lösungen
3. Funktionszeiger:
bool cmp(int64_t a, int64_t b) { return ...; } std::set<int64_t, decltype(cmp)*> s(cmp);
4. Struktur mit Operator():
struct cmp { bool operator() (int64_t a, int64_t b) const { return ... } }; std::set<int64_t, cmp> s;
5. Struktur aus boolescher Funktion:
bool cmp(int64_t a, int64_t b) { return ...; } #include <type_traits> using Cmp = std::integral_constant<decltype(&cmp), &cmp>; std::set<int64_t, Cmp> set;
Das obige ist der detaillierte Inhalt vonWie kompiliere ich einen Satz mit einem benutzerdefinierten Komparator in C richtig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!