自定义优先队列和操作符重载问题

本文介绍如何在C++中自定义优先队列的比较器,包括值类型和指针类型的对象。对于值类型,可以通过在类内定义友元函数实现;对于指针类型,需要自定义比较函数,并作为第三个模板参数传入priority_queue。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间做项目时,遇到自定义优先级的优先队列问题,偶偶发现点问题,通过网友的解答和自己的理解明白了一些路路,小结一下:

 

1、若是定义值类型对象,如:

  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 的操作符重载函数即可:

     

    1. class node
    2. {
    3. public:
    4.     int a;
    5.     node(){}
    6.     node(int x):a(x){}
    7. friend bool operator<(const node ne1,const node ne2)//参数也可以为引用,值传递
    8.     {
    9.         if(ne1.a > ne2.a)
    10.         {
    11.             return true;
    12.         }
    13.         else
    14.         {
    15.             return false;
    16.         }
    17.     }
    18. };

    其中在c++primer第三版 中文版中关于操作符重载有如下描述:

    "程序员只能为类类型或枚举类型的操作数定义重载操作符我们可以这样来实现把重
    载操作符声明为类的成员或者声明为名字空间成员同时至少有一个类或枚举类型的参数
    按值传递或按引用传递"


    因此不可用指针类型的参数;

     

    2、如果想定义一个指针类型的优先队列,那就不可这么简单的定义了,你需要自定义一个自己的比较函数,在priority_queue的模板函数中,我们可以利用这样一个template<class _Ty, class _Container = vector<_Ty>, class _Pr = less<typename _Container::value_type> >模板,在我们的程序代码中,则需要自己定义一个类来定义第三个模板参数,如:

    1. class nodePointerComparer 
    2. public
    3.     nodePointerComparer(){} 
    4.     bool operator ()(const node* ne1, const node* ne2) const 
    5.     { 
    6.         return ne1->lessthan(ne2); 
    7.     } 
    8. }; 

     

    当然在这之前我们的类Node要重新书写:

    1. class node 
    2. public
    3.     int a; 
    4.     node(){} 
    5.     node(int x):a(x){} 
    6.     bool lessthan(const node* pnode) const 
    7.     { 
    8.         return a < pnode->a; 
    9.     } 
    10. }; 

    这样在main函数中就可以定义指针类型的优先队列了:

    1. int main() 
    2.     priority_queue <node*, vector <node*>, nodePointerComparer> qn; 
    3.     node *n1 = new node(90); 
    4.     node *n2 = new node(2); 
    5.     node *n3 = new node(50); 
    6.     qn.push(n1); 
    7.     qn.push(n2); 
    8.     qn.push(n3); 
    9.     int size = qn.size(); 
    10.     for(int i = 0; i < size; i++) 
    11.     { 
    12.         cout << qn.top()->a << endl; 
    13.         qn.pop(); 
    14.     } 
    15.     return 0; 

    疑问之处:如果你使用第一种值传递的操作符重载,来实现第二种的指针类型优先队列,是不会达到想要的结果的,个人理解是因为在指针类型的优先队列中找“<”运算符的时候,重载的不是我们写的值传递friend bool operator<(const node ne1,const node ne2)//

    也就是没有找到指针类型的"<"重载,所有不会达到优先队列的效果。

    最后的一段为个人理解,有错误之处,还请路过的同仁指教。

     
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值