STL优先级队列
2015-08-22 10:12
453 查看
priority_queue 这是一个优先级队列的所有权值概念单向队列queue。在这个队列中。全部元素是按优先级排列的(也能够觉得queue是个按进入队列的先后做为优先级的优先级队列——先进入队列的元素优先权要高于后进入队列的元素)。在计算机操作系统中,优先级队列的使用是相当频繁的,进线程调度都会用到。
在STL的详细实现中,priority_queue也是以别的容器作为底部结构。再依据堆的处理规则来调整元素之间的位置。
priority_queue函数列表
能够看出priority_queue的函数列表与栈stack的函数列表是同样的。
1. 标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。
2. 数据越小。优先级越高
3.数据越大,优先级越高
4. 自己定义优先级,重载<符号
具体控制优先级代码:
以下先给出优级先级队列的使用范例。
以下程序是针对结构体的。对数据的比較是通过对结构体重载operator()。
程序功能是模拟排队过程。每人有姓名和优先级,优先级同样则比較姓名,開始有5个人进入队列,然后队头2个人出队。再有3个人进入队列,最后全部人都依次出队。程序会输出离开队伍的顺序。
在STL的详细实现中,priority_queue也是以别的容器作为底部结构。再依据堆的处理规则来调整元素之间的位置。
函数 | 描写叙述 |
构造析构 | |
priority_queue <Elem> c | 创建一个空的queue 。 |
数据訪问与增减 | |
c.top() | 返回队列头部数据 |
c.push(elem) | 在队列尾部添加elem数据 |
c.pop() | 队列头部数据出队 |
其他操作 | |
c.empty() | 推断队列是否为空 |
c.size() | 返回队列中数据的个数 |
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; }
相关文章推荐
- POJ 3668 Game of Lines(n点最多有多少不平行直线)
- iOS 9学习系列:如何使用ATS提高应用的安全性
- android学习8(ListView高级使用)
- sqlite建表语句(特别是外键问题)
- Oracle 截取指定长度的字符
- Web性能优化:What? Why? How?
- 重用从xib加载的UITableViewCell
- 浅谈switch-case的语法和应用
- 日经社説 20150822 効率を高めつつ石炭火力拡大に歯止めを
- COJ 1511:残缺的棋盘
- MD5算法了解(JAVA实现)
- 日经社説 20150822 南北の緊張に警戒怠れない
- AMBA interconnector PL301(一)
- POJ 1511 【heap+dij】
- python编码笔记
- 日经春秋 20150822
- KMP算法最详细
- link和@import的区别
- Android开发笔记----radioGroup的使用
- BZOJ2882