zoukankan      html  css  js  c++  java
  • STL优先级队列

    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
    ", a.size());
    	//取优先级队列数据并将数据移出队列
    	while (!a.empty())
    	{
    		printf("%d ", a.top());
    		a.pop();
    	}
    	putchar('
    ');
    	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
    ", 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("--------------------
    ");
    
    	//再进入3个人
    	a.push(Node(2, "小白"));
    	a.push(Node(2, "小强"));
    	a.push(Node(3, "小新"));
    
    	//全部人都依次出队
    	while (!a.empty())
    	{
    		PrintfNode(a.top());
    		a.pop();
    	}
    
    	return 0;
    }

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

  • 相关阅读:
    位运算符
    java中利用itext编辑pdf
    BufferedInputStream实现原理分析
    java File的delete方法删除文件失败
    设置临时java环境
    Android IntentService完全解析 当Service遇到Handler
    关于启动模式
    ZTAndroid为什么要序列化?什么是序列化,怎么进行序列化
    android之数值传递
    关于启动模式之IntentFlag
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4749694.html
Copyright © 2011-2022 走看看