涉及到结构体排序时,就需要写比较函数设置结构体的优先级(priority_queue、sort、map、set)
文章目录
1、普通比较函数cmp
//作为普通函数重载
struct node
{
double y,lx,rx;
int val;
}line[manx];
bool cmp(node a,node b)
{
return a.y<b.y;
}
使用:
sort(line,line+n,cmp);
2、结构体内嵌比较函数(写法1)
//作为友元函数重载
struct node
{
double y,lx,rx;
int val;
friend bool operator<(node a,node b)//重载小于号“<”
{
return a.y<b.y;//y大的优先级高
}
}line[manx];
或:
struct node
{
double y,lx,rx;
int val;
}line[manx<<1];
bool operator<(node a,node b)
{
return a.y<b.y;
}
使用:
sort(line,line+n);
priority_queue<node>qu;
注:当结构体内数据较为庞大时,建议用引用来提高效率,即比较类的参数中加上const和&(取引用时,不用复制这个结构体或者这个类,加快了速度)
friend bool operator<(const node &a,const node &b)
bool operator()(const node &a,const node &b)
3、结构体内嵌比较函数(写法2)
//作为成员函数重载
//前面三种写法的区别就是可以访问的类成员变量不同,涉及到c++面向对象的内容
struct node
{
double y,lx,rx;
int val;
bool operator<(node &b)const
{
return y<b.y;
}
}line[manx];
使用(同2):
sort(line,line+n);
priority_queue<node>qu;
4、用struct包装一个cmp函数(写法3)
struct node
{
double y,lx,rx;
int val;
} line[manx];
struct cmp
{
bool operator()(node a,node b)
{
return a.y>b.y;
}
};
使用:
sort(line,line+n,cmp());
priority_queue<node,vector<node>,cmp>qu;
附1:基本数据类型的优先级设置(int、double、char等)
less< int >表示数字大的有优先级越大,greater< int >相反
这两种定义时等价的
priority_queue<int>qu;
priority_queue<int,vector<int>,less<int> >qu;
如果想让优先队列总是把最小的元素放队首,则定义如下
priority_queue<int,vector<int>,greater<int> >qu;
附2: 重载*号
mat operator *(const mat &x,const mat &y)//重载运算符
{
mat ans=init;
for(int i=0; i<m; i++)
for(int j=0; j<m; j++)
for(int k=0; k<m; k++)
ans.a[i][j]=(x.a[i][k]*y.a[k][j]%mod+ans.a[i][j])%mod;
return ans;
}
现在A,B两个矩阵就可以直接相乘了===>A*B