重载比较函数 的用法

以下内容都是个人见解,若有错误,还望指正!!

最近刚学习了C++中有关重载运算负中的知识,总算明白了如何通过重载一些运算符来改变一些容器的排序顺序 如 priority_queue优先队列的优先顺序和 sort 函数的二级排序,在不写比较函数的情况下如何通过重载运算负实现(如果对一个类有多个操作,sort建议还是用比较函数比较好)

//一般比较函数的写法   
struct Node{  
    int a;  
    int b;  
};  
bool compare(const Node x,const Node y){//按 a 的升序排列,如果a相等按 b 的升序;    
    if(x.a == b.a)  
         return x.b < y.b;  
    return x.a < y.a;   
}  
sort(arr,arr+n,compare);  



这里我们对 < 符合做了重载,因为在一般的排序比较函数中默认的都是使用 < 符合来排序和比较的

//重载的两种写法   
struct Node{  
    int a;  
    int b;  
    friend bool operator< (const Node& x,const Node& y)//友元函数的写法,这里的变量有2个,和比较函数比较相似好理解   
    {  
        if(y.a == x.a)  
            return x.b < y.b; 
        return x.a > y.a;  
    }  
};  
struct Node{  
    int a;  
    int b;  
    bool operator< (const Node& y)const//这里就应用到一些运算符重载的知识,不是一两句话能说清楚的,不懂的自行学习  
    // 这里说说两个const,第一个是为了保护我们传的引用不被非法修改(传引用为了节约开销,一般的类可能比较复杂)  
    //第二个const 是为了修饰 this 指针(C++中一个很有特点的指针,不懂的需要先学习一下),作用与前面的基本一样   
    {  
        if(a == y.a)  
            return b < y.b;  ///小值优先
        return a > y.a;  
    }  
};  
struct Node{  
    int a;  
    int b;  
    bool operator< (const Node& y)const  
    //如果不明白上面说的第二个const,那么这是一种this指针的写法,道理和上面的一样   
    {  
        if(this->a == y.a)  
            return this->b < y.b;  
        return this->a > y.a;  
    }  
};  



下面来说一下priority_queue的重载吧,其实在我转载的一篇关于优先队列的使用一文中写的很详细

但是当时并不了解,只是比划着用的,现在终于领悟了

值得注意的就是priority_queue默认的是大根堆,对 < 的重载是与我们所期盼的效果相反的(表达能力有限,懂得人应该理解)

[cpp]  view plain  copy
  1. struct node      
  2. {      
  3.     int priority;      
  4.     int value;    
  5.     friend bool operator< (node n1, node n2)      
  6.     {      
  7.         return n1.priority < n2.priority;  //"<"为从大到小排列,">"为从小到大排列      
  8.     }        
  9. };   
  10. //或者用 this 方式的重载,(这里传参和传引用道理同上,const什么的也是根据C++标准来做的)   
  11. struct node      
  12. {      
  13.     int priority;      
  14.     int value;    
  15.     bool operator< (node n2)      
  16.     {      
  17.         return this->priority < n2.priority;  //"<"为从大到小排列,">"为从小到大排列      
  18.     }        
  19. };     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值