优先队列是队列的高级版,最大的特点是可以内部实现排序

优先队列的定义


优先队列内部使用堆排序,从而实现队列内一直保持着某种顺序规律(比如递增,递减等)

在使用优先队列时,首先要引入头文件:#include <queue>

定义一个新类型的优先队列,通常使用:

priority_queue<[type]> [name]

type为优先队列内所存元素的数据类型,name为你定义的优先队列的名字,那么优先队列内部就会按照type类型数据从大到小排列队列第一个元素为最大的元素

当然,你也可以让优先队列内元素按照你想要的顺序进行排列,之后说明。


优先队列的操作


对一个优先队列,具有许多种操作,每次操作就使用[name].[操作函数]的方式进行。

优先队列有以下操作函数:               

empty() 返回值为bool类型,判断优先队列是否为空,为空返回true,否则返回false;
emplace(type1 x1,...,type xn)  这个有点复杂,后面说;
pop()  返回值为void类型,删除队列第一个元素;
push(type x)

返回值为void类型,向队列末尾插入一个元素,参数x的数据类型type必须和此优先队列所存数据的数据类型相同;

size()  返回值一般为一个数,表示队列中当前所存元素的多少;
swap(priority_queue<type> x)  返回值为void类型,交换两个队列内的元素;
top()  返回值为type类型,返回队列第一个元素的值。

其中emplace(type1  x1,.......,typen  xn)函数参数数量和类型是不确定的,只有当优先队列内部存的是结构体或者类,这个函数才有它独特的作用

emplace的参数会传到构造函数构造一个新的对象,然后再把对象放到优先队列里,和push类似,但是push的参数只有一个,且参数数据类型必须和优先队列所存数据类型相同

 

例如,先创建一个结构体和优先队列:

struct op{
int a;
int b;
int c;
op(int a1,int b1,int c1){
this->a=a1;
this->b=b1;
this->c=c1;
}
bool operator<(const op &x)const{
return this->a<x.a;
}
};
priority_queue<op> que;

那么,由于结构体op的构造函数需要三个参数,所以函数emplace就应该有三个参数,例如:

que.emplace(,,);

这条语句相当于

op a(,,);
que.push(a);

或者

que.push(op(,,));

注意:编译器要支持c++11才能使用emplace函数。


自定义优先队列顺序


基本数据类型排序

在定义一个新的优先队列时

priority_queue<int> que1;

优先队列内部默认按照int类型数据由大到小排序

还有一种由大到小的定义方式:

priority_queue<int,vector<int>,less<int> > que1;

注意:末尾的两个">"符号之间要有空格,不然会被当做">>"运算符,从而报错

如果想要队列内部按照double类型由小到大排序,只有一种定义方式:

priority_queue<double,vector<double>,greater<double> > que1;

结构体&类的排序

方法1:定义一个结构体或者类同时,还要重载一下运算符"<"只用重载"<",不要重载"="和">"(这里需要一点点c++的知识),例如:

struct op{
int a;
int b;
int c;
op(int a1,int b1,int c1){
this->a=a1;
this->b=b1;
this->c=c1;
}
bool operator<(const op &x)const{
return this->a>
x.a;
}

};

记住红色部分的两个const不要忽略。

然后定义优先队列

priority_queue<op> que;

