1. Giải pháp C ++ 20 hiện đại
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s;
Chúng tôi sử dụng hàm lambda làm bộ so sánh. Như thường lệ, bộ so sánh sẽ trả về giá trị boolean, cho biết liệu phần tử được truyền làm đối số đầu tiên có được coi là đi trước phần tử thứ hai theo thứ tự yếu nghiêm ngặt cụ thể mà nó xác định hay không.
Bản demo trực tuyến
2. Giải pháp C ++ 11 hiện đại
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s(cmp);
Trước C ++ 20, chúng ta cần truyền lambda làm đối số để đặt hàm tạo
Bản demo trực tuyến
3. Tương tự như giải pháp đầu tiên, nhưng với hàm thay vì lambda
Tạo bộ so sánh như hàm boolean thông thường
bool cmp(int a, int b) {
return ...;
}
Sau đó, sử dụng nó, theo cách này:
std::set<int, decltype(cmp)*> s(cmp);
Bản demo trực tuyến
hoặc theo cách này:
std::set<int, decltype(&cmp)> s(&cmp);
Bản demo trực tuyến
4. Giải pháp cũ sử dụng struct với ()
toán tử
struct cmp {
bool operator() (int a, int b) const {
return ...
}
};
// ...
// later
std::set<int, cmp> s;
Bản demo trực tuyến
5. Giải pháp thay thế: tạo struct từ hàm boolean
Lấy hàm boolean
bool cmp(int a, int b) {
return ...;
}
Và tạo cấu trúc từ nó bằng cách sử dụng std::integral_constant
#include <type_traits>
using Cmp = std::integral_constant<decltype(&cmp), &cmp>;
Cuối cùng, sử dụng struct làm trình so sánh
std::set<X, Cmp> set;
Bản demo trực tuyến