STL priority_queue(优先队列)详解

构造,析构

priority_queue() //默认构造函数,生成一个空的排序队列 

priority_queue(const queue&); //拷贝构造函数 

priority_queue(const Compare& comp);
//构造生成一个空的priority_queue对象,
//使用comp作为priority_queue的comparison 

priority_queue(const value_type* first, const value_type* last);
//带有两个参数的构造函数,
//使用默认的Comparison作为第三个参数 

priority_queue& operator=(const priority_queue &);
//赋值运算符重载 

c.~priority_queue() //销毁所有元素并释放内存

### 常用函数###

empty();//判断是否为空 

push(Elem e);//队列尾部增加一元素 

pop();//队列头部数据出队 

top();//返回头部数据 

size();//返回栈中元素个数

### 改变排列顺序###
priority_queue < Type, Container, Functional >
如果我们把后面俩个参数缺省的话,优先队列就是大顶堆,
队头元素最大。在很多时候,我们需要的不一定是最大值,
也有可能是最小值。这是就需要我们来改变priority_queue中的顺序。

方法有两种:
           1.如果加入优先队列的是基本类型,那么我们就可以这样,我们以int为例:

//注意greater<int> >这之间有一个空格   
priority_queue<int, vector<int>, greater<int> >Q;

2.对于自定义数据类型的话,我们不论是要改变排序方式,还是不改变都要这样 – 重载 小于( < ) 运算符:
因为,如果你不重载比较运算符的话,编译器无法比较自定义数据类型的大小关系。然而又因为在priority_queue的内部,只需用到 小于号(<),所以我们只需要重载小于号即可。当然对于自定义数据类型来说,也是必须重载,否则将无法使用priority_queue。重载小于号,我们可以有两种方式,一种用成员函数,一种使用友元函数(这里就不多说了,不会的同学,自己在好好复习复习C++)

### 优先队列的使用范例###

#include <queue>
#include <list>
#include <cstdio>
using namespace std;
/**
 优先级队列的使用范例
*/
int main(){
  //优先队列默认是使用vector作为容器
  priority_queue<int> a;
  // priority_queue<int,list<int>> b;//可以这样定义,但无法使用
  int i;
  //压入数据
  for(i=0;i<10;i++){
   a.push(i*2-5);
   //b.push(i);//编译错误
  }
  printf("优先队列的大小=%d\n",a.size());
  while(!a.empty()){
    printf("%d\n",a.top());
    a.pop();//出队
  }
  putchar('\n');
  return 0;
}

### 优先队列带比较函数示例(针对结构体)###

下面程序是针对结构体的,对数据的比较是通过对结构体重载operator()。
程序功能是模拟排队过程,每人有姓名和优先级,优先级相同则比较姓名,开始有5个人进入队列,然后队头2个人出队,再有3个人进入队列,最后所有人都依次出队,程序会输出离开队伍的顺序

