文章目录
- Priority Queue的概念及性质
- STL——priority_queue的用法
- 实例
Priority Queue的概念及性质
队列结构可以用来解决很多日常的问题,像是先来先服务的银行柜台等。但是很多场景下,队列这种“先进先出”的简单规则并不能很好的满足问题的需求,例如,在医院就诊时,如果新来的病患病情特别严重,随时都由生命危险,那么此时应该先安排该患者就诊,而不是等待前面先来的患者就诊完再接受治疗,这样可能会耽误治疗的最佳时机。
对于病情严重情况、到医院时间早晚这些信息,都可以将它们进行量化和比较,因此可以将它们的大小视为优先级(Priority),而这种能够将数据按照事先规定的优先级次序进行动态组织的数据结构称为优先队列(Priority Queue)。
优先队列与队列基本相似,从一端插入(队尾),从另一端删除(队首),并且每次只能访问位于队首的元素,即队首的元素先出队。
优先队列中,每个元素都被赋予了优先级,访问元素时,只能访问当前队列中优先级最高的元素。
因此,priority_queue容器适配器中元素的插入和删除操作,遵循的并不是简单的先入先出(First-In-First-Out,FIFO)原则,而是最高级先出(First-In Greatest-Out)原则,即最先进队列的元素不一定先出队列,优先级最大的元素最先出队列。
STL——priority_queue的用法
在C++的标准库中提供了优先队列模板,优先队列底层是用二叉堆实现的,但读者无需关心其内部的实现细节,只需要掌握如何使用即可。
基本操作包括:
- 判空 empty()
- 元素个数 size()
- 添加 push()、emmplace() (c++11)
- 删除 pop()
- 优先级最高元素 top()
- 交换 swap() (c++11)
- 首先,要使用标准库中的priority_queue模板,应该在头文件中添加头文件:
#include
priority_queue<int> myPriorityQueue;
myPriorityQueue.empty();
myPriorityQueue.size();
myPriorityQueue.push(x);
myPriorityQueue.emplace(x);
对于这两个操作&#xff0c;push的操作可以直接用于emplace&#xff0c;唯一需要注意的是&#xff0c;emplace可以直接传入构造对象需要的元素&#xff0c;然后自己调用其构造函数&#xff1b;而push只能让其构造函数构造好对象之后&#xff0c;再使用复制构造函数。也就是说push多了复制这一步&#xff0c;所以emplace更节省内存。
myPriorityQueue.pop();
- 访问元素
由于优先队列对访问元素的限制&#xff0c;优先队列只能通过top()访问当前队列中优先级最高的元素。
myPriorityQueue.top();
- 将两个priority_queue中的元素进行互换&#xff0c;注意元素类型必须相同
priority_queue<int> foo;
priority_queue<int> bar;
foo.push(10); foo.push(20); foo.push(30);
bar.push(100); bar.push(200);
foo.swap(bar);
经过这样的操作&#xff0c;bar和foo中的元素进行了交换&#xff0c;现在&#xff0c;bar中的元素为30&#xff0c;20&#xff0c;10&#xff1b;foo中的元素为200&#xff0c;100。
实例
下面我给出一个简单的实例对priority_queue的用法做个总结。
#include<iostream>
#include
using namespace std;
int main(){
priority_queue<int> myPriorityQueue;
cout<<"the size of myPriorityQueue: "<<myPriorityQueue.size()<<endl;
for(int i&#61;1; i<10; i&#43;&#43;){
myPriorityQueue.push(i);
}
cout<<"the size of myPriorityQueue: "<<myPriorityQueue.size()<<endl;;
cout<<"the top of myPriorityQueue: "<<myPriorityQueue.top()<<endl;
int sum &#61; 0;
while(!myPriorityQueue.empty()){
int tmp &#61; myPriorityQueue.top();
sum &#43;&#61; tmp;
cout<<tmp<<" ";
myPriorityQueue.pop();
}
cout<<endl;
cout<<"sum: "<<sum<<endl;
if(myPriorityQueue.empty()){
cout<<"myPriorityQueue is empty."<<endl;
}
priority_queue<int> foo;
priority_queue<int> bar;
foo.push(10); foo.push(20); foo.push(30);
bar.push(100); bar.push(200);
swap(foo,bar);
cout<<"foo: ";
while(!foo.empty()){
int tmp1 &#61; foo.top();
cout<<tmp1<<" ";
foo.pop();
}
cout<<endl;
cout<<"bar: ";
while(!bar.empty()){
int tmp2 &#61; bar.top();
cout<<tmp2<<" ";
bar.pop();
}
return 0;
}
执行结果为&#xff1a;