目录
编辑优先队列
头文件:#include《queue》;即可
访问:只能访问队首.top()
添加。push(元素),按优先级排列
删除。pop(),删除队首元素(堆顶)
删除编辑
判空。empty()
元素个数。size()
优先级设置:
定义语句调节
结构体调节:
结构体内部+第一中定义(短)
结构体外部+第二中定义(长)
引用
用途
编辑
优先队列
与入队顺序无关,只与优先级有关,优先级最高的在队首。
头文件:#include《queue》;即可
访问:只能访问队首.top()
乍一看,和set一样,但是set支持随机访问,pq只能访问队首(最值),set全局排序,pq只找出max or min
和queue还挺不一样的,queue是front,不能用top
添加。push(元素),按优先级排列
删除。pop(),删除队首元素(堆顶)
删除
判空。empty()
元素个数。size()
优先级设置:
定义语句调节
最大元素在队首:
priority_queue<int> pq;
priority_queue<int,vector<int>,less<int>> pq;
最小元素在队首 :
priority_queue<int,vector<int>,greater<int>> pq;
结构体调节:
这段代码总是报错。。。
结构体内部+第一中定义(短)
利用友元函数bool重载小于号【如果要二级排序也可以自定义】
#include <cstdio>
#include <queue>
#include <vector>
#include <set>
#include <string>
#include <iostream>
#include <map>
using namespace std;
//priority_queue<int> pq;
struct fruit
{int price;string name;
//构造函数写在结构体内部
//fruit(int price,string name)
//{price=price;name=name;
// }
//定义友元函数
friend bool operator < (friut f1,fruit f2)
{return f1.price<f2.price;
}
};
priority_queue<fruit> pq;
int main()
{
// fruit
//pq.push(fruit(5,"pear"));
//pq.push(fruit(4,"apple"));
//pq.push(fruit(6,"cherries"));
//cout<<pq.top();
}
这TM有区别吗????
破案了,fruit拼错了……,感谢智谱清言
这之后创建优先队列的时候,不能这样
而是
priority_queue<fruit> pq;
这是一段代码示例,由于重载时return>,所以数字小的在前面,最终输出的是四块钱的苹果
#include <cstdio>
#include <queue>
#include <vector>
#include <set>
#include <string>
#include <iostream>
#include <map>
using namespace std;
//priority_queue<int> pq;
struct fruit
{
string name;
int price;
//构造函数写在结构体内部
fruit(int price1,string name1)
{price=price1;name=name1;
//这里不能参数和结构体同名,不然算不对
}
//定义友元函数
friend bool operator < (fruit f1,fruit f2)
{return f1.price >f2.price ;
}
};
priority_queue<fruit> pq;
int main()
{
// fruit
pq.push(fruit(5,"pear"));
pq.push(fruit(4,"apple"));
pq.push(fruit(6,"cherries"));
cout<<pq.top().name;
}
与cmp相反,优先队列
如果值一样,优先不动队首元素
结构体外部+第二中定义(长)
#include <cstdio>
#include <queue>
#include <vector>
#include <set>
#include <string>
#include <iostream>
#include <map>
using namespace std;
//priority_queue<int> pq;
struct fruit
{
string name;
int price;
//构造函数写在结构体内部
fruit(int price1,string name1)
{price=price1;name=name1;
//这里不能参数和结构体同名,不然算不对
}
//
定义友元函数
//friend bool operator < (fruit f1,fruit f2)
//{return f1.price >f2.price ;
// }
};
struct cmp_of_fruit
{
bool operator () (fruit f1,fruit f2)
{if(f1.price!=f2.price)return f1.price>f2.price;//便宜的优先
else return f1.name<f2.name; //首字母靠后的优先
}
};
priority_queue<fruit,vector<fruit>,cmp_of_fruit> pq;
int main()
{
// fruit
pq.push(fruit(5,"pear"));
pq.push(fruit(4,"apple"));
pq.push(fruit(4,"cherries"));
cout<<pq.top().name;
}
引用
可以加引用提高效率:我只加了两个&&,代码依旧。
#include <cstdio>
#include <queue>
#include <vector>
#include <set>
#include <string>
#include <iostream>
#include <map>
using namespace std;
//priority_queue<int> pq;
struct fruit
{
string name;
int price;
//构造函数写在结构体内部
fruit(int price1,string name1)
{price=price1;name=name1;
//这里不能参数和结构体同名,不然算不对
}
//
定义友元函数
//friend bool operator < (fruit f1,fruit f2)
//{return f1.price >f2.price ;
// }
};
struct cmp_of_fruit
{
bool operator () (fruit &f1,fruit &f2)
{if(f1.price!=f2.price)return f1.price>f2.price;//便宜的优先
else return f1.name<f2.name; //首字母靠后的优先
}
};
priority_queue<fruit,vector<fruit>,cmp_of_fruit> pq;
int main()
{
// fruit
pq.push(fruit(5,"pear"));
pq.push(fruit(4,"apple"));
pq.push(fruit(4,"cherries"));
cout<<pq.top().name;
}
用途