1. Modern C ++ 20 çözümü
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s;
Kullanırız Karşılaştırıcı olarak lambda fonksiyonunu . Her zaman olduğu gibi, karşılaştırıcı, ilk bağımsız değişken olarak iletilen öğenin tanımladığı belirli katı zayıf sıralamada ikinciden önce gelip gelmediğini gösteren boole değerini döndürmelidir .
Çevrimiçi demo
2. Modern C ++ 11 çözümü
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s(cmp);
C ++ 20'den önce, yapıcıyı ayarlamak için argüman olarak lambda geçirmemiz gerekir
Çevrimiçi demo
3. İlk çözüme benzer, ancak lambda yerine işlevle
Karşılaştırıcıyı normal boole işlevi olarak yapın
bool cmp(int a, int b) {
return ...;
}
O zaman şu şekilde kullanın:
std::set<int, decltype(cmp)*> s(cmp);
Çevrimiçi demo
veya bu şekilde:
std::set<int, decltype(&cmp)> s(&cmp);
Çevrimiçi demo
4. ()
Operatörlü yapı kullanan eski çözüm
struct cmp {
bool operator() (int a, int b) const {
return ...
}
};
// ...
// later
std::set<int, cmp> s;
Çevrimiçi demo
5. Alternatif çözüm: boole işlevinden yapı oluşturun
Boole işlevini al
bool cmp(int a, int b) {
return ...;
}
Ve kullanarak ondan yapı oluşturun std::integral_constant
#include <type_traits>
using Cmp = std::integral_constant<decltype(&cmp), &cmp>;
Son olarak, yapıyı karşılaştırıcı olarak kullanın
std::set<X, Cmp> set;
Çevrimiçi demo