1. priority_queue
的介绍
下面是 priority_queue
的介绍,来自于:🏹priority_queue - C++ Reference (cplusplus.com) 的中文翻译,您可以尝试看看。
- 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。
- 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元 素)。
- 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,
queue
提供一组特 定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。- 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭 代器访问,并支持以下操作:
- empty():检测容器是否为空。
- size():返回容器中有效元素个数。
- front():返回容器中第一个元素的引用。
- push_back():在容器尾部插入元素
2. 大堆与小堆
前面的介绍部分已经指明,priority_queue
就是一个堆哈!既然是堆,自然分为大堆与小堆,而我们的 priority_queue
默认是一个大堆哈!
大堆:每个结点的值都大于或等于其左右孩子结点的值。
小堆:每个结点的值都小于或等于其左右孩子结点的值。
这是关于堆这种数据结构较为详细的讲解:C语言数据结构初阶(11)----堆_姬如祎的博客-CSDN博客
下面我也会做一个简单的复习的!
#include<iostream>
#include<queue>
using namespace std;
int main()
{
priority_queue<int> heap;
heap.push(1);
heap.push(2);
heap.push(3);
heap.push(4);
heap.push(5);
heap.push(6);
heap.push(7);
return 0;
}
我们写了上面的代码,向一个大堆中插入了几个数字,那么堆在底层的物理结构与逻辑结构是什么样的呢?
2.1 priority_queue
构建大堆与小堆
构建大堆:priority_queue<int> heap
。
构建小堆:priority_queue<int, vector<int>, greater<int>> heap
。
不用问为什么哈,到模拟实现 priority_queue
你就明白了。
3. priority_queue
接口使用
3.1 void push(const T& val)
这个函数是往堆中插入一个数据,然后经过向上调整算法,使得插入数据后的数组依然满足堆的逻辑结构。向上调整算法会在 priority_queue
的模拟实现中讲到。
3.2 void pop()
这个函数用来删除堆顶的元素。
3.3 T& top()
这个函数可以用来获取堆顶的元素。
3.4 size_t size()
这个函数可以获取堆中数据的个数。
3.5 bool empty()
这个函数可以用来判断一个堆是否为空。
#include<iostream>
#include<queue>
using namespace std;
int main()
{
// 这是一个大堆
priority_queue<int> heap;
heap.push(1);
heap.push(2);
heap.push(3);
heap.push(4);
heap.push(5);
heap.push(6);
heap.push(7);
cout << heap.top() << endl; //输出:7
cout << heap.size() << endl; //输出:7
heap.pop();
cout << heap.size() << endl; //输出:6
cout << heap.empty() << endl; //输出:0
return 0;
}