原文链接: https://blog.csdn.net/qq_43827595/article/details/99546055
结构体内嵌比较函数:
基本用法:
struct node
{
int l, r;
bool operator< (const node &v)const{
return r < v.r;
}
} v[maxn];
- 可以这样理解:r表示当前node的r,而v.r可以认为是下一个node的r,于是就是从小到大排序
结合优先队列的用法:
struct node
{
int l, r;
bool operator < (const node &v)const
{
return r > v.r;
}
};
priority_queue<node> q;
- sort默认为从小到大排序,优先队列默认为从大到小。
- 所以这个优先队列是按r小的优先出队,因为根据结构体定义r小的node大
说明:
结构体内嵌比较函数后可以直接sort(v, v+n);
这和直接写一个比较的函数类似:
bool cmp(node a,node b){
return a.r<b.r;
}
再用sort(v, v+n, cmp)即可;
但这种排序的方法比结构体内嵌比较函数慢很多。
举例:
Description
定义一个学生结构体,含学号(一维字符数组)、姓名、成绩(整型)。从键盘输入n(n<20),再输入n个学生的信息,按学生成绩从小到大顺序输出学生信息。
Input
输入一个n,接着输入n个学生的信息。
Output
按成绩从小到大顺序输出学生信息。
Sample Input
4
1001
Li
76
1002
Zhang
92
1003
Liu
85
1004
Wang
70
Sample Output
1004 Wang 70
1001 Li 76
1003 Liu 85
1002 Zhang 92
代码
sort函数利用cmp
#include<iostream>
#include<algorithm>
using namespace std;
struct st{
char a[100];
char name[100];
int score;
}s[30];
int cmp(const st &s1,const st &s2){
return s1.score < s2.score;
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%s", s[i].a);
scanf("%s", s[i].name);
scanf("%d", &s[i].score);
}
sort(s,s+n,cmp);
for(int i=0;i<n;i++){
printf("%s %s %d\n",s[i].a,s[i].name,s[i].score);
}
}
sort函数利用结构体内嵌比较函数
结构体定义如下:
struct node{
char a[100], name[100];
int score;
bool operator <(const node &m)const{
return score < m.score;
}
} s[30];
//将上面的sort函数改为:
sort(s, s + n);
这里没看明白,结构体中定义的应该是r从大到小排列。为什么r小的node就大
这里的node是指结构体struct node 还是指的是指针,可以理解为排在后面的指针就大吗
求大佬指点!!
因为这里我重新定义了 <,如果operator <里面是return r < v.r,那就是你说的r大的node大,但这里我故意反了下,所以是r小的node大。
记住,一定要写两个const,后面那个楼主忘写了,100分变0分了(评测机语言环境不一样,CE了)!!!
哪个地方要加const(我还真没注意🐶)
哎呀,我指的楼主是我,抱歉抱歉,说错了,应该说”我忘写了“而不是“楼主忘写了”,就是(const node &v)const,这后面的const,一旦没加,有的OJ就会CE
哈哈,没事没事
可以请教一下者两个const的意义吗?这里不想死记硬背
可以看下我写的这篇博客 https://ugirc.blog.csdn.net/article/details/100730769
请问为啥只重载<运算符,不能重载>运算符呢?
这是个很好的问题。实际上是可以重载>运算符,但是呢sort里面有个参数默认是less[HTML_REMOVED]()仿函数,如果想用>,可以把那个参数改成greater[HTML_REMOVED]()
明白了,谢谢大佬指教
struct node{
int h;//小时
int m;//分钟
int s;//秒
int t;
bool operator < (const node &a)const{
if(h != a.h) return h < a.h;
else if(h == a.h && m != a.m) return m < a.m;
else if(h == a.h && m == a.m && s != a.s) return s < a.s;
}
}cl[86405];
想问一下这个为什么没排序成功
楼主 如果结构体中两个参数,按第一个参数降序排序,按第二个参数升序排序,用内嵌比较函数怎么写呀
写成if xxx return true的形式
会了会了 哈哈哈 谢谢楼主
你好,我想问一下当有三个及多个参数时,怎么将结构体内嵌比较函数转换为 比较函数作为一个参数传入sort函数中 ,这两种方式之间怎么转换呢? (当参数不是一个时)
你是指哪里有多个参数,我没太明白你问的😂 有具体代码吗
博主写的很好,我自己稍微总结一下。实现自定义的排序方式有两种方法。1.重载结构体中的小于号;2,实现结构比较函数作为一个参数传入sort函数中。
👍
为什么只能重载小于号呢? (> ,>=,<= 好像都不行)
最好发下你的代码
在本文最后的sort中
bool operator >(const node &m)const{
return m.score > score;
为什么这样写不行呢?
m.score表示下一个节点,score表示当前节点,你return里是小于的关系,但外面却重载为了>
那这里重载比大小的符号的话,那岂不是只需要只重载一个小于号嘛,然后情况都以返回值来定