priority_queue<int,vector<int>,greater<int>>优先队列 按照由小到大顺序

C++优先队列的基本使用方法
 

 #include<iostream>
 #include<functional>
 #include<queue>
 using namespace std;
 
struct node
 {
     friend bool operator< (node n1, node n2)
     {
         return n1.priority < n2.priority;//"<"为从大到小排列,">"为从小打到排列
     }
     int priority;
     int value;
 };
 
int main()
 {
     const int len = 5;
     int i;
     int a[len] = {3,5,9,6,2};
     //示例1
     priority_queue<int> qi;//普通的优先级队列,按从大到小排序
     for(i = 0; i < len; i++)
         qi.push(a[i]);
     for(i = 0; i < len; i++)
     {
         cout<<qi.top()<<" ";
         qi.pop();
     }
     cout<<endl;
 
    //示例2
     priority_queue<int, vector<int>, greater<int> > qi2;//从小到大的优先级队列,可将greater改为less,即为从大到小
     for(i = 0; i < len; i++)
         qi2.push(a[i]);
     for(i = 0; i < len; i++)
     {
         cout<<qi2.top()<<" ";
         qi2.pop();
     }
     cout<<endl;
 
    //示例3
     priority_queue<node> qn;//必须要重载运算符
     node b[len];
     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(i = 0; i < len; i++)
         qn.push(b[i]);
     cout<<"优先级"<<'\t'<<"值"<<endl;
     for(i = 0; i < len; i++)
     {
         cout<<qn.top().priority<<'\t'<<qn.top().value<<endl;
         qn.pop();
     }
     return 0;
 }
 
对于队列里元素为一个结构体类型,按照某一个属性排序,就需要对比较函数进行重载
 
小结一下:
 
1、若是定义值类型对象,如: 
 
int 
  main() 
 {      
     priority_queue<node> qn;
 
    node n1; 
     n1.a = 9; 
     node n2; 
     n2.a = 2; 
     node n3; 
     n3.a = 50;  
 
    qn.push(n1);
 
    qn.push(n2);
 
    qn.push(n3);
 
     int  size = qn.size();
 
     for ( int  i = 0; i < size; i++) 
     { 
         cout << qn.top().a << endl;
 
        qn.pop(); 
     } 
          return  0;
 
} 
 则定义优先级的时候,直接在类中写个friend 的操作符重载函数即可: 
 
class  node 
 { 
 public : 
      int  a;
 
    node(){} 
     node( int  x):a(x){} 
 friend   bool  operator<( const  node ne1, const  node ne2)//参数也可以为引用,值传递 
     { 
          if (ne1.a > ne2.a) 
         { 
              return   true ; 
         } 
          else 
         { 
              return   false ; 
         } 
     } 
 }; 
 其中在c++primer第三版 中文版中关于操作符重载有如下描述:
 
"程序员只能为类类型或枚举类型的操作数定义重载操作符我们可以这样来实现把重 
 载操作符声明为类的成员或者声明为名字空间成员同时至少有一个类或枚举类型的参数 
 按值传递或按引用传递"
 
因此不可用指针类型的参数;
 
2、如果想定义一个指针类型的优先队列,那就不可这么简单的定义了,你需要自定义一个自己的比较函数,在priority_queue的模板函数中,我们可以利用这样一个template<class _Ty, class _Container = vector<_Ty>, class _Pr = less<typename _Container::value_type> >模板,在我们的程序代码中,则需要自己定义一个类来定义第三个模板参数,如:
 
class  nodePointerComparer  
 {  
 public :  
     nodePointerComparer(){}  
      bool  operator ()( const  node* ne1,  const  node* ne2)  const   
     {  
          return  ne1->lessthan(ne2);  
     }  
 };  
 
当然在这之前我们的类Node要重新书写 
 
class  node  
 {  
 public :  
      int  a;  
     node(){}  
     node( int  x):a(x){} 
 
     bool  lessthan( const  node* pnode)  const   
     {  
          return  a < pnode->a;  
     }  
 };  
 这样在main函数中就可以定义指针类型的优先队列了:
 
int  main()  
 {  
     priority_queue <node*, vector <node*>, nodePointerComparer> qn;  
     node *n1 =  new  node(90);  
     node *n2 =  new  node(2);  
     node *n3 =  new  node(50); 
 
    qn.push(n1);  
     qn.push(n2); /span>
 
> 
     qn.push(n3); 
 
     int  size = qn.size();  
      for ( int  i = 0; i < size; i++)  
     {  
         cout << qn.top()->a << endl;  
         qn.pop();  
     }  
      return  0; 
 
}  
 疑问之处:如果你使用第一种值传递的操作符重载,来实现第二种的指针类型优先队列,是不会达到想要的结果的,个人理解是因为在指针类型的优先队列中找“<”运算符的时候,重载的不是我们写的值传递friend bool operator<(const node ne1,const node ne2)//
 
也就是没有找到指针类型的"<"重载,所有不会达到优先队列的效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值