std::sort 传 std::greater() 实现降序,需包含 头文件;自定义类型需重载 operator> 或用 lambda;反向迭代器配 std::less() 是常见错误。
std::sort 传 std::greater() 实现降序
默认 std::sort 是升序,要降序,最直接的方式就是显式传入比较器。对内置类型(如 int、double),用 std::greater() 最简洁:
std::vector v = {3, 1, 4, 1, 5};
std::sort(v.begin(), v.end(), std::greater());
执行后 v 变为 {5, 4, 3, 1, 1}。注意:必须带模板参数(如 ),不能只写 std::greater()(C++17 起虽支持类模板参数推导,但很多旧编译器或 STL 实现仍要求显式指定)。
自定义类型降序需重载 operator> 或传 lambda
如果排序的是自定义结构体或类,std::greater() 要求 T 支持 operator>。否则编译失败,错误信息类似:invalid operands to binary expression ('MyStruct' and 'MyStruct')。
两种稳妥做法:
立即学习“C++免费学习笔记(深入)”;
- 在类内定义
bool operator>(const MyStruct& rhs) const - 不改类型定义,直接用 lambda:
std::sort(v.begin(), v.end(), [](const auto& a, const auto& b) { return a.value > b.value; });
lambda 更灵活,尤其当需要按多个字段、或临时改变排序逻辑时;而 operator> 更适合该类型“天然”有明确大于语义的场景。
为什么不用 std::less() 配合反向迭代器?
有人尝试写 std::sort(v.rbegin(), v.rend(), std::less()),以为能降序——这其实仍是升序,只是把容器“倒着看”了。结果是原数组被按升序填进逆序位置,最终效果混乱,不是真正降序。