总结一些比较函数(含有优先队列里结构体里的重载)

 

最近见的比较函数挺多的,然后就想汇总一下,记录下来,But,忘了好几个,先写一点,剩下的有机会见了补上

//适用于qsort
int cmp(const void *a ,const void *b)
{
	return *(int *)a - *(int *)b ;			//从小到大排序 
}

//sort

int cmp(const int a ,const int b)
{
    return  (b) <= (a); //从大到小排序
}

//优先队列里的结构体,   如果不是, 仅用于sort,则分别为从小到大, 从大到小 


struct _node {
    int p;      
    int no;    
    friend bool operator <(const _node &a,const _node &b) {
//从大到小
        if(a.p != b.p)
            return a.p < b.p;
//从小到大
        else
            return a.no > b.no;
    }
};

也可以将以上的改成如下所示: (将friend去掉后必须在后面加const,有friend则不需要,具体的。。。 也不太明白,等有时间了再弄

一、概念

  当const在函数名前面的时候修饰的是函数返回值,在函数名后面表示是常成员函数,该函数不能修改对象内的任何成员,只能发生读操作,不能发生写操作。

 

二、原理:

  我们都知道在调用成员函数的时候编译器会将对象自身的地址作为隐藏参数传递给函数,在const成员函数中,既不能改变this所指向的对象,也不能改变this所保存的地址,this的类型是一个指向const类型对象的const指针。

struct _node {
    int p;   
    int no;    
    bool operator <(const _node &b)const {//第一个是为了保护我们传的引用不被非法修改(传引用为了节约开销,一般的类可能比较复杂)
 //第二个const 是为了修饰 this 指针

    //从大到小
            if(p != b.p)
                return p < b.p;
    //从小到大
            else
                return no > b.no;
        }
};

 

//sort(a, a+n, cmp)   或者 vector 里的 sort(a.begin(), a.end(), cmp)

struct student {
    string number;
    string sex;
    int age;
    int score;
};
bool cmp(student a, student b) {
    if (a.score != b.score)//成绩从小大大排序
        return a.score < b.score;
    else if (a.sex != b.sex)
        return a.sex > b.sex;//男性优先
    else
        return a.number < b.number; //学号由小到大排序
}

 

 

 

你可能感兴趣的:(基础知识,排序)