1. โซลูชัน C ++ 20 ที่ทันสมัย
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s;
เราใช้ ฟังก์ชันแลมด้าเป็นตัวเปรียบเทียบ ตามปกติตัวเปรียบเทียบควรส่งคืนค่าบูลีนโดยระบุว่าองค์ประกอบที่ส่งผ่านเนื่องจากอาร์กิวเมนต์แรกถือว่าไปก่อนหน้าวินาทีในลำดับที่เข้มงวดเฉพาะที่กำหนดไว้
การสาธิตออนไลน์
2. โซลูชัน C ++ 11 ที่ทันสมัย
auto cmp = [](int a, int b) { return ... };
std::set<int, decltype(cmp)> s(cmp);
ก่อน C ++ 20 เราต้องส่งแลมด้าเป็นอาร์กิวเมนต์เพื่อตั้งค่าตัวสร้าง
การสาธิตออนไลน์
3. คล้ายกับโซลูชันแรก แต่มีฟังก์ชันแทนแลมด้า
ทำให้ตัวเปรียบเทียบเป็นฟังก์ชันบูลีนตามปกติ
bool cmp(int a, int b) {
return ...;
}
จากนั้นใช้วิธีนี้:
std::set<int, decltype(cmp)*> s(cmp);
การสาธิตออนไลน์
หรือวิธีนี้:
std::set<int, decltype(&cmp)> s(&cmp);
การสาธิตออนไลน์
4. โซลูชันเก่าโดยใช้โครงสร้างร่วมกับ()
ตัวดำเนินการ
struct cmp {
bool operator() (int a, int b) const {
return ...
}
};
// ...
// later
std::set<int, cmp> s;
การสาธิตออนไลน์
5. โซลูชันทางเลือก: สร้างโครงสร้างจากฟังก์ชันบูลีน
ใช้ฟังก์ชันบูลีน
bool cmp(int a, int b) {
return ...;
}
และสร้างโครงสร้างจากมันโดยใช้ std::integral_constant
#include <type_traits>
using Cmp = std::integral_constant<decltype(&cmp), &cmp>;
สุดท้ายใช้โครงสร้างเป็นตัวเปรียบเทียบ
std::set<X, Cmp> set;
การสาธิตออนไลน์