template <class T, class Container = vector<T>,class Compare = less<typename Container::value_type> > class priority_queue;

需要头文件 #include <queue>

普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。

在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征

priority_queue<int, vector<int>, greater<int> > q;  // 小顶堆
priority_queue<int, vector<int>, less<int> > q;     // 大顶堆

priority_queue 优先队列,其底层是用堆来实现的。在优先队列中,队首元素一定是当前队列中优先级最高的那一个。

在优先队列中,没有 front() 函数与 back() 函数,而只能通过 top() 函数来访问队首元素(也可称为堆顶元素),也就是优先级最高的元素。

    //下面两种优先队列的定义是等价的,默认情况下,是降序priority_queue<int> q;priority_queue<int,vector<int>,less<int> >;//后面有一个空格

1、基本类型优先队列的例子:

#include<iostream>
#include <queue>
using namespace std;
int main()
{//对于基础类型 默认是大顶堆priority_queue<int> a; //等同于 priority_queue<int, vector<int>, less<int> > a;//      这里一定要有空格,不然成了右移运算符    ↓priority_queue<int, vector<int>, greater<int> > c;  //这样就是小顶堆priority_queue<string> b;for (int i = 0; i < 5; i++) {a.push(i);c.push(i);}while (!a.empty()) {cout << a.top() << ' ';a.pop();} cout << endl;while (!c.empty()) {cout << c.top() << ' ';c.pop();}cout << endl;b.push("abc");b.push("abcd");b.push("cbd");while (!b.empty()) {cout << b.top() << ' ';b.pop();} cout << endl;return 0;
}

运行结果:

4 3 2 1 0
0 1 2 3 4
cbd abcd abc

2、用pair做优先队列元素的例子:

规则:pair的比较,先比较第一个元素,第一个相等比较第二个。

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main()
{priority_queue<pair<int, int> > a;pair<int, int> b(1, 2);pair<int, int> c(1, 3);pair<int, int> d(2, 5);a.push(d);a.push(c);a.push(b);while (!a.empty()) {cout << a.top().first << ' ' << a.top().second << '\n';a.pop();}
}

运行结果:

2 5
1 3
1 2

优先队列默认的是从大到小的优先级,但是我们在实际使用的时候,往往需要改变优先级(比如从小到大的排列),这时候就需要改变优先级。

#include <iostream>
#include <queue>
using namespace std;//方法1
struct tmp1 //运算符重载<
{int x;tmp1(int a) {x = a;}bool operator<(const tmp1& a) const{return x < a.x; //大顶堆}
};//方法2
struct tmp2 //重写仿函数
{bool operator() (tmp1 a, tmp1 b) {return a.x < b.x; //大顶堆}
};int main()
{tmp1 a(1);tmp1 b(2);tmp1 c(3);priority_queue<tmp1> d;d.push(b);d.push(c);d.push(a);while (!d.empty()) {cout << d.top().x << '\n';d.pop();}cout << endl;priority_queue<tmp1, vector<tmp1>, tmp2> f;f.push(c);f.push(b);f.push(a);while (!f.empty()) {cout << f.top().x << '\n';f.pop();}
}

运行结果:

3
2
13
2
1

c++ std::priority_queue优先队列相关推荐

  1. C++/C++11中std::priority_queue的使用

    std::priority_queue:在优先队列中,优先级高的元素先出队列,并非按照先进先出的要求,类似一个堆(heap).其模板声明带有三个参数,priority_queue<Type, C ...

  2. priority_queue优先队列

    引入 优先队列是一种特殊的队列,在学习堆排序的时候就有所了解. 那么优先队列是什么呢?  说白了,就是一种功能强大的队列. 它的功能强大在哪里呢?  四个字:自动排序. 优先队列的头文件&&a ...

  3. priority_queue优先队列的使用方法

    说到优先队列,大家肯定想到了队列(这肯定是对于学过队列的同学来说,当然了,没学过也没事,对于本篇文章没什么问题滴),队列的特征是后进后出,按照排队先来后到的顺序的,本篇文章介绍的priority_qu ...

  4. [C++STL教程]7.priority_queue优先队列入门学习!零基础都能听懂的教程

    不知不觉C++STL教程系列已经第7期了.之前我们介绍过:vector, queue, stack, set, map等等数据结构. 今天我们来学习一个新的stl容器:priority_queue优先 ...

  5. c++ 优先队列_std::priority_queue(优先队列)

    priority_queue<Type, Container, Functional> //Type 数据类型, //Container 容器类型(必须是用数组实现的容器,比如vector ...

  6. priority_queue优先队列的用法总结

    最近在刷题时很多次遇到了优先队列的用法,在这里mark一下,做个总结. 介绍: 既然是队列,那么先要包含头文件#include , 他和queue不同的就在于:我们可以自定义其中数据的优先级, 让优先 ...

  7. STL关于queue(队列)与priority_queue(优先队列)的一些笔记

    queue queue就是队列, 在STL中主要实现了一个先进先出的容器 使用queue应该先添加头文件#include<queue> queue<typename>name; ...

  8. priority_queue 优先队列

    优先队列是单向队列的一种,可以按照默认或自定义的一种方式来对队列中的数据进行动态排序 template<class _Ty, class _Container = vector<_Ty&g ...

  9. std::priority_queue

    <from c plus plus> template <class T, class Container = vector<T>, class Compare = le ...

最新文章

  1. cefsharp 加载慢_知道硬盘很慢,但没想到比 CPU Cache 慢 10000000 倍!
  2. Android之TableLayout表格布局
  3. Spring in Action 4 读书笔记之使用标签创建 AOP
  4. 厉害!Java集合框架综述,这篇让你吃透!
  5. ubuntu 64上的GCC如何编译32位程序
  6. 一个前端岗位电话面试所带来的问题的思考
  7. 理解 e.clientX,e.clientY e.pageX
  8. nhibernate学习之集合组合依赖
  9. php 树状数组公式,PY个树状数组
  10. JSON.stringify( new WebSocket(ws://localhost:8080/websocket.do))
  11. 论文笔记_S2D.04-2011-CVPR-对象立体化-联合立体匹配与对象分割
  12. 2021-08-17Cookie 详解
  13. Php程序监控邮件提醒linux,Linux ping命令实现网络监控 并邮件提醒管理员
  14. 毕业设计——英文文献下载
  15. 电脑出现问题。你的PIN不可用,请单击以重置——解决方案总结
  16. 远程访问VM虚拟机方式记录
  17. RHEL8.4系统镜像
  18. 《大道至简-软件工程实践者的思想》读书笔记
  19. 微信图文素材中图片url替换
  20. 笔记本触摸板基本代替鼠标的常用操作

热门文章

  1. 一个整型数组里除了两个数字之外,其他的数字都出现了两次
  2. n2n windows 编译安装文件
  3. 20172324 2018-2019-1《程序设计与数据结构》实验2报告
  4. C++ 笔记(18)— 类和对象(this 指针、指向类的指针、类静态成员变量和函数)
  5. 使用 U 盘制作 Ubuntu 系统启动盘
  6. [BZOJ4033][HAOI2015]树上染色
  7. 关于OGNL表达式中的%,$,#
  8. 《OpenCV3编程入门》学习笔记6 图像处理(三)形态学滤波(1):腐蚀与膨胀
  9. html5手机端设置date,如何在移动端更好地使用HTML5 date input
  10. php pdo 中文乱码,php pdo oracle中文乱码的快速解决方法