180228-关于二级排序、运算符重载

参考资料:算法基础(北京大学)av10046345,王道机试指南

在枚举例题—讨厌的青蛙中为了优化枚举顺序,对plant结构体数组先进行了一次sort()排序,由于plant表示坐标含有x,y两个分量,我们希望定义一个比较的规则:先比较x,若x相等则比较y。

其中一种方法是,使用(arg,arg+n)两个参数的sort函数,然后重载操作符“小于号”:

 

bool operator < (const PLANT &p1, const PLANT &p2){
	if(p1.x==p2.x){
		return p1.y<p2.y;	//转换为一般“小于号”
	}else{
		return p1.x<p2.x;
	}
}

另一种实现方式,是使用带cmp参数的sort(arg,arg+n,cmp),然后编写cmp函数:
 

bool cmp1(const PLANT &p1,const PLANT &p2){
	if(p1.x==p2.x){
		return p1.y<p2.y;
	}else return p1.x<p2.x;
}

此外,对于自定义的多维结构体来说,可以自带比较规则(重载运算符)

struct node{
	int x,y;
	bool operator < (const node & a) const	{
		return x<a.x;
	}    //规定 x小的node才算小node
};
#include<cstdio>
#include<queue>
using namespace std;
struct node{
	int x,y;
	bool operator < (const node & a) const	{
		return x<a.x;
	}
}k;
priority_queue <node> q;//使用优先队列,优先权的规则已经在node中定义好了
int main(){
	k.x=10,k.y=100; q.push(k);
	k.x=12,k.y=60; q.push(k);
	k.x=14,k.y=40; q.push(k);
	k.x=6,k.y=80; q.push(k);
	k.x=8,k.y=20; q.push(k);
	while(!q.empty())	{
		node m=q.top(); q.pop();
		printf("(%d,%d) ",m.x,m.y);
        //输出 (14,40) (12,60) (10,100) (8,20) (6,80)
        //是按照node.x从大到小排序的
	}
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值