目录
std::priority_queue是一个STL容器,它是一个优先队列,每个元素都有一个权值,优先级高的元素排在队列的前面。
1、std::priority_queue的特点
(1)插入元素时,自动按照优先级排序,优先级高的元素在队列的前面。
(2)删除元素时,自动删除队列中优先级最高的元素。
(3)可以使用自定义的比较函数来定义元素的优先级。
(4)内部实现是基于堆的数据结构,插入和删除元素的时间复杂度为O(logN)。
(5)支持随机访问,但不支持迭代器。
(6)可以用作最小堆或最大堆,根据比较函数的定义。
(7)不能访问队列中间的元素,只能访问队首和队尾的元素。
2、std::priority_queue常用api
1. push():将元素插入到优先队列中,自动按照优先级排序。
2. top():返回优先队列中优先级最高的元素,即队首元素。
3. pop():删除优先队列中优先级最高的元素,即队首元素。
4. size():返回优先队列中元素的个数。
5. empty():判断优先队列是否为空,如果为空返回true,否则返回false。
6. swap():交换两个优先队列的元素。
7. emplace():在优先队列中构造元素。
8. priority_queue():构造函数,创建一个空的优先队列。
9. priority_queue(Compare cmp):构造函数,创建一个空的优先队列,并指定比较函数。
10. priority_queue(const priority_queue& pq):拷贝构造函数,创建一个新的优先队列,与原队列内容相同。
3、std::priority_queue应用场景
(1)任务调度:在多任务系统中,可以使用std::priority_queue来实现任务的优先级调度,将优先级高的任务先执行。
(2)事件处理:在事件驱动的系统中,可以使用std::priority_queue来存储事件,并按照事件的优先级进行处理。
(3)最短路径算法:在图论算法中,可以使用std::priority_queue来实现Dijkstra算法和Prim算法,找出最短路径或最小生成树。
(4)贪心算法:在贪心算法中,可以使用std::priority_queue来存储贪心策略中的选择集合,并按照选择的优先级进行选择。
(5)堆排序:std::priority_queue本身就是一个堆,可以使用它来实现堆排序算法。
4、std::priority_queue实例
#include <iostream>
#include <queue>
int main() {
std::priority_queue<int> pq;
pq.push(10);
pq.push(30);
pq.push(20);
std::cout << "Top element: " << pq.top() << std::endl;
pq.pop();
std::cout << "Top element after pop: " << pq.top() << std::endl;
return 0;
}
输出:
Top element: 30
Top element after pop: 20
在这个例子中,我们创建了一个std::priority_queue对象pq,并使用push()函数添加三个整数值。然后,我们使用top()函数获取队列中的最高优先级元素,并使用pop()函数将其删除。最后,我们再次使用top()函数获取队列中的最高优先级元素。