参考:http://www.cnblogs.com/xzxl/p/7266404.html

一、基本定义:

优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队。这点类似于给队列里的元素进行了由大到小的顺序排序。元素的比较规则默认按元素值由大到小排序,可以重载“<”操作符来重新定义比较规则。

优先级队列可以用向量(vector)或双向队列(deque)来实现(注意list container不能用来实现queue,因为list的迭代器不是任意存取iterator,而pop中用到堆排序时是要求randomaccess iterator 的!):
priority_queue<vector<int>, less<int> > pq1;     // 使用递增less<int>函数对象排序
priority_queue<deque<int>, greater<int> > pq2;   // 使用递减greater<int>函数对象排序
其成员函数有“判空(empty)” 、“尺寸(Size)” 、“栈顶元素(top)” 、“压栈(push)” 、“弹栈(pop)”等。

二、用途
最短路算法优化, 斜率DP优化等

三、代码实现&基本操作

///优先队列的基本使用
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std; ///自定义优先级方法1,定义结构,使用运算符重载 struct cmp1
{
bool operator ()(int &a, int &b)
{
return a > b; //最小值优先(是“>" 注意别与排序搞混)
}
}; struct cmp2
{
bool operator ()(int &a, int &b)
{
return a < b; //最大值优先
}
}; ///自定义优先级方法2,定义结构,使用运算符重载 struct numb_1
{
int x;
bool operator < (const numb_1 &a) const {
return x > a.x; //最小值优先(与前面的联系记忆)
}
}; struct numb_2
{
int x;
bool operator < (const numb_2 &a) const {
return x < a.x; //最大值优先
}
}; ///测试用数据
int a[] = {, , , , , , , };
numb_1 num1[] = {, , , , , , , }; //用于自定义方法2
numb_2 num2[] = {, , , , , , , }; //用于自定义方法2 int main()
{
///采用默认优先级
priority_queue<int> que; //(由大到小)构造队列(最单纯的优先队列) ///自定义优先级方法1
priority_queue<int, vector<int>,cmp1> que1; //最小值优先
priority_queue<int, vector<int>,cmp2> que2; //最大值优先 ///使用系统的函数
//(注意最后的括号,不是“<<”, 因为”<<“是右移运算符
priority_queue<int, vector<int>, greater<int> > que3; //最小值优先
priority_queue<int, vector<int>, less<int> > que4; //最大值优先 ///自定义优先级方法2
priority_queue<numb_1> que5; //最小值优先
priority_queue<numb_2> que6; //最大值优先 ///Let's begin ///入队操作
for(int i = ; a[i]; i++)
{
que.push(a[i]);
que1.push(a[i]);
que2.push(a[i]);
que3.push(a[i]);
que4.push(a[i]);
}
for(int i = ; num1[i].x; i++)
que5.push(num1[i]);
for(int i = ; num2[i].x; i++)
que6.push(num2[i]); ///输出结果
printf("采用默认优先级:\n");
printf("(priority_queue<int>que;)\n");
printf("Que 0:\n");
while(!que.empty()) //判断是否为空
{
printf("%d ", que.top()); //队首元素
que.pop(); //出队
}
puts("");
puts(""); printf("采用结构体自定义优先级方式一:\n");
printf("(priority_queue<int,vector<int>,cmp>que;)\n");
printf("Que 1:\n");
while(!que1.empty()){
printf("%d ",que1.top());
que1.pop();
}
puts("");
printf("Que 2:\n");
while(!que2.empty()){
printf("%d ",que2.top());
que2.pop();
}
puts("");
puts(""); printf("采用头文件\"functional\"内定义优先级:\n");
printf("(priority_queue<int,vector<int>,greater<int>/less<int> >que;)\n");
printf("Que 3:\n");
while(!que3.empty()){
printf("%d ",que3.top());
que3.pop();
}
puts("");
printf("Que 4:\n");
while(!que4.empty()){
printf("%d ",que4.top());
que4.pop();
}
puts("");
puts(""); printf("采用结构体自定义优先级方式二:\n");
printf("(priority_queue<number>que)\n");
printf("Que 5:\n");
while(!que5.empty()){
printf("%d ",que5.top());
que5.pop();
}
puts("");
printf("Que 6:\n");
while(!que6.empty()){
printf("%d ",que6.top());
que6.pop();
}
puts("");
return ; }

