今天我们来讲一下C++中对于排序很好的用的东西:优先队列:priority_queue
既然是队列那么先要包含头文件#include <queue>, 它和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队
优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。
和队列基本操作相同,有如下几种:
top 访问队头元素
empty 队列是否为空
size 返回队列内元素个数
push 插入元素到队尾 (并排序)
emplace 原地构造一个元素并插入队列
pop 弹出队头元素
swap 交换内容
定义:priority_queue< 数据类型, 容器类型, 比较的方式 >
当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大根堆。
这里区分一下小根堆和大根堆:
小根堆是保证最小值在队列最前面,大根堆是保证最大值在最前面。
例子:
//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <string,vector<string>,less<string> >q;
这里就定义了两个优先队列
第一个是小根堆,是int类型
第二个是大根堆,string类型
使用示例:
#include <iostream>
#include <queue>
using namespace std;
priority_queue <int>a; //定义优先队列a,int类型,默认是大根堆
/*相当于:
priority_queue <int,vector<int>,less<int> >a;
*/
priority_queue <string,vector<string>,greater<string> >b; //这是小根堆,类型为string
string f;
int t;
int main()
{
cout <<"请输入5个整数,用空格隔开,输入之后换行!\n";
for (int i=1;i<=5;i++)
{
cin >>t;
a.push(t); //输入5个数存入a,每一个时刻a中最大的永远在开头
}
while (!a.empty()) //a非空时
{
cout <<a.top() <<' '; //输出a的第一位
a.pop(); //将a的开头弹出
}
//上面的循环输出了一个排序好的数列
cout <<endl;
cout <<"请输入3串乱七八糟的字符串(英文+数字),用空格隔开,输入之后换行!\n";
for (int i=1;i<=3;i++)
{
cin >>f;
b.push(f);
}
while (!b.empty())
{
cout << b.top() << ' ';
b.pop();
}
//同上
cout <<endl;
return 0;
}