C++ priority_queue
priority_queue简介
优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出的行为特征。
头文件
#include \
成员函数
成员函数 |
函数功能 |
top() |
访问队头元素 |
empty() |
队列是否为空(为空返回true) |
size() |
返回队列内元素个数 |
push() |
插入元素到队尾 (并排序) |
emplace() |
原地构造一个元素并插入队列 |
pop() |
弹出队头元素 |
swap() |
交换内容 |
priority_queue的定义
定义:priority_queue<Type, Container, Functional>
Type
就是数据类型,Container
就是容器类型(Container
必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional
就是比较的方式。
当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆。
1 2 3 4 5 6 7 8
| priority_queue <int,vector<int>,greater<int> > q;
priority_queue <int,vector<int>,less<int> >q;
|
示例
基本类型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include <queue> #include <iostream> using namespace std; int main() { priority_queue<int> a; priority_queue<int, vector<int>, greater<int>> c; vector<int> v{ 1,2,3 }; for (int t : v) { a.push(t); c.push(t); }
cout << "大顶堆:"; while (!a.empty()) { cout << a.top() << ' '; a.pop(); } cout << endl;
cout << "小顶堆:"; while (!c.empty()) { cout << c.top() << ' '; c.pop(); } cout << endl;
return 0; }
|
输出:
pair:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <queue> #include <vector> #include <iostream> using namespace std; int main() { priority_queue<pair<int, int>> q; q.push(make_pair(1, 2)); q.push(make_pair(1, 3)); q.push(make_pair(2, 1));
while (!q.empty()) { cout << q.top().first << ' ' << q.top().second << '\n'; q.pop(); }
return 0; }
|
输出:
自定义类型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <queue> #include <iostream> using namespace std;
struct node //运算符重载< { int x;
node(int a) { x = a; } bool operator < (const node& a) const { return x < a.x; } };
struct cmp //重写仿函数 { bool operator() (node a, node b){ return a.x < b.x; } }; int main() { priority_queue<node> q; node a(1); node b(2); node c(3); q.push(b); q.push(c); q.push(a);
while (!q.empty()) { cout << q.top().x << ' '; q.pop(); }
return 0; }
|
输出: