1. Solusi C ++ 20 modern
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s;
Kami menggunakan fungsi lambda sebagai pembanding. Seperti biasa, pembanding harus mengembalikan nilai boolean, yang menunjukkan apakah elemen yang diteruskan sebagai argumen pertama dianggap berada sebelum argumen kedua dalam urutan lemah ketat spesifik yang ditentukannya .
Demo online
2. Solusi C ++ 11 modern
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s(cmp);
Sebelum C ++ 20 kita perlu meneruskan lambda sebagai argumen untuk menyetel konstruktor
Demo online
3. Mirip dengan solusi pertama, tetapi dengan fungsi bukan lambda
Jadikan pembanding seperti fungsi boolean biasa
bool cmp(int a, int b) {
return ...;
}
Kemudian gunakan dengan cara ini:
std::set<int, decltype(cmp)*> s(cmp);
Demo online
atau begini:
std::set<int, decltype(&cmp)> s(&cmp);
Demo online
4. Solusi lama menggunakan struct dengan ()
operator
struct cmp {
bool operator() (int a, int b) const {
return ...
}
};
// ...
// later
std::set<int, cmp> s;
Demo online
5. Solusi alternatif: buat struct dari fungsi boolean
Ambil fungsi boolean
bool cmp(int a, int b) {
return ...;
}
Dan buat struct dari itu menggunakan std::integral_constant
#include <type_traits>
using Cmp = std::integral_constant<decltype(&cmp), &cmp>;
Terakhir, gunakan struct sebagai pembanding
std::set<X, Cmp> set;
Demo online