参考资料:算法基础(北京大学)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从大到小排序的
}
}