六一的部落格


关关难过关关过,前路漫漫亦灿灿。



新加入的元素按优先级安排位置, 使用小于运算符 < 确定相对优先级

默认大顶堆, 出队顺序为优先级从高到低

小顶堆: 出队顺序为优先级从低到高

默认使用vector作为底层容器, 使用堆算法将vector中元素构造成堆结构


头文件

1#include <queue>

优先级队列支持的底层容器

顺序容器
array X
vector/string O
deque O
list X
forward_list X

要求底层容器支持随机访问


优先级队列操作与对底层容器的要求

底层实现
pop 优先级最高的元素出队 pop_back
top 获取优先级最高的元素 front
push 入队 push_back
emplace 入队 emplace_back
1s.pop();        
2
3s.top();
4
5s.push(item);   
6
7s.emplace(args);     
堆接口
pop_heap 将优先级最高的元素移动到容器尾部 先执行pop_heap, 再调用pop_back
push_heap 将元素按优先级排序, 存储为堆结构; 首元素优先级最高 先执行push_back/emplace_back, 再调用push_heap

示例

 1#include <iostream>
 2#include <queue>
 3
 4using namespace std;
 5
 6int main()
 7{
 8    // priority_queue<int> pq; // 大顶堆
 9    // <=>
10    // priority_queue<int, vector<int>, less<int>> pq; 
11    priority_queue<int, vector<int>, greater<int>> pq; // 小顶堆
12
13    pq.push(5);
14    pq.push(7);
15    pq.push(3);
16
17    while (!pq.empty())
18    {
19        cout << pq.top() << "\t";
20        pq.pop();
21    }
22    return 0;
23}
24
25// 大顶堆出队顺序: 7	5	3
26// 小顶堆出队顺序: 3	5	7

便签

-
priority_queue及其底层实现
priority_queue和堆
priority_queue

顺序容器适配器: 优先级队列


新加入的元素按优先级安排位置, 使用小于运算符 < 确定相对优先级

默认大顶堆, 出队顺序为优先级从高到低

小顶堆: 出队顺序为优先级从低到高

默认使用vector作为底层容器, 使用堆算法将vector中元素构造成堆结构


头文件

1#include <queue>

优先级队列支持的底层容器

顺序容器
array X
vector/string O
deque O
list X
forward_list X

要求底层容器支持随机访问


优先级队列操作与对底层容器的要求

底层实现
pop 优先级最高的元素出队 pop_back
top 获取优先级最高的元素 front
push 入队 push_back
emplace 入队 emplace_back
1s.pop();        
2
3s.top();
4
5s.push(item);   
6
7s.emplace(args);     
堆接口
pop_heap 将优先级最高的元素移动到容器尾部 先执行pop_heap, 再调用pop_back
push_heap 将元素按优先级排序, 存储为堆结构; 首元素优先级最高 先执行push_back/emplace_back, 再调用push_heap

示例

 1#include <iostream>
 2#include <queue>
 3
 4using namespace std;
 5
 6int main()
 7{
 8    // priority_queue<int> pq; // 大顶堆
 9    // <=>
10    // priority_queue<int, vector<int>, less<int>> pq; 
11    priority_queue<int, vector<int>, greater<int>> pq; // 小顶堆
12
13    pq.push(5);
14    pq.push(7);
15    pq.push(3);
16
17    while (!pq.empty())
18    {
19        cout << pq.top() << "\t";
20        pq.pop();
21    }
22    return 0;
23}
24
25// 大顶堆出队顺序: 7	5	3
26// 小顶堆出队顺序: 3	5	7

便签

-
priority_queue及其底层实现
priority_queue和堆
priority_queue