废话不多少,直接上内容!
struct node{
string name;
int price;
friend bool operator < (node a, node b){
return a.price>b.price;
}
};
这个时候你可能会问:
friend bool operator < (node a, node b){
return a.price>b.price;
}
这句话是什么功能呢?
参考《算法笔记》这本书:friend为友元(我觉得目前没必要知道,万事找百度哦!)
bool operator < (node a, node b)即对node类型(此处是结构体类型)的操作符 < 进行重载,(重载 > 会编译错误)
return a.price>b.price;是重载之后 < 的作用。
举几个栗子:
1、优先队列(struct类型)<的重载
struct node{
string name;
int price;
friend bool operator < (node a, node b){
return a.price>b.price;
}
};
int main()
{
priority_queue<node> q;
一些赋值操作;
}
我们都知道,优先队列内部是自动按照从大到小的顺序排列的,重载<之后,作用与原来相反,所以此时重载之后的优先队列内是按照price从小到大排列的,需要特别注意一下!
2、普通结构体内排序,省时
struct node{
string name;
int price;
friend bool operator < (node a, node b){
return a.price>b.price;
}
}a[maxn];
sort(a,a+maxn);
sort(a,a+maxn)默认是按照从小到大的顺序排列的,但是由于在结构体内重载了 < ,所以此时sort是按照从大到小的顺序排列的。此外还有另一种写法:
struct node{
string name;
int price;
}a[maxn];
bool cmp(node a,node b)
{
return a.price>b.price;
}
sort(a,a+maxn,cmp);
但是这么写的话有一个缺点,在一些数据范围非常大的算法题目中,这么写有可能会超时,所以更好的写法是在结构体内重载,而不是在写一个cmp函数,要慢慢养成这样写的好习惯。
另外还有一种写法:
struct node{
double num;
int pos;
bool operator <(const node& b)const
{
return num>b.num;
}//如果再单独写一个cmp会超时
}c[maxn]
之前提到friend是友元,那这种写法就是成员了。
目前认识浅显,推荐大佬的博客,可以有更深入详细的学习。其中也包括其他运算符的重载。