priority_queue 这是一个优先级队列的所有权值概念单向队列queue。在这个队列中。全部元素是按优先级排列的(也能够觉得queue是个按进入队列的先后做为优先级的优先级队列——先进入队列的元素优先权要高于后进入队列的元素)。在计算机操作系统中,优先级队列的使用是相当频繁的,进线程调度都会用到。

在STL的详细实现中,priority_queue也是以别的容器作为底部结构。再依据堆的处理规则来调整元素之间的位置。

priority_queue函数列表
函数 描写叙述
构造析构
priority_queue <Elem> c
 创建一个空的queue 。


数据訪问与增减
c.top() 返回队列头部数据
c.push(elem) 在队列尾部添加elem数据
 c.pop() 队列头部数据出队
其他操作
c.empty() 推断队列是否为空
c.size()

返回队列中数据的个数

 

能够看出priority_queue的函数列表与栈stack的函数列表是同样的。

1. 标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。

  1. priority_queue<int> pq;

2. 数据越小。优先级越高

  1. <pre name="code" class="cpp">priority_queue<int, vector<int>, greater<int> >pq;

  1.  

3.数据越大,优先级越高

  1. priority_queue<int, vector<int>, less<int> >pq;

4. 自己定义优先级,重载<符号

  1. struct node
  2. {
  3. friend bool operator< (node n1, node n2)
  4. {
  5. return n1.priority < n2.priority;
  6. }
  7. int priority;
  8. int value;
  9. };

注:重载>号会编译出错。由于标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。

具体控制优先级代码:

  1. struct cmp1
  2. {
  3. bool operator ()(int &a,int &b)
  4. {
  5. return a>b;//最小值优先
  6. }
  7. };
  8. struct cmp2
  9. {
  10. bool operator ()(int &a,int &b)
  11. {
  12. return a<b;//最大值优先
  13. }
  14. };
  15. struct node1
  16. {
  17. int u;
  18. bool operator < (const node1 &a) const
  19. {
  20. return u>a.u;//最小值优先
  21. }
  22. };
  23. struct node2
  24. {
  25. int u;
  26. bool operator < (const node2 &a) const
  27. {
  28. return u<a.u;//最大值优先
  29. }
  30. };
  31.  
  32. priority_queue<int>q1;//採用默认优先级构造队列
  33. priority_queue<int,vector<int>,cmp1>q2;//最小值优先
  34. priority_queue<int,vector<int>,cmp2>q3;//最大值优先
  35. priority_queue<int,vector<int>,greater<int> >q4;//注意“>>”会被觉得错误,
  36. //这是右移运算符。所以这里用空格号隔开,最小值优先
  37. priority_queue<int,vector<int>,less<int> >q5;//最大值优先
  38. priority_queue<node1>q6; //自己定义优先级
  39. priority_queue<node2>q7;

以下先给出优级先级队列的使用范例。

  1. #include <queue>
  2. #include <list>
  3. #include <cstdio>
  4. using namespace std;
  5. int main()
  6. {
  7. //优先级队列默认是使用vector作容器。
  8. priority_queue<int> a;
  9. priority_queue<int, list<int>> b; //能够这样声明,但无法使用
  10. int i;
  11. //压入数据
  12. for (i = 0; i < 10; i++)
  13. {
  14. a.push(i * 2 - 5);
  15. //b.push(i); //编译错误
  16. }
  17. //优先级队列的大小
  18. printf("%d\n", a.size());
  19. //取优先级队列数据并将数据移出队列
  20. while (!a.empty())
  21. {
  22. printf("%d ", a.top());
  23. a.pop();
  24. }
  25. putchar('\n');
  26. return 0;
  27. }

以下程序是针对结构体的。对数据的比較是通过对结构体重载operator()。

程序功能是模拟排队过程。每人有姓名和优先级,优先级同样则比較姓名,開始有5个人进入队列,然后队头2个人出队。再有3个人进入队列,最后全部人都依次出队。程序会输出离开队伍的顺序。

  1. #include <queue>
  2. #include <cstring>
  3. #include <cstdio>
  4. using namespace std;
  5. //结构体
  6. struct Node
  7. {
  8. char szName[20];
  9. int priority;
  10. Node(int nri, char *pszName)
  11. {
  12. strcpy(szName, pszName);
  13. priority = nri;
  14. }
  15. };
  16. //结构体的比較方法 改写operator()
  17. struct NodeCmp
  18. {
  19. bool operator()(const Node &na, const Node &nb)
  20. {
  21. if (na.priority != nb.priority)
  22. return na.priority <= nb.priority;
  23. else
  24. return strcmp(na.szName, nb.szName) > 0;
  25. }
  26. };
  27. void PrintfNode(Node &na)
  28. {
  29. printf("%s %d\n", na.szName, na.priority);
  30. }
  31. int main()
  32. {
  33. //优先级队列默认是使用vector作容器,底层数据结构为堆。
  34. priority_queue<Node, vector<Node>, NodeCmp> a;
  35.  
  36. //有5个人进入队列
  37. a.push(Node(5, "小谭"));
  38. a.push(Node(3, "小刘"));
  39. a.push(Node(1, "小涛"));
  40. a.push(Node(5, "小王"));
  41.  
  42. //队头的2个人出队
  43. PrintfNode(a.top());
  44. a.pop();
  45. PrintfNode(a.top());
  46. a.pop();
  47. printf("--------------------\n");
  48.  
  49. //再进入3个人
  50. a.push(Node(2, "小白"));
  51. a.push(Node(2, "小强"));
  52. a.push(Node(3, "小新"));
  53.  
  54. //全部人都依次出队
  55. while (!a.empty())
  56. {
  57. PrintfNode(a.top());
  58. a.pop();
  59. }
  60.  
  61. return 0;
  62. }

