STL之优先队列

来源:互联网 发布:qq好友定位软件 编辑:程序博客网 时间:2024/05/01 14:01

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;elsereturn 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 0
原创粉丝点击