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. 标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。

priority_queue<int> pq;

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

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


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

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

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

struct node
{
friend bool operator< (node n1, node n2)
{
return n1.priority < n2.priority;
}
int priority;
int value;
};

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

具体控制优先级代码:

struct cmp1
{
bool operator ()(int &a,int &b)
{
return a>b;//最小值优先
}
};
struct cmp2
{
bool operator ()(int &a,int &b)
{
return a<b;//最大值优先
}
};
struct node1
{
int u;
bool operator < (const node1 &a) const
{
return u>a.u;//最小值优先
}
};
struct node2
{
int u;
bool operator < (const node2 &a) const
{
return u<a.u;//最大值优先
}
}; priority_queue<int>q1;//採用默认优先级构造队列
priority_queue<int,vector<int>,cmp1>q2;//最小值优先
priority_queue<int,vector<int>,cmp2>q3;//最大值优先
priority_queue<int,vector<int>,greater<int> >q4;//注意“>>”会被觉得错误,
//这是右移运算符。所以这里用空格号隔开,最小值优先
priority_queue<int,vector<int>,less<int> >q5;//最大值优先
priority_queue<node1>q6; //自己定义优先级
priority_queue<node2>q7;

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

#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 ", 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
{
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;
}

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

最新文章

  1. [Noip2016]蚯蚓 D2 T2 队列
  2. &#39;-[__NSCFString stringFromMD5]: unrecognized selector sent to instance 0x14d89a50&#39;
  3. mysq数据库再次理解
  4. js获取页面及个元素高度、宽度
  5. C语言初学者代码中的常见错误与瑕疵(14)
  6. android Vibrator 使用
  7. WSGI的理解
  8. java中途强制跳出递归
  9. Introduce: IEPI.BIATranscribe 图像表格拓写工具
  10. 如何定制 Calico 网络 Policy - 每天5分钟玩转 Docker 容器技术(70)
  11. 苹果iPhone X上搭载的那颗A11仿生芯片,到底牛在哪?
  12. C 真正理解二级指针
  13. [Link-Cut-Tree]【学习笔记】
  14. 基于 Vue + Koa2 + MongoDB + Redis 实现一个完整的登录注册
  15. css3实现背景渐变
  16. MySQL slow_log日志表出现非法字段值
  17. VMware环境安装MacOS
  18. Python爬虫技巧
  19. 在ASP.NET MVC中使用区域来方便管理controller和view
  20. (linux shell)第二章--命令之乐(一)

热门文章

  1. 【42.86%】【Codeforces Round #380D】Sea Battle
  2. 【z08】乌龟棋
  3. icvPrecalculate
  4. Linux有问必答:Linux上如何查看某个进程的线程
  5. 附加数据库 对于server XXX失败
  6. SelectionKey API 用法
  7. [Ramda] Curry, Compose and Pipe examples
  8. Stacks of Flapjacks
  9. 基于 Android NDK 的学习之旅-----资源释放
  10. 【poj1442】Black Box