STL - priority_queue(优先队列)的更多相关文章

  1. STL priority_queue 优先队列 小记

    今天做题发现一个很有趣的地方,竟然还是头一次发现,唉,还是太菜了. 做图论用STL里的priority_queue去优化prim,由于特殊需求,我需要记录生成树中是用的哪些边. 于是,我定义的优先队列 ...

  2. c++ STL - priority_queue优先队列详解

    简述 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有最高级先出 (first in, l ...

  3. C++ STL priority_queue 优先队列

    优先队列: 与队列的用法是一样的,优先队列内部是通过堆来排序实现的, #include<iostream> #include <queue> using namespace s ...

  4. 【STL】优先队列priority_queue详解+OpenJudge-4980拯救行动

    一.关于优先队列 队列(queue)这种东西广大OIer应该都不陌生,或者说,队列都不会你还学个卵啊(╯‵□′)╯︵┻━┻咳咳,通俗讲,队列是一种只允许从前端(队头)删除元素.从后端(队尾)插入元素的 ...

  5. STL - priority_queue(优先队列)

    优先级队列priority_queue 最大值优先级队列.最小值优先级队列 优先级队列适配器 STL priority_queue 用来开发一些特殊的应用. priority_queue<int ...

  6. STL之优先队列

    STL 中优先队列的使用方法(priority_queu) 基本操作: empty() 如果队列为空返回真 pop() 删除对顶元素 push() 加入一个元素 size() 返回优先队列中拥有的元素 ...

  7. 详解C++ STL priority_queue 容器

    详解C++ STL priority_queue 容器 本篇随笔简单介绍一下\(C++STL\)中\(priority_queue\)容器的使用方法和常见的使用技巧. priority_queue容器 ...

  8. 第20章 priority_queue优先队列容器

    /* 第20章 priority_queue优先队列容器 20.1 priority_queue技术原理 20.2 priority_queue应用基础 20.3 本章小结 */ // 第20章 pr ...

  9. stack堆栈容器、queue队列容器和priority_queue优先队列容器(常用的方法对比与总结)

    stack堆栈是一个后进先出的线性表,插入和删除元素都在表的一端进行. stack堆栈的使用方法: 采用push()方法将元素入栈: 采用pop()方法将元素出栈: 采用top()方法访问栈顶元素: ...

随机推荐

  1. 用poi替换ppt中的文字和图片

    try {            // 获取PPT文件             String pptModelPath =ConfigReadUtil.getInstance().getConfigI ...

  2. 修改OPENSUSE 桌面快速搜索快捷键

  3. c#字典排序

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  4. Python 递归返回树形菜单JSON串 <flask>

    需求:菜单管理功能(增.删.改),多级树形菜单展示 数据库表设计 create table if not exists Menu( id serial primary key , title ) no ...

  5. 游戏AI的生命力源自哪里?为你揭开MOBA AI的秘密!

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由wataloo发表在专栏wataloo的试验田 1 设计概要 1.1 设计原则和目的 英雄AI的目的主要有: 1.新手过渡局,让玩家刚 ...

  6. BNU7538——Clickomania——————【区间dp】

    Clickomania Time Limit: 10000ms Memory Limit: 32768KB 64-bit integer IO format: %I64d      Java clas ...

  7. java I/O流 温习随笔

    java I/O流的熟练掌握是十分重要的. 在我的理解中,I/O流可以分为两种:字符流.字节流.字符流就是可以用来传输字符的流,比如传输txt文本,简单的说,只有能被电脑中的记事本直接打开并且你能看懂 ...

  8. c# xml API操作

    LoginInfo loginInfo = new LoginInfo(); xmlNode = _xml.SelectSingleNode(loginUrl); loginInfo.LoginUrl ...

  9. JS常用的设计模式(3)-——观察者模式

    观察者模式( 又叫发布者-订阅者模式 )应该是最常用的模式之一. 在很多语言里都得到大量应用. 包括我们平时接触的dom事件. 也是js和dom之间实现的一种观察者模式. div.onclick = ...

  10. java连接sql server数据库

    1.新建项目,导入包  sqljdbc4.jar或sqljdbc.jar(jdk1.7版本) 2.新建类文件ConnectionDB.java package hello; import java.s ...