[C++] 一文搞懂优先队列priority_queue

C++优先队列priority_queue

优先队列头文件

优先队列是一种容器适配器类型,顾名思义,优先队列中的元素有着大小先后顺序

优先队列成员函数

empty	//判断队列是否为空
size	//返回队列大小
top	    //访问队列顶部元素
push	//插入元素
emplace	//构造并且插入元素
pop	    //删除队列顶部元素
swap	//交换内容

初始化一个优先队列

priority_queue<Type, Container, Functional> que;
  • Type:代表队列中的数据类型
  • Container:容器,必须是用数组实现的容器,比如vector,deque等等,但不能用 list。默认是vector
  • Functional:比较方式,升序排列还是降序排列
//升序排列,小顶堆
priority_queue <int, vector<int>, greater<int>> que;
//降序排列,大顶堆
priority_queue <int, vector<int>, less<int>> que;
//默认是大顶堆,降序排列
priority_queue <int> que;

举例

#include <iostream>
#include <queue>
using namespace std;
int main() {
  //默认是大顶堆,降序排列
  priority_queue<int> que1;
  //等同于 priority_queue<int, vector<int>, less<int> > que1;

  //小顶堆,升序排列
  priority_queue<int, vector<int>, greater<int> > que2;
  
  //大顶堆,降序排列
  priority_queue<string> que3;

  for (int i = 0; i < 5; i++) {
    que1.push(i);
    que2.push(i);
  }
  while (!que1.empty()) {
    cout << que1.top() << ' ';
    que1.pop();
  }
  cout << endl;

  while (!que2.empty()) {
    cout << que2.top() << ' ';
    que2.pop();
  }
  cout << endl;

  que3.push("abc");
  que3.push("cbcd");
  que3.push("bbd");
  while (!que3.empty()) {
    cout << que3.top() << ' ';
    que3.pop();
  }
  cout << endl;
  return 0;
}

编译

g++ test.cc -o a.out

输出

4 3 2 1 0 
0 1 2 3 4 
cbcd bbd abc 

举例2,pair的比较,先比较第一个元素,第一个元素相等,再比较第二个元素

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main() {
  // 默认是大顶堆,降序排列
  priority_queue<pair<int, int> > que;
  pair<int, int> a(1, 2);
  pair<int, int> b(1, 3);
  pair<int, int> c(2, 5);
  que.push(c);
  que.push(b);
  que.push(a);
  while (!que.empty()) {
    cout << que.top().first << ' ' << que.top().second << '\n';
    que.pop();
  }
}

输出

2 5
1 4
1 3

使用自定义的比较函数来初始化优先队列

class student{
    public:
        int age;
        string name;
        /**重载小于操作符,
	      *这里必须是非成员函数才可以
		*/
        friend bool operator<(const student& a, const student & b){
            return a.age < b.age;
        }
};

/**可调用的函数操作符的对象*/
struct mycmp{
    bool operator()(const student & a,const student & b){
        return a.age < b.age;
    }
};

/**函数指针*/
bool cmpfunc(const student& a, const student& b){
    return a.age < b.age;
}

/**默认使用student的oprator<来进行比较*/
priority_queue<student> que1;

/**使用重载函数操作符的类对象*/
priority_queue<student,vector<student>,mycmp> que2;

/**定义一下比较函数*/
auto cmp = [](const student & a,const student & b){return a.age < b.age;};
/**
  *	需要把lambda表达式作为优先队列参数进行初始化
  * 并且指定priority_queue的模板实参,decltype(cmp),c++11 declare type,声明类型
  * 可以认为是确定函数的类型
  * bool (const student & a,const student & b)
  **/
priority_queue<student,vector<student>,decltype(cmp)> que4(cmp);

/*使用函数对象来定义这个比较函数原型*/
//lambda 函数来初始化函数对象
priority_queue<student,vector<student>,function<bool(const student&,const student&)>> que5(cmp);

//函数指针来初始化函数对象
priority_queue<student,vector<student>,function<bool(const student&,const student&)>> que6(cmpfunc);

/**函数对象*/
function<bool(const student&,const student &)> func(cmpfunc);
priority_queue<student,vector<student>,function<bool(const student&,const student&)>> que7(func);


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值