priority_queue的常见用法
priority_queue是什么?
- 优先队列
- 底层实现用堆来实现
- 每次队首的优先级最大
priority_queue的定义
引入头文件
# include <queue>
using namespace std;
定义使用
priority_queue<typename> name;
容器内元素的访问
只能通过top()函数来访问队首的元素
priority_queue<int> q;
q.push(4);
q.push(3);
q.push(2);
cout<<q.top()<<endl;//4
priority_queue常用函数解析
push()
使得元素x入队,时间复杂度为o(logN)。
top()
获取队首的元素,时间复杂度为o(1)
pop()
pop()令队首出队,时间复杂度为o(logN)
empty()
检测队列是否为空,返回true,返回false
size()
返回队列中的元素数量
priority_queue队列优先级的设置
基本数据类型优先级的设置
对于基础类型,一般是数字大的优先级高,对于字符,就是字典序越大,优先级越高。
priority_queue<int> q;
priority_queue<int,vector<int>,less<int>>;
两种定义方式等价
- vector
是承载堆的容器 - less
是比较类,less 表示数字大优先级大,greater 表示数字大,优先级小
结构体优先级设置
重载小于号
例子
struct fruite{
string name;
string price;
};
价格高优先级高
设置友元函数,重载小于号<
struct fruite{
string name;
string price;
friend bool operator <(fruite a,fruite b){
return fruite.price<fruite.price;
}
};
注意
只能重载小于号
如果"重载>"
friend bool operator <(fruite a,fruite b){
return fruite.price>fruite.price;
}
创建比较结构体
struct fruite{
string name;
string price;
};
struct cmp{
bool operator() (fruite a,fruite b){
return a.price>b.price;
}
};
priority_queue<fruite,vector<fruite>,cmp> q;
priority_queue的用途以及注意点
- 解决贪心问题
- 注意在使用top()之前要判空使用empty()