版权声明:本文博客原创文章。博客,未经同意,不得转载。

STL优先级队列的更多相关文章

  1. stl的优先级队列

    #include <iostream> #include <vector> #include <queue> using namespace std; class ...

  2. STL学习系列七:优先级队列priority_queue容器

    1.简介 最大值优先级队列.最小值优先级队列 优先级队列适配器 STL priority_queue 用来开发一些特殊的应用,请对stl的类库,多做扩展性学习 这里给个例子: #include< ...

  3. STL之优先级队列priority_queue

    摘要: priority_queue,自适应容器(即容器适配器):不能由list来组建: 最大值优先级队列(最大值始终在对首,push进去时候) 最小值优先级队列: 优先级队列适配器 STL  pri ...

  4. STL之heap与优先级队列Priority Queue详解

    一.heap heap并不属于STL容器组件,它分为 max heap 和min heap,在缺省情况下,max-heap是优先队列(priority queue)的底层实现机制.而这个实现机制中的m ...

  5. C++ STL 学习笔记__(6)优先级队列priority_queue基本操作

    10.2.7优先级队列priority_queue v  最大值优先级队列.最小值优先级队列 v  优先级队列适配器 STL priority_queue v  用来开发一些特殊的应用,请对stl的类 ...

  6. STL中的优先级队列priority_queue

    priority_queue(queue类似)完全以底部容器为根据,再加上二叉堆(大根堆或者小根堆)的实现原理,所以其实现非常简单,缺省情况下priority_queue以vector作为底部容器.另 ...

  7. STL中的优先级队列(priority_queue)的自己实现priqueue

    这篇文章主要介绍堆(最大堆和最小堆),以及一些系统对一些任务,比如线程,进程做调度的时候,所采用的优先级队列. 主要思想就是,做一个最大堆(任务的权重最大的在顶端),把顶端的任务取出,重新做一个堆,处 ...

  8. C++STL模板库适配器之优先级队列

    目录 适配器之优先级队列 一丶优先级队列简介(priority_queue) 二丶优先级队列代码演示 1.优先级队列代码以及使用简介 适配器之优先级队列 一丶优先级队列简介(priority_queu ...

  9. STL中队列(queue)的使用方法

    STL 中队列的使用(queue) 基本操作: push(x) 将x压入队列的末端 pop() 弹出队列的第一个元素(队顶元素),注意此函数并不返回任何值 front() 返回第一个元素(队顶元素) ...

随机推荐

  1. C++利用SOAP开发WebService

    // soapconsole.cpp : Defines the entry point for the console application.// #include "stdafx.h& ...

  2. Eclipse RCP 中创建自己定义首选项,并能读取首选项中的值

    Eclipse RCP的插件中若想自定义首选项须要扩展扩展点: org.eclipse.core.runtime.preferences //该扩展点用于初始化首选项中的值 org.eclipse.u ...

  3. FreeMarker分页组件监听器

    分页组件监听器 /*  * project名:    * 包     名: com.companyName.dhm.iepgm.common.taglib  * 文 件名: PaginatedList ...

  4. hdu 4406 费用流

    这题问题就是当前时刻究竟选择哪门课程,易知选择是和分数有关的,而且是一个变化的权值,所以能够用拆点的方式,把从基础分到100分都拆成点.但若这样拆点的话,跑费用流时就必须保证顺序.这样就麻烦了..观察 ...

  5. css3-11 如何实现2D动画

    css3-11 如何实现2D动画 一.总结 一句话总结:就是transform属性,属性值为1.translate()    2.rotate()    3.scale(),而这是哪个属性值是带参数的 ...

  6. Synopsys工艺库札记

    Synopsys工艺库札记 库的基本信息 库类 库类语句指定库名. library ( smic13HT_ss ) { ... <lirary description> ... } /*e ...

  7. 自行实现透明的控件如Panel GroupBox(使用不需要重绘父控件的效果,一切都因为窗口有了WS_EX_TRANSPARENT属性)

    CSDN的Blog开通了.我想这里的Blog作为今后自己回答别人问题的时候,收藏答案的地方很不错呢. 因为社区的贴子早晚都会沉下去,查找起来很不方便,甚至再也找不到呢. Q: http://commu ...

  8. jquery 点击其他地方

    <script type="text/javascript"> function stopPropagation(e) { if (e.stopPropagation) ...

  9. Java8获取参数名及Idea/Eclipse/Maven配置

    在Java8之前,代码编译为class文件后,方法参数的类型固定,但是方法名称会丢失,方法名称会变成arg0.arg1.....而现在,在Java8开始可以在class文件中保留参数名,这就给反射带来 ...

  10. 于 Android NDK 的学习之旅-----数据传输(基本数据类型和数组传输)

    之前的一些文章都有涉及到上层和中间层的数据传输,简单来说,也就是参数和返回值的使用.因为中间层要做的最多的也就是数据传输与转换,下面来介绍下这方面的知识. 数据传输可分为 基本数据类型传输 和 引用数 ...