结构体内嵌比较函数bool operator < (const node &x) const {}
参考blog地址:结构体内嵌比较函数bool operator < (const node &x) const {}_在struct里面加上bool operator-CSDN博客
实际应用:
承担排序功能eg:
AcWing 908. 最大不相交区间数量 - AcWing
Code Simple:
在struct内部使用operator重载 ‘<’ 运算符在sort()函数中小小降低时间复杂度
另外operator必须set所有情况sort才能正常进行
#include<iostream> #include<algorithm> using namespace std; const int MAX_N = 1005; // 定义 n 的最大值 int n; // 定义学生信息的结构体 typedef struct SII{ char id[5]; int Math; int Engl; int Chin; int all; bool operator < (const SII & b) const { //实际上实现的是如果是true就把比较符两边的对象按照 < 升序依次放上 //当两个对象相等时,没有必要继续比较其他字段,因为在这种情况下它们应该被视为相等 if (Math != b.Math) return Math > b.Math; // 按照数学成绩降序排序 if (Engl != b.Engl) return Engl > b.Engl; // 如果数学成绩相等,则按照英语成绩降序排序 if (Chin != b.Chin) return Chin > b.Chin; // 如果数学和英语成绩都相等,则按照语文成绩降序排序 if (all != b.all) return all > b.all; // 如果三科成绩都相等,则按照总分降序排序 return id < b.id; // 如果总分也相等,则按照学号升序排序 } }SII; SII a[MAX_N]; void solve(/*SII a[],*/ const int n){ // 输入学生信息 for(int i = 1; i <= n; i++) { cin >> a[i].id >> a[i].Math >> a[i].Engl >> a[i].Chin; a[i].all = a[i].Math + a[i].Engl + a[i].Chin; // 计算总分 } // 根据定义的运算符 < 对结构体数组进行排序 sort(a + 1, a + n + 1); // 输出排序后的学生信息 for(int i = 1; i <= n; i++){ cout << a[i].id << " " << a[i].Math << " " << a[i].Engl << " " << a[i].Chin << " " << a[i].all << endl; } } int main(){ cin >> n; //SII a[MAX_N]; // 定义大小为 MAX_N 的结构体数组 solve(/*a,*/ n); }
#include<iostream> #include<algorithm> using namespace std; const int MAX_N = 1005; // 定义 n 的最大值 int n; // 定义学生信息的结构体 typedef struct SII{ char id[5]; int Math; int Engl; int Chin; int all; bool operator < (const SII & b) const{ if(Math > b.Math) return true; else if(Math < b.Math) return false; else if(Math == b.Math && Engl > b.Engl) return true; else if(Math == b.Math && Engl < b.Engl) return false; else if(Math == b.Math && Engl == b.Engl && Chin > b.Chin) return true; else if(Math == b.Math && Engl == b.Engl && Chin < b.Chin) return false; else if(Math == b.Math && Engl == b.Engl && Chin == b.Chin && all > b.all) return true; else if(Math == b.Math && Engl == b.Engl && Chin == b.Chin && all < b.all) return false; else if(Math == b.Math && Engl == b.Engl && Chin == b.Chin && all == b.all && id < b.id) return true; else if(Math == b.Math && Engl == b.Engl && Chin == b.Chin && all == b.all && id > b.id) return false; } }SII; int main() { cin >> n; SII a[MAX_N]; // 定义大小为 MAX_N 的结构体数组 // 输入学生信息 for(int i = 0; i < n; i++) { cin >> a[i].id >> a[i].Math >> a[i].Engl >> a[i].Chin; a[i].all = a[i].Math + a[i].Engl + a[i].Chin; // 计算总分 } // 根据定义的运算符 < 对结构体数组进行排序 sort(a, a + n); // 输出排序后的学生信息 for(int i = 0; i < n; i++) { cout << a[i].id << " " << a[i].Math << " " << a[i].Engl << " " << a[i].Chin << " " << a[i].all << endl; } return 0; }
C++中的unordered_map用法详解
参考blog地址:
C++中的unordered_map用法详解-CSDN博客实际应用: