如果这篇博客帮助到你,可以请我喝一杯咖啡~
CC BY 4.0 (除特别声明或转载文章外)
一 重载 operator< 运算符
对于自定义的类,如果我们要比较大小或者使用 sort
排序,我们可以通过重载类的 operator<
运算符来完成:
#include<bits/stdc++.h>
using namespace std;
struct person
{
string name;
string ID;
string sex;
int age;
bool operator<(const person& per)
{
if (age != per.age)
return age < per.age;
else if (sex != per.sex)
return sex < per.sex;
else
return ID < per.ID;
}
};
int main(void)
{
person a = { "zhang san", "1999", "男", 27 };
person b = { "xiao si", "2000", "男", 27 };
bool flg = a < b;
vector<person> v;
v.push_back(b);
v.push_back(a);
sort(v.begin(), v.end());
return 0;
}
二 重载 operator() 运算符
通过在类中重写 operator()
运算符,然后在 sort
函数中传入一个仿函数对象:
struct person
{
string name;
string ID;
string sex;
int age;
};
template<class T>
struct MyLess
{
bool operator()(const T& lhs, const T& rhs)
{
if (lhs.age != rhs.age)
return lhs.age < rhs.age;
else if (lhs.sex != rhs.sex)
return lhs.sex < rhs.sex;
else
return lhs.ID < rhs.ID;
}
};
int main(void)
{
person a = { "zhang san", "1999", "男", 27 };
person b = { "xiao si", "2000", "男", 27 };
vector<person> v;
v.push_back(b);
v.push_back(a);
sort(v.begin(), v.end(), MyLess<person>());
return 0;
}
在 functional
头文件中有 greater
,less
类,其实和上面的实现差不多:
template <class T> struct greater {
bool operator() (const T& x, const T& y) const {return x>y;}
typedef T first_argument_type;
typedef T second_argument_type;
typedef bool result_type;
};
template <class T> struct less {
bool operator() (const T& x, const T& y) const {return x<y;}
typedef T first_argument_type;
typedef T second_argument_type;
typedef bool result_type;
};
三 传入函数指针
只需要把类 MyLess
中的 operator()
函数放到类外并改个名字即可:
#include<bits/stdc++.h>
using namespace std;
struct person
{
string name;
string ID;
string sex;
int age;
};
bool cmp(const person& lhs, const person& rhs)
{
if (lhs.age != rhs.age)
return lhs.age < rhs.age;
else if (lhs.sex != rhs.sex)
return lhs.sex < rhs.sex;
else
return lhs.ID < rhs.ID;
}
int main(void)
{
person a = { "zhang san", "1999", "男", 27 };
person b = { "xiao si", "2000", "男", 27 };
vector<person> v;
v.push_back(b);
v.push_back(a);
sort(v.begin(), v.end(), cmp);
return 0;
}
四 Lambda 表达式
Lambda
表达式通常适合定义比较规则简单的对象比较。并且 Lambda 表达式规则比较灵活,可以在不同的函数调用中定义不同的规则,operator<
一旦写好就只能“从一而终”了。
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
vector<int> v;
v.push_back(9);
v.push_back(5);
v.push_back(2);
v.push_back(7);
sort(v.begin(), v.end(),
[](const int& a, const int& b)->bool {
return a > b; });
return 0;
}
参考文章
- https://blog.csdn.net/cnd2449294059/article/details/77090174
- http://cplusplus.com/reference/algorithm/sort/?kw=sort