c++++的sort函数需配合自定义比较函数实现灵活排序。默认情况下,sort按升序排列元素,如std::sort(nums.begin(), nums.end())可对vector进行升序排序;要降序排序,可用std::greater()或自定义比较函数;对于结构体或类对象排序,需编写符合要求的比较函数,例如按学生分数从高到低排序可定义bool comparebyscore(const student& a, const student& b) { return a.score > b.score; };若需多条件排序,可在比较函数中添加判断逻辑;c++11后可用lambda表达式简化代码,如std::sort(students.begin(), students.end(), [](const student& a, const student& b) { return a.score > b.score;});此外,要注意比较函数必须满足“严格弱序”,避免未定义行为,并尽量使用引用传递参数以减少拷贝开销,而需要稳定排序时应使用stable_sort。

C++的
sort
函数是
库中最常用、最高效的排序工具之一,尤其在处理数组或容器(如
vector
)时非常方便。但如果你需要按照特定规则排序,比如降序、结构体字段比较等,就需要配合自定义比较函数一起使用。

下面我们就来看看怎么用
sort
和自定义比较函数完成各种排序任务。

一、基本用法:默认升序排序
sort
的基本调用方式是传入两个迭代器(起始和结束位置),它默认按升序排列元素:
立即学习“C++免费学习笔记(深入)”;
#include #include std::vector nums = {5, 2, 9, 1, 3};std::sort(nums.begin(), nums.end());
执行后,
nums
会变成
{1, 2, 3, 5, 9}
。

这适用于内置类型(如
int
、
double
)以及重载了
<
运算符的类对象。如果你只是排个整数数组,这样就足够用了。
二、如何实现降序排序?
想排成从大到小?可以使用标准库提供的
greater
函数对象:
std::sort(nums.begin(), nums.end(), std::greater());
或者你也可以自己写一个比较函数,效果是一样的。
三、自定义比较函数:灵活应对复杂排序逻辑
当你要排序的对象不是简单数字,而是结构体、类对象,或者有多个字段要综合判断时,就需要自己写比较函数。
比较函数格式要求:
比较函数应该接受两个参数,并返回一个布尔值。如果第一个参数应该排在前面,就返回
true
。
例如,我们有一个表示学生的结构体:
struct Student { std::string name; int score;};
我们希望按分数从高到低排序:
bool compareByScore(const Student& a, const Student& b) { return a.score > b.score; // 分高的排前面}
然后调用:
std::vector students = {{"Alice", 80}, {"Bob", 95}, {"Charlie", 70}};std::sort(students.begin(), students.end(), compareByScore);
这样就能得到按成绩降序排列的学生列表。
注意:如果你想先按成绩排,成绩一样再按名字字母顺序排,可以在比较函数里加条件判断:if (a.score != b.score) return a.score > b.score;return a.name
四、使用lambda表达式简化代码
C++11以后支持用lambda来写比较函数,不需要单独声明函数,代码更简洁:
std::sort(students.begin(), students.end(), [](const Student& a, const Student& b) { return a.score > b.score;});这对临时排序很有帮助,尤其是逻辑不复杂的时候。
五、注意事项与常见问题
- 必须保证比较函数满足“严格弱序”,否则可能引起未定义行为。简单来说就是不能出现循环关系,比如A比B小、B比C小、C又比A小。
- 如果排序的是结构体或类,记得传引用,避免拷贝开销。
sort不保证稳定排序,如果需要保持相同元素的原始顺序,要用
stable_sort。
基本上就这些内容了。掌握好
sort加上合适的比较函数,不管是排序数字还是结构体,都能轻松应对。关键是理解比较函数的作用机制,以及如何根据需求写出正确的判断逻辑。
以上就是怎样使用C++的algorithm排序函数 sort与自定义比较函数实践的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1471290.html
微信扫一扫
支付宝扫一扫