
priority_queue 与 deque 的使用与模拟实现
在 C++ STL 中,priority_queue 和 deque 是两个重要的容器适配器。它们分别基于堆和双端队列的概念,为不同的应用场景提供了高效的解决方案。本文将深入探讨它们的使用方法、底层实现原理以及在实际开发中的应用选择。
一、priority_queue
1.1 介绍
priority_queue(优先级队列)底层的数据结构是堆,默认容器是 vector。对于堆不太熟悉的建议先了解堆的实现,可见堆一般为顺序存储,所以默认容器选 vector 很合理。 priority_queue 是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。可以在任何时候插入元素,但只能访问位于顶部的最大元素。 优先队列作为容器适配器实现,它使用特定容器类作为底层容器,并提供一组特定的成员函数来访问元素。元素从底层容器的尾部弹出,这个位置被称为优先队列的顶部。 底层容器可以是任何标准容器类模板,也可以是其他专门设计的容器类。该容器必须支持通过随机访问迭代器进行访问,并提供以下操作:
- empty():检查容器是否为空
- size():返回容器中元素的数量
- front():返回容器中第一个元素的引用
- push_back():在容器末尾插入元素
- pop_back():删除容器末尾的元素
标准容器类 vector 和 deque 满足这些要求。默认情况下,如果没有为特定的 priority_queue 实例指定容器类,则使用 vector。 需要支持随机访问迭代器是为了在内部始终保持堆结构。容器适配器通过在需要时自动调用算法函数 make_heap、push_heap 和 pop_heap 来实现这一点。
1.2 使用
总结一下:优先级队列默认使用 vector 作为其底层存储数据的容器,在 vector 上又使用了堆算法将 vector 中元素构造成堆的结构,因此 priority_queue 就是堆,所有需要用到堆的位置,都可以考虑使用 priority_queue。
1. 默认情况下,priority_queue 是大堆。
#include <iostream>
#include <vector>
#include <queue>
#include <functional>
using namespace std;
void test1(){
// 默认情况下,创建的是大堆,其底层按照小于比较
vector<int> v{3, 2, 7, 6, 0, , , , , };
priority_queue<> q1;
(& e : v) q(e);
cout << q() << endl;
priority_queue<, vector<>, greater<>> (v.(), v.());
cout << q() << endl;
}
{
();
;
}





