答案:C++中sort默认升序,可通过函数指针、仿函数或lambda实现自定义排序。①函数指针需全局或静态函数,如降序比较;②仿函数重载operator(),可保存状态且支持内联优化,适用于复杂逻辑;③lambda表达式(C++11起)更简洁,适合简单排序规则,如按姓名升序或成绩降序。三种方式均作为第三个参数传入sort。

在C++中,sort 算法默认对元素进行升序排列,但很多时候我们需要按照特定规则排序,比如降序、按绝对值排序、自定义对象比较等。这时就需要使用自定义比较函数或仿函数(functor)。下面详细介绍这两种方法的用法。
使用函数指针作为比较函数
你可以定义一个普通函数,接收两个参数,返回是否第一个应排在第二个之前(即“小于”关系)。
bool compare(int a, int b) { return a > b; // 降序排列 } int main() { std::vectorint> vec = {5, 2, 8, 1}; std::sort(vec.begin(), vec.end(), compare); // 结果:8 5 2 1 return 0; }注意:这个函数必须是全局函数或静态函数,不能是普通成员函数(除非配合绑定)。
使用仿函数 struct 实现比较逻辑
仿函数是重载了 operator() 的类或结构体。它比函数指针更灵活,支持状态保存和内联优化。
立即学习“C++免费学习笔记(深入)”;
struct CompareByAbs { bool operator()(int a, int b) const { return abs(a) // 按绝对值升序 } }; int main() { std::vectorint> vec = {-3, 1, -2, 4}; std::sort(vec.begin(), vec.end(), CompareByAbs()); // 结果:1, -2, -3, 4(绝对值从小到大) return 0; }这里 CompareByAbs() 是构造一个临时对象传给 sort,sort 内部会调用它的 operator() 进行比较。
对自定义类型使用仿函数排序
假设你有一个表示学生的结构体,想按成绩排序:
struct Student { std::string name; int score; }; struct SortByScore { bool operator()(Student a, Student b) const { return a.score > b.score; // 成绩从高到低 } }; int main() { std::vector仿函数可以访问结构体的 public 成员,实现灵活的排序逻辑。
Lambda 表达式:更简洁的替代方式(C++11起)
对于简单逻辑,lambda 更直观:
std::sort(vec.begin(), vec.end(), [](Student a, Student b) { return a.name // 按姓名字典序 });lambda 本质上是编译器生成的仿函数,写起来更紧凑。
基本上就这些。掌握函数指针、仿函数 struct 和 lambda,就能灵活控制 sort 的行为。仿函数适合复杂或复用场景,lambda 适合简单匿名逻辑。







