关于重载和比较函数

来源:互联网 发布:淘宝坑产是什么意思 编辑:程序博客网 时间:2024/06/06 04:48

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

最近刚学习了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默认的是大根堆,对 < 的重载是与我们所期盼的效果相反的(表达能力有限,懂得人应该理解)

struct node    {        int priority;        int value;  friend bool operator< (node n1, node n2)        {            return n1.priority < n2.priority;  //"<"为从大到小排列,">"为从小到大排列        }      }; //或者用 this 方式的重载,(这里传参和传引用道理同上,const什么的也是根据C++标准来做的) struct node    {        int priority;        int value;  bool operator< (node n2)        {            return this->priority < n2.priority;  //"<"为从大到小排列,">"为从小到大排列        }      };   


0 0
原创粉丝点击