#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
/**
 结构体
*/
struct Node{
  char szName[20];//人名
  int priority;//优先级
  //构造函数
  Node(int nri, char *pszName){
    strcpy(szName, pszName);
    priority = nri;
  }
};
/**
 结构体的比较方法 改写operator()
*/
struct NodeCmp{
//重写operator()方法,注意这里重写的写法,operator()(参数1,...)
  bool operator()(const Node &na, const Node &nb){
    if (na.priority != nb.priority)
      return na.priority <= nb.priority;
    else
      return strcmp(na.szName, nb.szName) > 0;
  }
};
/**
 打印节点
*/
void PrintfNode(Node na){
  printf("%s %d\n", na.szName, na.priority);
}
int main(){
  //优先级队列默认是使用vector作容器,底层数据结构为堆。
  priority_queue<Node, vector<Node>, NodeCmp> a; 

  //有5个人进入队列
  a.push(Node(5, "小谭"));
  a.push(Node(3, "小刘"));
  a.push(Node(1, "小涛"));
  a.push(Node(5, "小王")); 

  //队头的2个人出队
  PrintfNode(a.top());
  a.pop();
  PrintfNode(a.top());
  a.pop();
  printf("--------------------\n"); 

  //再进入3个人
  a.push(Node(2, "小白"));
  a.push(Node(2, "小强"));
  a.push(Node(3, "小新")); 

  //所有人都依次出队
  while (!a.empty()){
    PrintfNode(a.top());
    a.pop();
  }
  return 0;
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例

    队列这种数据结构更简单,就像我们生活中排队一样,它的特性是先进先出(FIFO). PHP SPL中SplQueue类就是实现队列操作,和栈一样,它也可以继承双链表(SplDoublyLinkedList)轻松实现. SplQueue类摘要如下: SplQueue简单使用如下: 复制代码 代码如下: $queue = new SplQueue();   /**  * 可见队列和双链表的区别就是IteratorMode改变了而已,栈的IteratorMode只能为:  * (1)SplDoublyL

  • 深入探讨POJ 2312 Battle City 优先队列+BFS

    相信坦克大战大家都玩过吧,本题就是根据这个游戏设计的.坦克要从起点(Y),到目的地(T),坦克不能通过钢墙(S),河(R),可以在空地在行走(E),射击破坏砖墙(B),射击砖墙时不行走且花费一个单位的时间,在空地上行走时也花费一个单位的时间.求坦克从起点到目的地最少花多少时间,不可达输出-1:很好的一道搜索题.因为考虑到通过砖墙时和空地所花的时间不同,所以不能使用一般的BFS广搜来做.用DFS深搜,你会发现时间复杂非常高,必然会超时(最大是300*300的图).本题可以使用改进过的广搜或优先队列

  • JavaScript队列、优先队列与循环队列

    队列是一种遵从先进先出(FIFO)原则的有序集合 队列在尾部添加新元素,从顶部移除元素 队列的理解 队列在我们生活中最常见的场景就是排队了 队列这个名字也已经很通俗易懂了 和栈很像,这不过队列是先入先出的数据结构 队列的前面是队头 队列的后面是队尾 出队从队头出 入队从队尾入 队列的创建 和栈类似,这里我就不就不啰嗦了 同样需要实现一些功能 这里我类比生活中的排队上厕所 向队列中添加元素(进入排队的队伍中) 移除队头元素(队伍最前面的人出队进入厕所) 查看队头元素(查看队伍最前面的人) 判断队列

  • 优先队列(priority_queue)的C语言实现代码

    优先队列(priority_queue)和一般队列(queue)的函数接口一致,不同的是,优先队列每次出列的是整个队列中最小(或者最大)的元素. 本文简要介绍一种基于数组二叉堆实现的优先队列,定义的数据结构和实现的函数接口说明如下: 一.键值对结构体:KeyValue 复制代码 代码如下: // =============KeyValue Struct==================================typedef struct key_value_struct KeyValu

  • C++ 实现优先队列的简单实例

    C++ 实现优先队列的简单实例 优先队列类模版实现: BuildMaxHeap.h头文件: #include<iostream> using namespace std; #define Left(i) i*2+1 #define Right(i) i*2+2 #define Parent(i) (i-1)/2 void Max_Heapify(int a[],int length,int i) { int left,right; left=Left(i); right=Right(i); i

  • C++ 标准模板库 STL 顺序容器详解

    C++ 标准模板库 STL 顺序容器 容器 数据结构 顺序性 重复性 支持迭代器 vector 动态数组 无序 可重复 随机访问迭代器 deque 双向队列 无序 可重复 随机访问迭代器 list 双向链表 无序 可重复 双向迭代器 动态数组 vector ​ vector #include <vector> 动态数组:其元素在内存中是连续存放的,随机存取任何元素都可以在常数时间内完成,在该容器的尾部增删元素也几乎能够在常数时间内完成具有较好的性能. ​ 一个 vector 常用函数使用实例如

  • Java数据结构之堆(优先队列)详解

    目录 堆的性质 堆的分类 堆的向下调整 堆的建立 堆得向上调整 堆的常用操作 入队列 出队列 获取队首元素 TopK 问题 例子 数组排序 堆的性质 堆逻辑上是一棵完全二叉树,堆物理上是保存在数组中 . 总结:一颗完全二叉树以层序遍历方式放入数组中存储,这种方式的主要用法就是堆的表示. 并且 如果已知父亲(parent) 的下标, 则: 左孩子(left) 下标 = 2 * parent + 1; 右孩子(right) 下标 = 2 * parent + 2; 已知孩子(不区分左右)(child

  • c++优先队列(priority_queue)用法详解

    普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除. 在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有最高级先出 (first in, largest out)的行为特征. 首先要包含头文件#include<queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队. 优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的. 和队列基本

  • C++优先队列用法案例详解

    c++优先队列(priority_queue)用法详解 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除. 在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有最高级先出 (first in, largest out)的行为特征. 首先要包含头文件#include<queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队. 优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上

  • 详解c++优先队列priority_queue的用法

    既然是队列那么先要包含头文件#include <queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队 优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的 和队列基本操作相同: top 访问队头元素 empty 队列是否为空 size 返回队列内元素个数 push 插入元素到队尾 (并排序) emplace 原地构造一个元素并插入队列 pop 弹出队头元素 swap 交换内容 定义:prio

  • C++ STL priority_queue自定义排序实现方法详解

    前面讲解 priority_queue 容器适配器时,还遗留一个问题,即当 <function> 头文件提供的排序方式(std::less<T> 和 std::greater<T>)不再适用时,如何自定义一个满足需求的排序规则. 首先,无论 priority_queue 中存储的是基础数据类型(int.double 等),还是 string 类对象或者自定义的类对象,都可以使用函数对象的方式自定义排序规则.例如: #include<iostream> #in

  • C++示例详解Prim算法与优先队列

    目录 Prim算法 prim代码实现 优先队列 优先队列代码实现 自定义类型优先序列 贪心算法的本质是:一个问题的局部最优解,也是该问题的全局最优解. 最小生成树的最优子结构性质:假设一个无向图包含两部分A,B,其中A为最小生成树部分,B为剩余部分,则存在以下性质:该无向图中一个顶点在A部分,另一个顶点在B部分的边中,权值最小的边一定属于整个无向图的最小生成树,即部分最小权值是整个最小生成树的局部最有解,该性质符合贪心算法的特点. Prim算法 基于最小生成树的该性质,使用prim算法来求解最小

  • C++中 STL list详解及简单实例

    C++中 STL list详解 1.List: 内部实现是一个双向链表,可以高效的进行插入删除,但不能够进行随机访问 2..示例程序: #include "stdafx.h" #include <iostream> #include <list> #include <iterator> #include <algorithm> using namespace std; const int num[5] = {1,3,2,4,5}; boo

  • 浅谈c++中的stl中的map用法详解

    Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道.这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处. 下面举例说明什么是一对一的数据映射.比如一个班级中,每个学生的学号跟他的姓名就存在着一一

  • zlib库压缩和解压字符串STL string的实例详解

    zlib库压缩和解压字符串STL string的实例详解 场景 1.一般在使用文本json传输数据, 数据量特别大时,传输的过程就特别耗时, 因为带宽或者socket的缓存是有限制的, 数据量越大, 传输时间就越长. 网站一般使用gzip来压缩成二进制. 说明 1.zlib库可以实现gzip和zip方式的压缩, 这里只介绍zip方式的二进制压缩, 压缩比还是比较可观的, 一般写客户端程序已足够. 2.修改了一下zpipe.c的实现, 其实就是把读文件改为读字符串, 写文件改为写字符串即可. 例子

随机推荐