📅  最后修改于: 2023-12-03 15:39:49.745000             🧑  作者: Mango
在 C++ 中,我们经常使用排序算法来对数组或 vector 等容器进行排序。这些排序算法都基于一个前提,就是能够比较容器中的元素大小,并以此进行排序。为此,我们需要实现一个比较器。
比较器是一个函数或重载了运算符的对象,它能够比较容器中的两个元素的大小。比较器需要返回一个 bool 值,表示第一个元素是否小于(或大于)第二个元素。
以下是两个实现比较器的示例:
bool compare(int a, int b) {
return a < b;
}
struct Person {
string name;
int age;
};
bool cmp(const Person &a, const Person &b) {
return a.age < b.age;
}
在使用排序函数时,需要将比较器作为第二个参数传递给排序函数。以下是标准库中的两个排序函数的使用方法:
int arr[] = {5, 2, 1, 4, 3};
int n = sizeof(arr) / sizeof(arr[0]);
sort(arr, arr + n, compare); // 数组元素从 arr 到 arr+n-1
vector<Person> vec;
vec.push_back({"Alice", 25});
vec.push_back({"Bob", 20});
sort(vec.begin(), vec.end(), cmp);
在使用比较器时,有时我们只会在一处使用,因此不需要为它单独写一个函数或结构体。此时,我们可以使用 lambda 表达式来定义比较器。
以下是 lambda 表达式实现比较器的示例:
sort(v.begin(), v.end(), [](int a, int b) {
return a < b;
});
以上 lambda 表达式等价于以下比较器函数:
bool compare(int a, int b) {
return a < b;
}
比较器是排序算法必备的,掌握比较器的使用可以让我们更加方便地进行排序操作。同时,lambda 表达式也提供了一种更加简单的比较器实现方式,可以大幅减少代码量。