C++比较器(Comparator)总结
在C++中,比较器(Comparator)是一种用于定义对象之间比较规则的工具。它通常用于容器(如std::sort、std::priority_queue、std::set等)中,以确定元素的顺序。比较器可以通过多种方式实现,包括函数指针、函数对象(通过重载operator())、Lambda表达式等。
比较器的定义和作用
比较器的核心作用是定义两个对象之间的大小关系。它通常需要满足以下条件:
- 自反性:对于任何对象
x,cmp(x, x)应返回false。 - 反对称性:如果
cmp(x, y)为true,则cmp(y, x)应为false。 - 传递性:如果
cmp(x, y)为true且cmp(y, z)为true,则cmp(x, z)也应为true。
比较器的实现方式
1. 函数指针
函数指针是最简单的比较器实现方式,但它不能存储状态。例如:
bool cmp(int a, int b) {
return a < b;
}
2. 函数对象
函数对象通过重载operator()实现,可以存储状态。例如:
struct cmp {
bool operator()(int a, int b) {
return a > b; // 用于降序排列
}
};
3. Lambda表达式
Lambda表达式是C++11引入的一种简洁的匿名函数,也可以作为比较器。例如:
auto cmp = [](int a, int b) {
return a > b; // 用于降序排列
};
比较器的应用
1. std::sort
std::sort可以使用比较器来定义排序规则。默认情况下,std::sort使用std::less,即升序排序。
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> v = {5, 1, 3};
std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; }); // 降序排序
for (int x : v) {
std::cout << x << " ";
}
return 0;
}
2. std::priority_queue
std::priority_queue默认是一个最大堆,但可以通过比较器实现最小堆。
#include <queue>
#include <iostream>
struct cmp {
bool operator()(int a, int b) {
return a > b; // 最小堆
}
};
int main() {
std::priority_queue<int, std::vector<int>, cmp> pq;
pq.push(5);
pq.push(1);
pq.push(3);
while (!pq.empty()) {
std::cout << pq.top() << " ";
pq.pop();
}
return 0;
}
3. std::set
std::set是一个有序集合,默认使用std::less进行排序。可以通过自定义比较器来改变排序规则。
#include <set>
#include <iostream>
struct cmp {
bool operator()(int a, int b) {
return a > b; // 降序排序
}
};
int main() {
std::set<int, cmp> s;
s.insert(5);
s.insert(1);
s.insert(3);
for (int x : s) {
std::cout << x << " ";
}
return 0;
}
总结
比较器是C++中用于定义对象之间大小关系的重要工具。它可以通过函数指针、函数对象或Lambda表达式实现。在实际应用中,比较器广泛用于排序、优先队列和有序集合等场景,帮助我们灵活地定义元素的顺序。

浙公网安备 33010602011771号