STL优先队列详解

优先队列

          优先队列是一种抽象数据类型(Abstract Date Type,ADT),行为和队列类似,但是先出队的元素不是先进队列的元素,而是队列中优先级最高的元素。
          STL的优先队列定义在头文件<queue>和 (队列一样),用"priority_queue<int>pq"来声明;
最基本的用法

          定义priority_queue<int>pq

          操作:

                    pq.empty() 如果队列为空返回真

                    pq.pop() 删除对顶元素

                    pq.push() 加入一个元素

                    pq.size() 返回优先队列中拥有的元素个数

                    pq.top() 返回优先队列对顶元素

下面我们介绍几种优先队列的定义方式:

          priority_queue<int>pq 默认的是整数越大,优先级越高,如果想让他 整数越小 优先级越高怎么办?
          STL中也有模板   “priority_queue<int,vector<int>,greater<int > >pq”
          上面的尖括号内第一个参数为入队元素类型(int),第二个为容器类型(vector<int>),第三个为比较函数(greater<int>)
          因此我们也能自定义
              priority_queue<int,vector<int>,cmp1 >pq; 最小值优先
           priority_queue<int,vector<int>,cmp2 >pq2; 最大值优先 (网上有些写法是错的,这是笔者测试后的定义方式哭)


cmp1,cmp2 在结构体中实现
struct cmp1{  
    bool operator ()(int &a,int &b){  
        return a>b;//最小值优先  
    }  
};  
struct cmp2{  
    bool operator ()(int &a,int &b){  
        return a<b;//最大值优先  
    }  
};  


当然,我们也能设置自定义类型的优先级
struct node  //自定义类型优先级设定
{
    friend bool operator< (node n1, node n2)//重载小于号,,不要重载大于号,可能报错
    {
        return n1.priority < n2.priority;// (priority)大的优先级高
    }
    int priority;
    int value;
};

最后奉上笔者的测试代码:
 #include <queue>
 #include <vector>
#include <stdio.h>
//#include <functional.h>
using namespace std;
struct cmp1
{  
    bool operator ()(int &a,int &b)
    {  
        return a>b;//最小值优先  
    }  
};  
struct cmp2
{  
    bool operator ()(int &a,int &b)
    { 
        return a<b;//最大值优先
    }
 }; 
struct node  //自定义类型优先级设定
{
    friend bool operator< (node n1, node n2)//重载小于号,,不要重载大于号,可能报错
    {
        return n1.priority < n2.priority;// (priority)大的优先级高
    }
    int priority;
    int value;
};
int main()
{ 
	int a[6]={1,5,2,8,6,3};
	printf("最大值优先模板:\n");
	priority_queue<int>pq0;
	for(int i=0;i<6;i++)
	{
		pq0.push(a[i]);
	}
	for(int i=0;i<6;i++)
	{
		printf("%d ",pq0.top());
		pq0.pop();
	} 
	printf("\n");
	printf("最大值优先自定义\n");
	priority_queue<int,vector<int>,cmp2 >pq2;
	for(int i=0;i<6;i++)
	{
		pq2.push(a[i]);
	}
	for(int i=0;i<6;i++)
	{
		printf("%d ",pq2.top());
		pq2.pop();
	} 
	printf("\n");
	printf("最小值优先模板:\n");
	priority_queue<int,vector<int>,greater<int> >pq3;//注意这里两个> >之间有空格否则编译器会报错g++
	for(int i=0;i<6;i++)
	{
		pq3.push(a[i]);
	}
	for(int i=0;i<6;i++)
	{
		printf("%d ",pq3.top());
		pq3.pop();
	} 
	printf("\n");
	priority_queue<int,vector<int>,cmp1 >pq;
	printf("最小值优先自定义:\n");
	for(int i=0;i<6;i++)
	{
		pq.push(a[i]);
	}
	for(int i=0;i<6;i++)
	{
		printf("%d ",pq.top());
		pq.pop();
	} 
	printf("\n");
	printf("自定义类型优先级:\n");
	priority_queue<node> pq4;
	node b[5];
	b[0].priority = 6; b[0].value = 1; 
        b[1].priority = 9; b[1].value = 5; 
        b[2].priority = 2; b[2].value = 3; 
        b[3].priority = 8; b[3].value = 2; 
        b[4].priority = 1; b[4].value = 4; 
	for(int i=0;i<5;i++)
	{
		pq4.push(b[i]);
	}
	printf("优先级  值\n");
	for(int i=0;i<5;i++)
	{
		
		printf("%d\t%d\n",pq4.top().priority,pq4.top().value);
		pq4.pop();
	}
	
    return 0;
}
(如有错误,欢迎指正,转载请注明出处)





posted @ 2015-05-03 10:11  编程菌  阅读(682)  评论(1编辑  收藏  举报