那么此优先队列中的对象,会按照成员a的值由小到大排序(此时以成员a的值为主键

如果想要按成员b的值由大到小排序,那么重载函数应该为:

bool operator<(const op &x)const{
return this->b<x.b;
}

注意大于号小于号的使用

方法2:重新定义一个结构体,重载"()"运算符,例如:

struct op{
int a;
int b;
int c;
op(int a1,int b1,int c1){
this->a=a1;
this->b=b1;
this->c=c1;
}
};
struct comp{
bool operator()(const op &p1,const op &p2){
return p1.a<p2.a;
}
};

然后定义优先队列

priority_queue<op,vector<op>,comp> que;

于是此优先队列里的对象也会按照成员a的值由大到小排序

当然,如果换成">"

struct comp{
bool operator()(const op &p1,const op &p2){
return p1.a>p2.a;
}
};

对象就会按照a的值从小到大排序


学习:STL----优先队列的更多相关文章

  1. CJOJ 2484 函数最小值 / Luogu 2085 函数最小值(STL优先队列,堆)

    CJOJ 2484 函数最小值 / Luogu 2085 函数最小值(STL优先队列,堆) Description 有n个函数,分别为F1,F2,...,Fn.定义 \(Fi(x)=Aix^2+Bix ...

  2. CJOJ 2482 【POI2000】促销活动(STL优先队列,大根堆,小根堆)

    CJOJ 2482 [POI2000]促销活动(STL优先队列,大根堆,小根堆) Description 促销活动遵守以下规则: 一个消费者 -- 想参加促销活动的消费者,在账单下记下他自己所付的费用 ...

  3. 基于STL优先队列和邻接表的dijkstra算法

    首先说下STL优先队列的局限性,那就是只提供入队.出队.取得队首元素的值的功能,而dijkstra算法的堆优化需要能够随机访问队列中某个节点(来更新源点节点的最短距离). 看似可以用vector配合m ...

  4. poj 3253 Fence Repair (STL优先队列)

    版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/34805369 转载请注明出 ...

  5. UVA - 136 Ugly Numbers(丑数,STL优先队列+set)

    Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9 ...

  6. 合并果子(STL优先队列)

    STL优先队列:priority_queue 定义:priority_queue<int>q; 从小到大:priority_queue<int,vector<int>,g ...

  7. STL 优先队列

    STL 栈,队列,优先队列用法 分类: Learning C++2013-11-15 00:52 843人阅读 评论(2) 收藏 举报 c++栈队列优先队列STL STL 中栈的使用方法(stack) ...

  8. STL优先队列的使用

    STL中有一个优先队列的容器可以使用. [头文件] queue 队列容器 vector 向量容器 [操作] 优先级队列支持的操作 q.empty()         如果队列为空,则返回true,否则 ...

  9. POJ 3253 Fence Repair STL 优先队列

    这题做完后觉得很水,主要的想法就是逆过程思考,原题是截断,可以想成是拼装,一共有n根木棍,最后要拼成一根完整的,每两根小的拼成一根大的,拼成后的木棍长度就是费用,要求费用最少.显然的是一共会拼接n-1 ...

  10. C++ STL 优先队列 priority_queue 详解(转)

    转自https://blog.csdn.net/c20182030/article/details/70757660,感谢大佬. 优先队列 引入 优先队列是一种特殊的队列,在学习堆排序的时候就有所了解 ...

随机推荐

  1. [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset)

    [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset) 题面 题面较长,略 分析 首先,发现火星人只有死和活两种状态,考虑2-SAT 建图 ...

  2. Golang环境配置

    下载 下载地址 Go官网下载地址:https://golang.org/dl/ Go官方镜像站(推荐):https://golang.google.cn/dl/ 版本选择 安装 Windows安装 示 ...

  3. Python学习第四十天函数的装饰器用法

    在软件开发的过程中,要遵循软件的一些原则封装的,不改变原有的代码的基础增加一些需求,python提供了装饰器来扩展函数功能,下面说说函数装饰器用法 def debug(func):      def ...

  4. 11-jQuery简介和选择器

    # jQuery > jQuery是一个是免费.开源的javascript库, 也是目前使用最广泛的javascript函数库.>> jQuery极大的方便你完成web前段的相关操作 ...

  5. IIS环境下PHP版本过低无法Sql查询的解决

    需求:帝国后台添加个后台框,输入地址,原页面重写成所指链接页面 重点:当输入框输入地址,提交到后台后,打开原链接,该页面会读取php文件GetUrlPage.php <?php header(& ...

  6. Bootstrap真的总是好的吗

    原文地址:Bootstrap considered harmful 原文作者:Hidde de Vries 译文出自:neal 译者: Neal 个人主页:http://neal1991.python ...

  7. 怎样使一个宽为200px和高为200px的层垂直居中于浏览器中?写出CSS样式代码。

    div{ height:100px; width:100px; position:absolute; top:50%; width:50%; margin-letf:-100px; margin-to ...

  8. C++基础之static(静态)变量

    static 表示静态   作用: 1.在函数体内,静态变量的值维持不变(记忆功能) 2.是一个本地的全局函数,即只能被本模块的函数访问(隐藏功能)   static变量: static全局变量和普通 ...

  9. MongoDB的应用

    一.MongoDB后台管理 # ./mongo MongoDB shell version v3.4.2 connecting to: mongodb://127.0.0.1:27017 MongoD ...

  10. MySQL concat函数里面单引号的使用

    通过concat拼字符串的时候,如果语句里面需要使用单引号,可以使用两个单引号来代替一个引号