优先级队列(Priority Queue)是一种抽象数据类型,它类似于普通的队列或堆栈,但每个元素都有一个关联的优先级,这个优先级决定了元素在队列中的位置和被访问的顺序。在优先级队列中,具有最高优先级的元素通常最先被访问,而具有较低优先级的元素会在后面被访问。
在C++ STL中,priority_queue
通常使用std::vector
作为默认的底层容器来存储元素。这意味着``priority_queue使用std::vector来管理元素并维护堆的性质,而不是直接使用二叉树结构。
std::vector是一个动态数组,它提供了高效的随机访问和插入操作,这使得它成为priority_queue的合适底层数据结构,因为堆操作需要能够在O(log n)时间内插入元素并在O(1)时间内访问堆顶元素。
当你向其中输入数据时,它默认是以大堆的方式来存储数据的。
优先级队列的用法
优先级队列(Priority Queue)是一种非常有用的数据结构,它允许你以有序的方式管理和处理具有不同优先级的元素。在C++中,你可以使用STL提供的std::priority_queue
来操作优先级队列。以下是std::priority_queue
的常见用法示例:
首先,你需要包含相应的头文件:
#include <iostream>
#include <queue> //prority_queue 也在这个头文件中
然后,你可以使用std::priority_queue
来定义一个优先级队列。默认情况下,它是最大堆,也就是元素值大的具有更高的优先级。
std::priority_queue<int> maxHeap;
如果你想创建一个最小堆,可以提供第二个参数,使用std::greater
来定义比较函数:
std::priority_queue<int, std::vector<int>, std::greater<int>> minHeap;
接下来,你可以使用以下操作来操作优先级队列:
- 插入元素:使用
push
方法将元素插入优先级队列。
maxHeap.push(5);
maxHeap.push(2);
maxHeap.push(8);
- 弹出元素:使用
pop
方法弹出队列中优先级最高的元素。
maxHeap.pop();
- 查看队列顶部元素:使用
top
方法查看队列中具有最高优先级的元素,但不会将其弹出。
int topElement = maxHeap.top();
- 判断队列是否为空:使用
empty
方法来检查队列是否为空。
bool isEmpty = maxHeap.empty();
- 获取队列中的元素数量:使用
size
方法来获取队列中的元素数量。
int size = maxHeap.size();
下面是一个完整的示例,演示了如何使用std::priority_queue
创建和操作一个最大堆的优先级队列:
#include <iostream>
#include <queue>
int main() {
std::priority_queue<int> maxHeap;
maxHeap.push(5);
maxHeap.push(2);
maxHeap.push(8);
while (!maxHeap.empty()) {
int topElement = maxHeap.top();
std::cout << topElement << " ";
maxHeap.pop();
}
return 0;
}
这个示例中,我们首先将元素插入最大堆,然后使用top
和pop
操作获取并弹出队列中的元素,以得到按降序排列的输出。
解释:std::priority_queue<int, std::vector<int>, std::greater<int>> minHeap;
这行代码定义了一个名为 minHeap
的优先级队列,其中包含整数类型的元素,并且它是一个最小堆(Min Heap)。让我来逐个解释这段代码的各个部分:
-
std::priority_queue<int, ...>
:这部分定义了一个优先级队列对象,并指定了其元素类型为整数(int
)。这表示minHeap
中的元素将是整数类型的。 -
std::vector<int>
:这是一个模板参数,指定了底层容器的类型。在这里,我们使用std::vector
作为底层容器,用来存储优先级队列的元素。 -
std::greater<int>
:这是另一个模板参数,它指定了比较函数。在这里,我们使用std::greater<int>
,它是一个函数对象,表示将元素按照递增的顺序排序,从而创建了一个最小堆。这意味着具有较小值的元素在队列中具有更高的优先级。
所以,std::priority_queue<int, std::vector<int>, std::greater<int>> minHeap;
这行代码创建了一个最小堆的优先级队列 minHeap
,用于存储整数类型的元素,并且元素将按照升序排列,使得最小的元素具有最高的优先级。你可以使用这个队列来执行插入、弹出、查看顶部元素等操作,以确保元素按照最小值的顺序被处理。