STL - priority_queue(优先队列)
参考: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(优先队列)的更多相关文章
- STL priority_queue 优先队列 小记
今天做题发现一个很有趣的地方,竟然还是头一次发现,唉,还是太菜了. 做图论用STL里的priority_queue去优化prim,由于特殊需求,我需要记录生成树中是用的哪些边. 于是,我定义的优先队列 ...
- c++ STL - priority_queue优先队列详解
简述 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有最高级先出 (first in, l ...
- C++ STL priority_queue 优先队列
优先队列: 与队列的用法是一样的,优先队列内部是通过堆来排序实现的, #include<iostream> #include <queue> using namespace s ...
- 【STL】优先队列priority_queue详解+OpenJudge-4980拯救行动
一.关于优先队列 队列(queue)这种东西广大OIer应该都不陌生,或者说,队列都不会你还学个卵啊(╯‵□′)╯︵┻━┻咳咳,通俗讲,队列是一种只允许从前端(队头)删除元素.从后端(队尾)插入元素的 ...
- STL - priority_queue(优先队列)
优先级队列priority_queue 最大值优先级队列.最小值优先级队列 优先级队列适配器 STL priority_queue 用来开发一些特殊的应用. priority_queue<int ...
- STL之优先队列
STL 中优先队列的使用方法(priority_queu) 基本操作: empty() 如果队列为空返回真 pop() 删除对顶元素 push() 加入一个元素 size() 返回优先队列中拥有的元素 ...
- 详解C++ STL priority_queue 容器
详解C++ STL priority_queue 容器 本篇随笔简单介绍一下\(C++STL\)中\(priority_queue\)容器的使用方法和常见的使用技巧. priority_queue容器 ...
- 第20章 priority_queue优先队列容器
/* 第20章 priority_queue优先队列容器 20.1 priority_queue技术原理 20.2 priority_queue应用基础 20.3 本章小结 */ // 第20章 pr ...
- stack堆栈容器、queue队列容器和priority_queue优先队列容器(常用的方法对比与总结)
stack堆栈是一个后进先出的线性表,插入和删除元素都在表的一端进行. stack堆栈的使用方法: 采用push()方法将元素入栈: 采用pop()方法将元素出栈: 采用top()方法访问栈顶元素: ...
随机推荐
- Qt客户端阿里云服上传文件
整体原理: 阿里云提供了c程序上传文件到阿里云服务器的sdk工具包,将这个工具包继承在自己的客户端,调用接口即可实现上传文件. 前期准备: 1.阿里云c程序客户端的sdk,下载地址:https://h ...
- 记录树莓派静态IP修改
1.操作:修改dhcpcd.conf文件 sudo nano /etc/dhcpcd.conf interface eth0 static ip_address=192.168.0.10/24 sta ...
- socket基础篇
server_scoket.py #!/usr/bin/env python3.5 # -*- coding:utf-8 -*- import socket import subprocess ip_ ...
- 【python爬虫】用python编写LOL战绩查询
介绍一个简单的python爬虫,通过Tkinter创建一个客户端,当输入要查询的LOL用户名称的时候,可以显示出当前用户的所在服务器,当前战力和当前段位. 爬取网页地址:http://lol.duow ...
- ZwQueryVirtualMemory暴力枚举进程模块
0x01 前言 同学问过我进程体中EPROCESS的三条链断了怎么枚举模块,这也是也腾讯面试题.我当时听到也是懵逼的. 后来在网上看到了一些内存暴力枚举的方法ZwQueryVirtualMemory. ...
- NetCDF 共享软件 中文
NetCDF 共享软件 转载 在 Models-3 模式中,使用的数据存取接口称为 I/O API,其实就是 NetCDF 文件格式.而由于我们需要了解 Models-3 输出档案的数据情况,因此 ...
- Apache-Maven 的安装及配置
一. 下载 没有 Maven 的朋友可以去 Apache 的官网下载一个 Maven, Apache-Maven 官网下载 : https://maven.apache.org/download.cg ...
- 【学习笔记】String进阶:StringBuffer类(线程安全)和StringBuilder类
一.除了使用String类存储字符串之外,还可以使用StringBuffer类存储字符串.而且它是比String类更高效的存储字符串的一种引用数据类型. 优点: 对字符串进行连接操作时,使用Strin ...
- 深入理解java线程池—ThreadPoolExecutor
几句闲扯:首先,我想说java的线程池真的是很绕,以前一直都感觉新建几个线程一直不退出到底是怎么实现的,也就有了后来学习ThreadPoolExecutor源码.学习源码的过程中,最恶心的其实就是几种 ...
- html-超链接标签
链接资源 - <a href="01-hello.html">只是一个超链接1</a> ** href:链接的资源的地址 ** target:设置打开的方式 ...