https://www.acwing.com/blog/content/394/
在T-SHLoRk写的基础上又尝试了几种可能,记下来备用,主要是
一。什么时候只能用小于号重载,什么时只能用大于号重载
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct node {
int x, y;
node() {}
node(int x, int y): x(x), y(y) {}
// 结构体加入优先队列,就必须有两个结构体的比较规则
// 这里x代表当前结构体的x,a.x代表传进来的结构体的x
// 运算符重载主要是为了让数据类型为node的容器可以进行排序,排序的时候使用<进行两个元素的比较
// return x < a.x 时,代表x越小的node在node数组排序时在前面。
// return x > a.x 时,代表x越大的node在node数组排序时在前面。
bool operator<(const node &a)const {
if(x != a.x)
return x < a.x;//可以和重载符一致也可相反,相反时和重载符排序顺序相反
else return y < a.y;//可以和重载符一致也可相反
}
};
struct snode{
int x,y;
snode(){}
snode(int x,int y):x(x),y(y){}
// 结构体加入优先队列,就必须有两个结构体的比较规则
// 这里x代表当前结构体的x,a.x代表传进来的结构体的x
// 运算符重载主要是为了让数据类型为node的容器可以进行排序,排序的时候使用<进行两个元素的比较
// return x < a.x 时,代表x越小的node在node数组排序时在前面。
// return x > a.x 时,代表x越大的node在node数组排序时在前面。
bool operator>(const snode &a)const {
if(x != a.x)
return x < a.x;//可以和重载符一致也可相反,相反时和重载符排序顺序相反
else return y < a.y;//可以和重载符一致也可相反
}
};
int main() {
vector<node> nodeList(6);
nodeList[0] = node(1, 3);
nodeList[1] = node(4, 7);
nodeList[2] = node(2, 5);
nodeList[3] = node(2, 4);
nodeList[4] = node(3, 4);
nodeList[5] = node(5, 5);
vector<snode> snodeList(6);
snodeList[0] = snode(1,3);
snodeList[1] = snode(4,7);
snodeList[2] = snode(2,5);
snodeList[3] = snode(2,4);
snodeList[4] = snode(3,4);
snodeList[5] = snode(5,5);
// 使用nodeList的运算符重载比较函数,node.x越小越在前。sort只能重载小于号
sort(nodeList.begin(), nodeList.end());
for(int i = 0 ; i < 6 ; i ++)
printf("%d %d\n", nodeList[i].x, nodeList[i].y);
puts("\n");
priority_queue<node, vector<node>, less<node>> q1;//结构体只能重载小于号
priority_queue<snode,vector<snode>,greater<snode>> q2;//结构体只能重载大于号
// 现在我们考虑传入的参数是结构体的时候,由于结构体没有默认比较函数,所以我们需要给结构体定义一些比较函数
// 1.假设运算符重载后,node.x 越小的节点在排序时次序越靠前,那么由于优先队列默认是大顶堆的,那么执行如下代码输出,和sort函数是完全相反的顺序
// 5 5
// 4 7
// 3 4
// 2 5
// 2 4
// 1 3
for(int i = 0 ; i < 6 ; i ++)
q1.push(nodeList[i]);
while(!q1.empty())
printf("%d %d\n", q1.top().x, q1.top().y), q1.pop();
puts("\n");
for(int i = 0 ; i < 6 ; i ++)
q2.push(snodeList[i]);
while(!q2.empty())
printf("%d %d\n",q2.top().x,q2.top().y),q2.pop();
puts("\n");
return 0;
}
二。结构体重载运算符和自定义函数在优先队列中排序中自定义比较函数的规则优先
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct node{
int x,y;
node(){}
node(int x,int y):x(x),y(y){}
bool operator< (const node &a)const {
return x < a.x;
}
};
struct cmp
{
bool operator()(const node &a,const node &b)
{
if(b.x != a.x)
return a.x < b.x;
else return a.y < b.y;
}
};
int main()
{
vector<node> nodeList(5);
nodeList[0] = node(1,3);
nodeList[1] = node(2,4);
nodeList[2] = node(2,5);
nodeList[3] = node(3,4);
nodeList[4] = node(5,5);
priority_queue<node,vector<node>,cmp> q4;
for(int i = 0 ; i < 5 ; i ++)
q4.push(nodeList[i]);
while(!q4.empty())
printf("%d %d\n",q4.top().x,q4.top().y),q4.pop();
puts("\n");
return 0;
}
结构体虽然也重载了运算符,但没有生效