一:优先队列priority_queue简介

同队列,不支持迭代

(一)和队列相比

同:

优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。

异:

但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队。
这点类似于给队列里的元素进行了由大到小的顺序排序。

补充:元素之间比较

元素的比较规则默认按元素值由大到小排序,可以重载“<”操作符来重新定义比较规则。

(二)重点:同vector,deque,list,以及queue比较

虽然与queue相似,但是之所以不放在queue之后讲,是因为实现优先队列是要依靠容器的迭代器实现的,而queue和stack是没有迭代功能的。

而且stl中优先队列是基于vector和deque实现的,是基于这两种容器的迭代特性实现--->支持随机存取迭代


这也是为什么优先队列不可以基于list实现--->list不支持随机存取迭代

二:优先队列priority_queue的构造

priority_queue<int, vector<int>, cmp> q;    //定义方法
//其中第一个是数据类型,第二个参数为容器类型:默认是vector。第三个参数为比较函数:默认less。

案例1:默认最大值优先

         priority_queue<int, deque<int>>    pq;  //基于双端队列

         priority_queue<int, vector<int>>    pq;  //基于向量
上面是默认最大值优先

案例2:修改比较方式

        priority_queue<int,vector<int>, less<int>> pq1;     // 使用递减 less<int>函数对象排序    首位最大
priority_queue<int,deque<int>, greater<int>> pq2;    // 使用递增greater<int>函数对象排序 首位最小

三:优先队列常用操作

q.empty()        如果队列为空,则返回true,否则返回false

q.size()         返回队列中元素的个数

q.pop()          删除队首元素,但不返回其值

q.top()          返回具有最高优先级的元素值,但不删除该元素

q.push(item)     在基于优先级的适当位置插入新元素
    priority_queue<int,vector<int>> pq;
pq.push();
pq.push();
pq.push(); while (!pq.empty())
{
cout << pq.top() << " ";
pq.pop();
}

四:自定义比较结构

struct cmp1{
bool operator ()(int &a,int &b){
return a>b;//最小值优先
}
};
void main()
{
priority_queue<int,vector<int>,cmp1> pq;
pq.push();
pq.push();
pq.push(); while (!pq.empty())
{
cout << pq.top() << " ";
pq.pop();
} system("pause");
}

五:自定义数据结构(重载<比较运算符)

struct number1{
int x;
bool operator < (const number1 &a) const {
return x>a.x;//最小值优先
}
};
void main()
{
priority_queue<number1, vector<number1>> pq;
number1 n1, n2, n3;
n1.x = ;
n2.x = ;
n3.x = ;
pq.push(n1);
pq.push(n2);
pq.push(n3); while (!pq.empty())
{
cout << pq.top().x << " ";
pq.pop();
} system("pause");
}

数据结构(四)树---哈夫曼树了解以及代码实现

