参考: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. TabLayout实现底部导航栏(2)

    TabLayout是android.support.design里的一个控件,使用它可以很方便的做出顶部导航和底部导航.类似于这样的,能设置选中时字体的颜色和选中时的图片. 效果如图: 首先我们在 b ...

  2. 利用paramiko的demo_simple.py进行日志记录时遇到的特殊字符

    特殊字符列表: 回车 "\r" "\x13" 响铃 "\x07" 换行 "\n" "\x10" &q ...

  3. TOJ 1258 Very Simple Counting

    Description Let f(n) be the number of factors of integer n. Your task is to count the number of i(1 ...

  4. 在SourceTree中使用Git submodule

    在開發的過程中我們的項目可能會引用其他的版本庫中的代碼, 例如公司已經累積了一套公用的函式庫, 被多個項目調用;  很顯然地, 不能把公用函式庫的文件直接放到我們開發中的項目中, 這樣不但項目的冗餘, ...

  5. Coursera 机器学习 第8章(下) Dimensionality Reduction 学习笔记

    8 Dimensionality Reduction8.3 Motivation8.3.1 Motivation I: Data Compression第二种无监督问题:维数约简(Dimensiona ...

  6. 一个C#后台调用接口的例子

    string url = ConfigurationSettings.AppSettings["resurl"].ToString(); var wc = new WebClien ...

  7. ATL模板库中的OLEDB与ADO

    上次将OLEDB的所有内容基本上都说完了,从之前的示例上来看OLEDB中有许多变量的定义,什么结果集对象.session对象.命令对象,还有各种缓冲等等,总体上来说直接使用OLEDB写程序很麻烦,用很 ...

  8. js简单时分秒倒计时

    效果: javascript: <script type="text/javascript"> function countTime() { //获取当前时间 var ...

  9. asp and javascript: sql server export data to csv and to xls

    <%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%> <% //塗聚文 //20131021 functio ...

  10. boost库的配置——Linux篇

    Boost库分为两个部分来使用,一是直接使用对应的头文件,二是需要编译安装相应的库才可以使用. 下面是boost在Linux上安装和使用过程(整个boost库全部安装): (1)在www.boost. ...