目录
1--比较器的优点
比较器的实质是重载比较运算符;
比较器可以很好地应用在特殊标准的排序中;
比较器可以很好地应用在根据特殊标准排序的结构上;
2--比较器的规则
一开始参数的前后顺序与函数传入参数的前后顺序一致,即对于 function(T v1, T v2) 的初始顺序是 v1 在前面,v2 在后面,根据排序规则确定是否交换顺序;
返回正数(true)的时候,不交换顺序(第一个参数在前面);
返回负数(false)的时候,交换顺序(第一个参数在后面);
3--代码实例
cpp
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
class Person{
public:
Person(std::string n, int a, int s) : age(a), name(n), score(s) {};
std::string name;
int age;
int score;
};
class Compare1{
public:
bool operator()(Person v1, Person v2){
// 按照年龄降序排列
return v1.age > v2.age; // 返回 true 时, v1 在前面
}
};
class Compare2{
public:
bool operator()(Person v1, Person v2){
// 按照成绩升序排列
return v1.score < v2.score; // 返回 true 时, v1 在前面
}
};
int main(int argc, char *argv[]){
Person p1("zhangsan", 23, 95);
Person p2("lisi", 22, 99);
Person p3("wangwu", 21, 97);
std::vector<Person> P = {p1, p2, p3};
// 按照年龄降序排列
std::sort(P.begin(), P.end(), Compare1());
for(Person p : P) std::cout << p.name << " " << p.age << " " << p.score << std::endl;
std::cout << "-----------" << std::endl;
// 按照成绩升序排列
std::sort(P.begin(), P.end(), Compare2());
for(Person p : P) std::cout << p.name << " " << p.age << " " << p.score << std::endl;
return 0;
}
cpp
// 运行结果
zhangsan 23 95
lisi 22 99
wangwu 21 97
-----------
zhangsan 23 95
wangwu 21 97
lisi 22 99