参考: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. Angular4+NodeJs+MySQL 入门-04 接口调用类

    上一篇文章说一下,后台接口的创建,这篇说一下如果调用接口. 创建一个目录helpers 此目录下有三个文件分别是 ApiClient.ts.clientMiddleware.ts.Core.ts,前面 ...

  2. (转) 来自: http://man.linuxde.net/tee

    tee命令文件过滤分割与合并 tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin.简单的说就是把数据重定向到给定文件和屏幕上. 存在缓存机制,每1024个 ...

  3. Hsl PLC

    https://github.com/dathlin/HslCommunication 地址

  4. javascript遍历表

    定义表结构 1. 通过id遍历 <html> <body> <table id="tb" border="1"> <t ...

  5. 使用 GitHub API 进行数据分析 (Node.js)

    使用 GitHub API 进行数据分析 (Node.js) Node.js 的访问 GitHub 的 API 库,通过 npm 或者 yarn 安装: yarn add github-api 官方示 ...

  6. [转] .net core Session , Working with a distributed cache

    本文转自:https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed By Steve Smith+ Di ...

  7. C#学习基础(1)命名约定

    c#语言规范建议使用特定大小写约定创建字标识符 Pascal 大小写     标识符中每个单词的首字母大写   用于类型名和成员名  例如:CarDeck,FirstName Camel 大小写   ...

  8. Java 匿名内部类 & 内部类

    一.JAVA中内部类和匿名内部类的区别 内部类:内部类可以是static的或者非static的,static内部类只能包含静态方法和静态类变量,只能访问外部类的静态元素,内部类可以实例化,多次使用. ...

  9. 【学习笔记】开源日志记录工具log4j使用方法

    http://blog.csdn.net/zouqingfang/article/details/37558469 一.在MyEclipse中使用log4j的步骤比较简单,主要分为以下四个步骤: 1. ...

  10. struts2的基本配置

    1.package标签下主要的点在namespace和name,extend上 extend 一般继承自struts-default.xml下,继承其拦截器及一些功能,这个已在本人的拦截器一文中有讲到 ...