Ich versuche, die Standardreihenfolge der Elemente in einer Reihe von Ganzzahlen so zu ändern, dass sie lexikografisch statt numerisch sind, und ich kann Folgendes nicht mit g ++ kompilieren:
file.cpp:
bool lex_compare(const int64_t &a, const int64_t &b)
{
stringstream s1,s2;
s1 << a;
s2 << b;
return s1.str() < s2.str();
}
void foo()
{
set<int64_t, lex_compare> s;
s.insert(1);
...
}
Ich erhalte folgende Fehlermeldung:
error: type/value mismatch at argument 2 in template parameter list for ‘template<class _Key, class _Compare, class _Alloc> class std::set’
error: expected a type, got ‘lex_compare’
Was mache ich falsch?
std::set<int64_t, decltype(&lex_compare)> s(&lex_compare)
1. Moderne C ++ 20-Lösung
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
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
Dann benutze es entweder so:
Online-Demo
oder so:
Online-Demo
4. Alte Lösung mit struct mit
()
OperatorOnline-Demo
5. Alternative Lösung: Erstellen Sie eine Struktur aus einer Booleschen Funktion
Nehmen Sie die Boolesche Funktion
Und machen Sie daraus Struktur mit
std::integral_constant
Verwenden Sie schließlich die Struktur als Komparator
Online-Demo
quelle
Yacobys Antwort inspiriert mich, einen Adapter zum Einkapseln der Funktor-Boilerplate zu schreiben.
Wow, ich denke das war die Mühe wert!
quelle
Sie können einen Funktionskomparator verwenden, ohne ihn wie folgt zu verpacken:
Dies ist irritierend, wenn Sie jedes Mal einen Satz dieses Typs benötigen, und kann Probleme verursachen, wenn Sie nicht alle Sätze mit demselben Komparator erstellen.
quelle
std::less<>
bei Verwendung von benutzerdefinierten Klassen mitoperator<
Wenn Sie es mit einem Satz Ihrer benutzerdefinierten Klasse zu tun haben, der
operator<
definiert wurde, können Sie ihn einfach verwendenstd::less<>
.Wie unter http://en.cppreference.com/w/cpp/container/set/find erwähnt, hat C ++ 14 zwei neue
find
APIs hinzugefügt :mit denen Sie Folgendes tun können:
main.cpp
Kompilieren und ausführen:
Weitere Informationen
std::less<>
finden Sie unter: Was sind transparente Komparatoren?Getestet unter Ubuntu 16.10,
g++
6.2.0.quelle