使用sort对元素进行排序时,如果元素是自己设计的类或者结构体,需要编写比较函数,作为参数传给sort,此时有两种方法可以进行处理
方法一
重载自己设计的类或结构体的比较运算符,则默认情况下将从小到大排序(此时仅需重载<运算符),如果要从大到小排序,第三个参数应设置为greater()并重载>大于号运算符,T为元素的类型(默认情况下是less())
bool operator>(Student a, Student b) { return a > b; }
sort(begin, end, greater<Student>())
方法二
有时候使用的类是别人设计的,比较运算符已经被重载,但不是我们想要的方式。这个时候自己编写比较运算符的重载函数是行不通的。应该使用传递函数指针或者结构体的方法来处理。
传函数指针
bool cmp(Student a, Student b) { return a > b; }
sort(begin, end, cmp);
传结构体
struct Mycmp{
bool operator()(Student a, Student b) { return a > b; }
}st_cmp;
sort(begin, end, st_cmp);
因为结构体重载了()括号运算符,所以st_cmp(a, b)调用结构体中的声明的方法,与直接编写函数cmp等效。
sort第三个参数为模板,所以函数指针和结构体都可接收,两者调用的格式又一样,因此都能用。
不仅仅是sort函数,STL中很多算法为了满足多样的需求,都提供了这样的接口,在实际使用的时候,我们可以自己设计函数来改变算法的功能,应该灵活运用。