跳转到主内容
极星编程网:以代码为星,赴技术山海!

C++ STL算法sort如何自定义排序 讲解比较函数与lambda表达式用法

在 c++ stl中使用sort函数对自定义类型或特定规则排序时,需通过比较函数或lambda表达式指定排序逻辑。1. 比较函数应返回bool值,并接受两个const引用参数,如按成绩降序 排列 结构体student的示例;2. lambda表达式可替代函数实现内联逻辑,支持捕获外部变量以动态调整排序方式;3. 注意事项包括:sort为不稳定排序,需用stable_sort保持相等元素顺序;比较逻辑必须满足严格弱序且不可含等于号;参数类型须与容器元素一致。掌握这些要点后即可灵活应对各种排序需求。 在使用C++ STL中的
sort
函数时,如果你希望对自定义类型或特定规则进行排序,就需要用到比较函数或者lambda表达式。
sort
默认是按升序排列基本类型(比如int、float),但面对复杂需求时,自定义比较逻辑就成了关键。 比较函数的基本写法 当你想用一个单独的函数来控制排序规则时,可以写一个 比较函数 。这个函数需要返回一个
bool
值,告诉
sort
两个元素谁应该排在前面。 比如你有一个结构体
Student
,里面有名字和成绩,你想按照成绩从高到低排序: 立即学习 “ C++免费学习笔记(深入) ”;
struct Student { string name; int score; }; bool compareByScore(const Student& a, const Student& b) { return a.score > b.score; // 降序排列 }
然后调用
sort
的时候把函数名传进去:
vector students = ...; sort(students.begin(), students.end(), compareByScore);
注意:比较函数的参数必须是
const &
,否则可能编译不过或效率不高。 使用lambda表达式更灵活 如果你不想专门写一个函数,或者逻辑比较简单,可以用 lambda表达式 直接在
sort
里写比较逻辑。 比如还是上面的例子,改用lambda的话可以这样写:
sort(students.begin(), students.end(), [](const Student& a, const Student& b) { return a.score > b.score; });
这样写的好处是代码集中,逻辑清晰,特别是在排序逻辑只用一次的情况下非常方便。 而且lambda还能捕获外部变量,比如你可以根据某个变量决定排序方式:
bool ascending = false; sort(students.begin(), students.end(), [ascending](const Student& a, const Student& b) { if (ascending) return a.score < b.score; else return a.score > b.score; });
注意事项与常见问题 稳定性 :
sort
不是稳定排序,如果需要保持相等元素的原始顺序,要用
stable_sort
。 比较函数必须严格弱序 :也就是说不能出现A < B 和 B < A 同时为真,也不能自己比自己小。 避免使用等于号 :比较函数中不要写
a <= b
这样的条件,因为这会导致不满足排序要求的严格性。 参数类型要一致 :确保你传入的比较函数或lambda接受的参数类型和容器里的元素类型匹配。 基本上就这些。掌握比较函数和lambda表达式的写法后,
sort
就能应对各种排序场景了。不复杂但容易忽略的是比较逻辑的正确性和参数类型的匹配问题,多写几次就熟悉了。

相关文章