以下内容都是个人见解,若有错误,还望指正!!
最近刚学习了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默认的是大根堆,对 < 的重载是与我们所期盼的效果相反的(表达能力有限,懂得人应该理解)