关于结构体中 operator< 重载对sort和priority_queue(优先队列)的影响

前言

关于在结构体中重载运算法这个问题,起初个人也不算太理解,在浏览许多博文之后发现每个人的解释都不大一样。思考许久之后,决定写一下自己的见解。如果差错,欢迎各位指出。

正题

首先,我们看一个结构体person。

struct person
{
	double height;
	double weight;
	double age;

}p[20];

不难看出,在结构体person中,我们定义了三个double变量:height,weight,age。我们就用这个结构体来表示人的一些属性。

person 小明,小刚;     //定义出来两个人

看完结构体后,再来看三个表达式:
5 > 3 5>3 5>3
35.2 < 45.6 35.2<45.6 35.2<45.6
小 明 < 小 刚 小明<小刚 <
前两个数学表达式在我们看来,十分容易理解。

那么第三个表达式要怎么理解呢?小明的身高小于小刚?小明的体重小于小刚?小明的年龄小于小刚?

因为小明与小刚是人,在我们所熟知的世界中,并没有直接拿两个人直接比较的,比较的只是两个人的某种属性。

那么我们就以年龄为标准,用sort来对peron这个结构体进行排序。

sort(first_pointer,first_pointer+n,cmp);

冷静!sort函数里好像并不能满足我们的意思。那要怎么解决呢?对了,重载!

重载

如果要说重载的话,请读者事先自行了解重载的定义。
请看下图:
一个很明显的重载。
在这里插入图片描述

图一

这个可能就比较抽象一点了,为了更好的解释,我便这样构造了一下。
在这里插入图片描述

图二

我们回过头来再看一下这个公式
小 明 < 小 刚 小明<小刚 <
结合我们的第二幅图,我们就可以通过重载 ‘<’ 让结构体在使用 ‘<’ 进行排序的时候直接找到他要走的那条路。那么我们就可以在结构体重加入重载<的一个函数:

struct person
{
	double height;
	double weight;
	double age;

bool operator<(const person &x) const
	{
		return age < x.age;
	}
	
}p[20];

此处内容,个人理解,可能会有错误,但是可以帮助你理解这个重载函数

首先看重载函数是bool类型,那么只有true或false两种取值,当 age < x.age 为true时,函数的返回值也是true。反之为false。(此处的age == this.age)

此时根据重载,用sort(p,p+20)就可以直接排序了,因为这个时候根据图二,我们可以知道 < 直接重载,可以根据person的age属性来进行比较了。


如果把重载函数中的小于号换成大于号

bool operator<(const person &x) const
	{
		return age > x.age;
	}

那么我们是不是就可以认为,此时的 ‘>’ 和 '<'翻转了,大于是小于,小于才是大于。
这个时候,就相当于我们把原来的顺序给逆序了。

再来谈谈 sort 和 priority_queue

先来看一段代码,大致了解一下sort和priority_queue中的默认排列顺序:

int main()
{

	int a[10];
	int b[10];
	priority_queue<int> q;
	
	for(int i=0;i<10;i++){
		a[i] = i ;
		b[i] = 9 - i ;
		q.push(a[i]);
	}
    //优先队列出队,查看元素排列方式 
	for(int i=0;i<10;i++){
		int t = q.top();
		q.pop();
		cout<<t<<" ";
	}
	cout<<endl;
	//sort对b[10]排序,查看排列方式 
	sort(b,b+10);
	for(int i=0;i<10;i++){
		cout<<b[i]<<" ";
	}
    return 0;
}

在数组a,b中,他们存储的数据应该是这样的:
a :   0   1   2   3   4   5   6   7   8   9 a:  0 1 2  3 4 5 6 7 8 9 a: 0 1 2 3 4 5 6 7 8 9
b :   9   8   7   6   5   4   3   2   1   0 b:  9 8 7  6 5 4 3 2 1 0 b: 9 8 7 6 5 4 3 2 1 0
优先队列中是从a[0]到a[9]依次入队,执行输出后,对比数组a的数据,我们就可以发现他的数据存储是这样的:
a :   0   1   2   3   4   5   6   7   8   9 a:  0 1 2  3 4 5 6 7 8 9 a: 0 1 2 3 4 5 6 7 8 9
p r i o r i t y − q u e u e :   9   8   7   6   5   4   3   2   1   0 priority-queue:  9 8 7  6 5 4 3 2 1 0 priorityqueue: 9 8 7 6 5 4 3 2 1 0
可以说优先队列默认是从队头到队尾依次大到小。

那么再对比原数组b来看看sort:
b :   9   8   7   6   5   4   3   2   1   0 b:  9 8 7  6 5 4 3 2 1 0 b: 9 8 7 6 5 4 3 2 1 0
s o r t :   0   1   2   3   4   5   6   7   8   9 sort:  0 1 2  3 4 5 6 7 8 9 sort: 0 1 2 3 4 5 6 7 8 9
sort默认把数组按从小到大排序。

其实这就是sort和priority_queue中的默认方式:sort为小顶堆,priority_queue为大顶堆。

sort排序就像体育课站队一样,从前到后,依次从小到大(从低到高)。

priority_queue正如优先一词,能力越高越靠前。

结构体重载了<后使用 sort 和 priority_queue

重载了小于号后我们可以根据重载函数中的表达式来判断大于号和小于号是否翻转。如果没有翻转,那么他们还是默认排序,如果翻转了的话,他们的排序就相反。

至于说重载 > 的问题,看一个表达式你就明白了:
a > b = = b < a a>b ==b<a a>b==b<a

有疑问请看这里

如果您有疑问或发现哪里出错,请在评论区留言。感谢您花费时间读完文章,如果对您有帮助就点赞,评论支持一下吧。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

久影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值