06--STL序列容器(priority_queue)的更多相关文章

  1. STL 序列容器

    转自时习之 STL中大家最耳熟能详的可能就是容器,容器大致可以分为两类,序列型容器(SequenceContainer)和关联型容器(AssociativeContainer)这里介绍STL中的各种序 ...

  2. STL List容器

    转载http://www.cnblogs.com/fangyukuan/archive/2010/09/21/1832364.html 各个容器有很多的相似性.先学好一个,其它的就好办了.先从基础开始 ...

  3. STL序列式容器学习总结

    STL序列式容器学习总结 参考资料:<STL源码剖析> 参考网址: Vector: http://www.cnblogs.com/zhonghuasong/p/5975979.html L ...

  4. STL常用序列容器

    这里简要的记述一下STL常用容器的实现原理,要点等内容. vector vector是比较常用的stl容器,用法与数组是非类似,其内部实现是连续空间分配,与数组的不同之处在于可弹性增加空间,而arra ...

  5. [STL]heap和priority_queue

    一.heap 在STL中,priority_queue(优先权队列)的底层机制是最大堆,因此有必要先来了解一下heap.heap采用完全二叉树的结构,当然不是真正的binary tree,因为对于完全 ...

  6. C++ STL基本容器的使用

    C++中有两种类型的容器:顺序容器和关联容器.顺序容器主要有vector.list.deque等.其中vector表示一段连续的内存,基于数组实现,list表示非连续的内存,基于链表实现,deque与 ...

  7. c++复习:STL之容器

    1 STL的string 1 String概念 string是STL的字符串类型,通常用来表示字符串.而在使用string之前,字符串通常是用char*表示的.string与char*都可以用来表示字 ...

  8. [C++ STL] 各容器简单介绍

    什么是STL? 1.STL(Standard Template Library),即标准模板库,是一个高效的C++程序库. 2.包含了诸多常用的基本数据结构和基本算法.为广大C++程序员们提供了一个可 ...

  9. 【Example】C++ STL 常用容器概述

    前排提醒: 由于 Microsoft Docs 全是机翻.所以本文表格是我人脑补翻+审校. 如果有纰漏.模糊及时评论反馈. 序列式容器 序列容器是指在逻辑上以线性排列方式存储给定类型元素的容器. 这些 ...

  10. STL之容器基本操作

    容器类 STL Container Header Applications vector <vector> 直接访问任意元素,快速插入.删除尾部元素 deque <deque> ...

随机推荐

  1. 【NodeJS】基础知识

    nodejs基础 nodejs允许自己封装模块,使得编写程序可以模块化,便于维护整理.在一个js文件中写完封装的函数或对象后,可以使用exports或module.exports来将模块中的函数暴露给 ...

  2. 『cURL』curl: (6) Could not resolve host无法解析主机地址

    最近在学数据挖掘时,获取数据有两种途径: 开放数据,可以直接使用和存储的数据: 网络数据,通过爬虫或云市场api(付费或免费)获取数据 我通过教程,在阿里云购买一个天气数据api,尝试使用cURL获取 ...

  3. zabbix利用SNMPTrap接收交换机主动告警

    zabbix接收trap的工作流程: snmptrapd 收到trap snmptrapd将trap传递给SNMPTT或调用Perl接收器 SNMPTT或Perl trap接收器解析,格式化并将tra ...

  4. vmware 6 虚拟化 全系列 序列号

    vmware 6 虚拟化 全系列 序列号   vSphere 6 Hypervisor HY0XH-D508H-081U8-JA2GH-CCUM2 4C4WK-8KH8L-H85J0-UHCNK-8C ...

  5. EF Core使用笔记(基于MySql数据库)

    一.什么是EF Entity Framework 是适用于.NET 的对象关系映射程序 (O/RM). 二.比较 EF Core 和 EF6 1.Entity Framework 6 Entity F ...

  6. vpshere6 ESXI 禁止登陆 "执行此操作的权限被拒绝"

    vCenter在添加ESXI主机时,锁定模式选择“正常”,导致无法直接登陆ESXI宿主机,现象如下: 解决方法:

  7. 【问题解决方案】ImportError: No module named 'pygal'

    <Python编程:从入门到实践>一书,第二个项目-可视化,第四节用到pygal 安装部分用 'python -m pip install pygal==1.7' 安装,但使用时仍然报错 ...

  8. AppiumDesktop录制脚本

    AppiumDesktop启动页面: 启动AppiumDesktop以后点击该页面右上角的Start New Session按钮,就会启动一个新的会话窗口(如下图),在这个窗口我们需要配置一些Desi ...

  9. CodeForces 1151D Stas and the Queue at the Buffet

    题目链接:http://codeforces.com/contest/1151/problem/D 题目大意: 有n个学生排成一队(序号从1到n),每个学生有2个评定标准(a, b),设每个学生的位置 ...

  10. Linux(Ubuntu)使用日记------Mongodb的安装与使用

    1.安装 Linux下安装mongodb还是比较容易的 直接使用apt-get安装即可,命令如下: sudo apt-get install mongodb 安装完成之后进行检验, “mongo sh ...