关闭

C++ priority_queue

标签: 语言学习笔记
626人阅读 评论(0) 收藏 举报
分类:

priority queue在许多的特别场合还是很实用的,优先队列是依据堆(二叉树)实现的,效率是O(lgn),因为它带来的便利,人们可以少写很多的代码,所以学习它是有必要的。

很多时候我们会自己定义比较函数,因为标准库默认使用元素类型的<操作符来确定它们之间的优先级关系,所以如果用>在g++编译器中编译不过,在函数中operator旁边还是用<吧,或者使用()。使用”priority_queue<int,vector<int>,greater<int> >“类似的语句可以将大到小的默认顺序改成小到大(头文件是<functional>,我们也可以自己写一个比较类设定优先级。
struct cmp{
   bool operator()(type a,type b){
       return -------;
   }
};
 

#include<queue>
#include<iostream>
#include<functional>
#include<cmath>
#include<cstdio>
using namespace std;
struct cmp{
    bool operator()(int a,int b){
        return a>b;  //想让其从小到大输出,return >
    }
};
struct point{
    int x,y;
    void show(){
        printf("(%d,%d)\n",x,y);
    }
};
struct cmp2{
    bool operator()(point a,point b){
        return (abs(a.x)+abs(a.y))<(abs(b.x)+abs(b.y));
    }
};
int main(){ //优先队列默认按照从大到小的顺序排列输出
    freopen("cout.txt","w",stdout);
    int a[5]={3,5,2,1,7};
	priority_queue<int> v;
    for( int i = 0; i < 5; i++ ) {
       v.push(a[i]);
    }
    cout<<"v.size:"<<v.size()<<endl;
    while( !v.empty() ) {
       cout << v.top() << endl;
       v.pop();
    }
    cout<<"v.size:"<<v.size()<<endl;
    priority_queue<int,vector<int>,greater<int> > v2;
    //priority_queue<int,vector<int>,less<int> > v; //less 降序 ,greater 升序 
    
    for( int i = 0; i < 5; i++ ) {
       v2.push(a[i]);
    }
    cout<<"v2 从小到大输出:\n";
    while( !v2.empty() ) {
       cout << v2.top() << endl;
       v2.pop();
    }
    priority_queue<int,vector<int>,cmp> v3;
    for( int i = 0; i < 5; i++ ) {
       v3.push(a[i]);
    }
    cout<<"自定义比较的V3输出:\n";
     while( !v3.empty() ) {
       cout << v3.top() << endl;
       v3.pop();
    }
    cout<<"点输出优先级:与原点的曼哈顿距离。\n";
    point p[5]={{0,9},{12,0},{3,4},{6,5},{3,7}};
    priority_queue<point,vector<point>,cmp2> que;
    //priority_queue<point> que; 复杂的类型需要写出专门的比较类(上面的cmp2)。
    for(int i=0;i<5;i++)que.push(p[i]);
     while( !que.empty() ) {
       point tmp=que.top();
       tmp.show();
       que.pop();
    }
    return 0;
}

相关的结果:

v.size:5
7
5
3
2
1
v.size:0
v2 从小到大输出:
1
2
3
5
7
自定义比较的V3输出:
1
2
3
5
7
点输出优先级:与原点的曼哈顿距离。
(12,0)
(6,5)
(3,7)
(0,9)
(3,4)


一个应用例子:

nefu 355 合成陨石

http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=355

大意:一堆石子两两合并,合并的新石子加入原石堆中,每次合并产生的新石子质量是合并石子的质量和,且记录下来,请问最后的最小的质量和

#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;

int main()
{
    int n,a;
    while(cin>>n){
        priority_queue<int,vector<int>,greater<int> > que;
        for(int i=0;i<n;i++) {
            scanf("%d",&a);
            que.push(a);
        }
        if(n==1) {
            printf("%d\n",a);
            continue;
        }
        int ans=0,get=0;
        while(!que.empty()){
            get=que.top();
            que.pop();
            if(que.empty()) break;
            get=get+que.top();
            que.pop();
            ans=ans+get;
            que.push(get);
        }
        printf("%d\n",ans);
    }
    return 0;
}


0
0
查看评论

C++STL priority_queue 学习

<br /><br />毋意,毋必,毋固,毋我。 言必行,行必果。C++STL priority_queue 学习<br />本文来源自网上摘抄,故学习记录于此。<br /> <br />包含priority_queue 的头文件...
  • sraing
  • sraing
  • 2011-03-17 15:00
  • 9543

C++ STL priority_queue

priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数,priority_queue Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。 Container 必须是用数组实现的容器,比如 vector, deque...
  • Sup_Heaven
  • Sup_Heaven
  • 2012-10-02 18:29
  • 27626

C++容器之Priority queue

简介          Priorityqueue是一种容器适配器,它的第一个元素始终是容器中的最大值。          Priori...
  • tj807126663
  • tj807126663
  • 2014-06-10 21:34
  • 1081

C++/C++11中std::priority_queue的使用

C++/C++11中std::priority_queue的使用
  • fengbingchun
  • fengbingchun
  • 2017-04-23 16:08
  • 1937

【c++】STL里的priority_queue用法总结

1、头文件 #include 2、定义 priority_queue p; 3、优先输出大数据 priority_queue Type为数据类型, Container为保存数据的容器,Functional为元素比较方式。 如果不写后两个参数,那么容器默认用的是vecto...
  • xiaoquantouer
  • xiaoquantouer
  • 2016-07-24 20:39
  • 9850

C++ priority_queue用法(大顶堆,小顶堆)

cplusplus.com template <class T, class Container = vector<T>, class Compare = less<typename Container::value_type> > class prior...
  • lijiang1991
  • lijiang1991
  • 2016-10-03 11:59
  • 5025

C++中priority_queue的比较函数重载的两种方式

1.定义比较函数,以函数对象形式     这种方式使用时,需要把函数加入priority_queue的声明中去  struct com{   bool operator()( T &t1, T &t2)   &#...
  • aa838260772
  • aa838260772
  • 2014-10-03 14:30
  • 2282

C++ 优先队列 priority_queue 的基本使用方法【定义优先级】

转自: #include #include using namespace std; priority_queue big; //大根堆 priority_queue,greater > small; //小根堆,最后的两个“>”之间要有空格,vector不用单...
  • baidu_35643793
  • baidu_35643793
  • 2017-04-14 16:43
  • 602

C++ priority_queue 与 lambda的结合使用

1.priority_queue定义template <class T, class Container = vector<T>, class Compare = less<typename Container::value_type> > class pri...
  • liu2012huan
  • liu2012huan
  • 2016-10-26 11:27
  • 512

C++ 类的重载运算符和priority_queue综合使用

今天在写poj上的一道题时,提交之后显示代码运行超时,查了一下网上都说因为测试数据量大,普通循环查找很容易超时,用优先队列能解决问题,有时题目里设计到的状态信息比较复杂,要用一个类来维护,类的重载运算符自从上学期学过之后我就忘光了,于是现在写一篇博客好好记录一下:C++中类的重载运算符我们知道int...
  • Bingtang_blog
  • Bingtang_blog
  • 2016-10-06 16:42
  • 815
    个人资料
    • 访问:355184次
    • 积分:9146
    • 等级:
    • 排名:第2429名
    • 原创:578篇
    • 转载:13篇
    • 译文:0篇
    • 评论:36条
    我的链接
    最新评论