C++如何自定义std::sort的比较函数?(Lambda示例)

可以将Lambda表达式直接传给std::sort作为比较函数,无需额外定义函数或仿函数;支持升序、降序及按自定义类型字段排序,但必须满足严格弱序要求。

可以用Lambda表达式直接传给 std::sort 作为比较函数,无需额外定义函数或仿函数,简洁又灵活。

基本用法:升序与降序

默认 std::sort 是升序(a ),用 Lambda 可轻松反转:

  • 升序:std::sort(v.begin(), v.end(), [](int a, int b) { return a
  • 降序:std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; });

按自定义类型字段排序

比如对结构体按某个成员排序,Lambda 捕获简洁明了:

struct Person {
    std::string name;
    int age;
};
std::vector people = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 35}};
std::sort(people.begin(), people.end(), [](const Person& a, const Person& b) {
    return a.age < b.age; // 按年龄升序
});

捕获外部变量(如排序依据动态变化)

[&][=] 捕获局部变量,实现运行时决定的排序逻辑:

  • int threshold = 30;
  • std::sort(v.begin(), v.end(), [threshold](int a, int b) {
  •   return (a >= threshold) = threshold); // 先放 ≥threshold 的数
  • });

注意事项

Lambda 必须满足严格弱序(strict weak ordering):返回 true 表示 a 应排在 b 前面;不能对相同元素返回 true;且逻辑需自洽(如 ab 要能推出 a)。

另外,参数建议用 const T& 避免拷贝,尤其对大对象或自定义类型。

基本上就这些。写得自然、不绕弯,Lambda 就是 std::sort 最常用的自定义方式。