📅  最后修改于: 2023-12-03 14:59:50.156000             🧑  作者: Mango
在 C++ 中,Comparator 是一个通用的抽象类,用于比较两个对象。它提供了一种通用的方法,可以将两个对象进行比较,并返回一个可比较的结果。Comparator 常用于排序和搜索算法中,以确定对象之间的顺序。
std::Comparator
类在 C++ 中,std::Comparator
类是一个泛型类(generic class),用于比较两个对象。它的声明如下所示:
template <typename T>
class Comparator {
public:
virtual bool operator() (const T& a, const T& b) const = 0;
};
在该声明中,T
是要比较的对象类型,operator()
是比较函数(comparison function),它接受两个对象引用,并返回一个布尔值。如果 a
按照某种顺序小于 b
,则返回 true
,否则返回 false
。
std::less
和 std::greater
类模板C++ 标准库提供了两个常见的比较函数模板 std::less
和 std::greater
,它们实现了 std::Comparator
接口。std::less
模板用于比较对象的默认排序顺序(通常是 <
运算符),std::greater
则用于比较反向排序(通常是 >
运算符)。
下面是 std::less
和 std::greater
的具体实现:
template <typename T>
struct less {
bool operator() (const T& a, const T& b) const {
return a < b;
}
};
template <typename T>
struct greater {
bool operator() (const T& a, const T& b) const {
return a > b;
}
};
在 C++ 中,我们可以使用 std::sort
算法对容器进行排序。std::sort
接受三个参数:第一个参数是需要排序的容器,第二个参数是排序的起始位置,第三个参数是排序的结束位置。此外,我们还可以提供一个可选的第四个参数,它是一个比较函数,用于指定排序的顺序。
下面是使用 std::sort
进行排序的例子,其中使用了 std::less
进行默认排序:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> v {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
std::sort(v.begin(), v.end(), std::less<int>());
for (int i : v) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
输出结果:
1 1 2 3 3 4 5 5 5 6 9
如果我们要使用自定义的比较函数,可以继承 std::Comparator
,并重新定义 operator()
函数。下面是一个例子,其中我们自定义了一个 Person
类型,以及一个比较函数 compareByAge
,用于按照年龄从小到大排序:
#include <iostream>
#include <vector>
#include <algorithm>
struct Person {
std::string name;
int age;
};
struct compareByAge : std::Comparator<Person> {
bool operator() (const Person& a, const Person& b) const {
return a.age < b.age;
}
};
int main() {
std::vector<Person> v {
{"Alice", 20},
{"Bob", 24},
{"Charlie", 18},
{"Dave", 32},
{"Eve", 28}
};
std::sort(v.begin(), v.end(), compareByAge());
for (const Person& p : v) {
std::cout << p.name << " (" << p.age << ")" << std::endl;
}
return 0;
}
输出结果:
Charlie (18)
Alice (20)
Bob (24)
Eve (28)
Dave (32)