基本操作
priority_queue又称优先队列,实质就是一个堆结构,堆顶的元素是当前优先队列中优先级最高的那一个。
要使用优先队列,首先要包含下面两句话。
#include<queue>
using namespace std;
priority_queue的常用函数有
push()
top()
pop()
empty()
size()
和queue不同,优先队列不能使用front(),只能使用top()来读取堆顶元素。
优先级的设置
基本类型
优先队列对基本数据类型的优先级设置默认为数字大的优先级越高,如果是字符,那就是字典序大的优先级高。
以下两种写法等价。
priority_queue<int> q;
priority_queue<int, vector<int>, less<int> > q;
第二种写法的vector是用来承载堆底层的容器,第三个参数less表示数字大的优先级大,而如果用greater表示数字小的优先级大。
priority_queue<int, vector<int>, greater<int> > q;
自定义结构体类型
对自定义的结构体,只能重载"<",否则会发生编译错误。
struct fruit {
string name;
int price;
fruit(string _name,int _price) {
name=_name;
price=_price;
}
friend bool operator < (const fruit &f1, const fruit &f2) {
return f1.price < f2.price;
}
};
int main(){
priority_queue<fruit> q;
}
f1.price<f2.price
表示价格高的优先级高,如果希望价格低的优先级高,可以把返回值改为f1.price>f2.price
,这里可以记忆为,默认的数据类型比较是大的更优先,所以当函数内的符号与重载符号相同,就是和默认的相同时,如果相反,那么就是小的优先。
也可以使用第二种方法来定义优先队列:
- 使用struct(注意这里也是一个结构体)定义一个cmp,然后在其内部实现比较函数。
- 重载的是一对小括号"()",而不是小于号"<"。
- 这里不是友元函数,没有friend关键字。
struct fruit {
string name;
int price;
fruit(string _name,int _price) {
name=_name;
price=_price;
}
};
struct cmp {
bool operator () (const fruit &f1, const fruit &f2) {
return f1.price > f2.price;
}
};
int main() {
priority_queue<fruit,vector<fruit>,cmp> q;
}