队列queue与优先队列头文件均为#include<queue>
,队列与优先队列的不同之处在于优先队列可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。
首先我们来看一下队列和优先队列的基本操作
队列(queue)在定义时 queue<类型>队列名
它的基本操作有
push 在队列尾部插入一个元素
pop 将队列中最靠前位置的元素拿掉(剔除)。无返回值的void函数。
size 返回队列中元素的个数,返回值类型为unsigned int
empty 判断队列是否为空,如果为空返回true,不为空返回false。
front 返回队列中第一个进入的元素,即第一个元素,但是并没有剔除。
back 返回队列中最后进入的元素,即最后一个元素,并且不剔除
优先队列(priority_queue)在定义时 priority_queue<Type, Container, Functional>
Type 就是数据类型,Container就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用list。STL里面默认用vector),Functional 就是比较的方式。
priority_queue<int, vector<int>, greater<int> >队列名;
//这样就是小顶堆,小的优先级更高,升序排序。
priority_queue<int, vector<int>, less<int> >队列名;
//这样就是大顶堆,大的优先级更高,降序排序。等同于priority_queue<int> 队列名;
接下来看一下优先队列的基本操作
和队列基本操作相同:
- top 访问队头元素
- empty 队列是否为空
- size 返回队列内元素个数
- push 插入元素到队尾 (并排序)
- emplace 原地构造一个元素并插入队列
- pop 弹出队头元素
- swap 交换内容
看下代码
1.基本类型
#include<iostream>
#include <queue>
#include<string>
using namespace std;
int main()
{
//大顶堆 降序排序
priority_queue<int> a;//等同于 priority_queue<int, vector<int>, less<int> > a;
priority_queue<int, vector<int>, greater<int> > b; //小顶堆 升序排序
priority_queue<string>c;//先比较第一个字母的字典序,再比较第二个字母......
for (int i = 0; i < 5; i++)
{
a.push(i);
b.push(i);
}
while (!a.empty())
{
cout << a.top() << ' ';
a.pop();
}
cout << endl;
while (!b.empty())
{
cout << b.top() << ' ';
b.pop();
}
cout << endl;
c.push("b");
c.push("ab");
c.push("ac");
c.push("abc");
c.push("abd");
while (!c.empty())
{
cout << c.top() << ' ';
c.pop();
}
cout << endl;
return 0;
}
输出
4 3 2 1 0
0 1 2 3 4
b ac abd abc ab
关于pair的比较,和priority_queue<string>队列名;
类似,即先比较第一个元素,第一个相等比较第二个。
2.还有一种关于自定义类型的比较,例如结构体。
#include<iostream>
#include <queue>
using namespace std;
struct Node
{
int x;
int y;
int l;
friend bool operator <(Node a, Node b)//重写仿函数
{
return a.l < b.l;//大顶堆,根据结构体中的l进行降序排列
//若改为return a.l > b.l,则为小顶堆,根据结构体中的l进行升序排列
}
};
int main()
{
priority_queue<Node> r;
Node vis;
int n; cin >> n;
for (int i = 0; i < n; i++)
{
cin >> vis.x >> vis.y >> vis.l;
r.push(vis);
}
while (!r.empty())
{
cout << r.top().x << " " << r.top().y << " " << r.top().l << endl;
r.pop();
}
return 0;
}
输入
4
1 1 0
1 1 1
1 1 2
1 1 3
输出
1 1 3
1 1 2
1 1 1
1 1 0
欢迎大家在评论区留言 嘻嘻~~~