一:优先队列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. Android视频录制从不入门到入门系列教程(四)————Camera Parameter

    Camera提供了一个叫做setParameters的方法帮助开发者设置相机的相关参数. 通过Camera的getParameters方法可以获取到当前为相机设置的相关参数. 下面简单介绍下,视频录制 ...

  2. 配置MySQL的数据源

    首先查看自己是否有这个驱动 有就进行以下操作,没有那就找下载 安装mysql-for-visualstudio 1)双击   mysql-for-visualstudio-2.0.5.msi 2)点击 ...

  3. 微软与开源干货对比篇_PHP和 ASP.NET在 Session实现和管理机制上差异

    微软与开源干货对比篇_PHP和 ASP.NET在 Session实现和管理机制上差异 前言:由于开发人员要靠工具吃饭,可能和开发工具.语言.环境呆的时间比和老婆孩子亲人在一起的时间还多,所以每个人或多 ...

  4. Python encode和decode

    今天在写一个StringIO.write(int)示例时思维那么一发散就拐到了字符集的问题上,顺手搜索一发,除了极少数以外,绝大多数中文博客都解释的惨不忍睹,再鉴于被此问题在oracle的字符集体系中 ...

  5. 西湖论剑2019复现-Web之首家线上赌场上线啦

    首页打开 经过测试发现name和code参数可控,但尝试注入没有发现注入点,于是直接扫描目录找思路 一扫描,果然有问题 目录扫描里面可以看到有一个/.DS_Store的文件,DS_Store是Mac ...

  6. android测试用例编写

    说明:android中写测试用例也是用junit,测试用例代码风格是junit3的风格.java中测试用例中使用junit3需要继承TestCase(junit4则不需要,直接用annotation即 ...

  7. 一文读懂 JAVA 异常处理

    JAVA 异常类型结构 Error 和 Exeption 受查异常和非受查异常 异常的抛出与捕获 直接抛出异常 封装异常并抛出 捕获异常 自定义异常 try-catch-finally try-wit ...

  8. 机器翻译评价指标 — BLEU算法

    1,概述 机器翻译中常用的自动评价指标是 $BLEU$ 算法,除了在机器翻译中的应用,在其他的 $seq2seq$ 任务中也会使用,例如对话系统. 2 $BLEU$算法详解 假定人工给出的译文为$re ...

  9. Linux:Day18(下) Bind9

    子域授权:每个域的名称服务器,都是通过其上级名称服务器在解析库中进行授权. 类似根域授权tld: .com IN NS ns1.com. .com IN NS ns1.com. ns1.com IN ...

  10. Python爬虫爬取网页图片

    没想到python是如此强大,令人着迷,以前看见图片总是一张一张复制粘贴,现在好了,学会python就可以用程序将一张张图片,保存下来. 今天逛贴吧看见好多美图,可是图片有点多,不想一张一张地复制粘贴 ...