首页 > 后端开发 > C++ > 正文

怎样使用C++的algorithm排序函数 sort与自定义比较函数实践

P粉602998670
发布: 2025-08-15 17:50:01
原创
426人浏览过

c++++的sort函数需配合自定义比较函数实现灵活排序。默认情况下,sort按升序排列元素,如std::sort(nums.begin(), nums.end())可对vector<int>进行升序排序;要降序排序,可用std::greater<int>()或自定义比较函数;对于结构体或类对象排序,需编写符合要求的比较函数,例如按学生分数从高到低排序可定义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++的algorithm排序函数 sort与自定义比较函数实践

C++的

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

怎样使用C++的algorithm排序函数 sort与自定义比较函数实践

下面我们就来看看怎么用

sort
登录后复制
和自定义比较函数完成各种排序任务。

怎样使用C++的algorithm排序函数 sort与自定义比较函数实践

一、基本用法:默认升序排序

sort
登录后复制
的基本调用方式是传入两个迭代器(起始和结束位置),它默认按升序排列元素:

立即学习C++免费学习笔记(深入)”;

#include <algorithm>
#include <vector>

std::vector<int> nums = {5, 2, 9, 1, 3};
std::sort(nums.begin(), nums.end());
登录后复制

执行后,

nums
登录后复制
会变成
{1, 2, 3, 5, 9}
登录后复制

怎样使用C++的algorithm排序函数 sort与自定义比较函数实践

这适用于内置类型(如

int
登录后复制
double
登录后复制
)以及重载了
<
登录后复制
运算符的类对象。如果你只是排个整数数组,这样就足够用了。


二、如何实现降序排序?

想排成从大到小?可以使用标准库提供的

greater<T>
登录后复制
函数对象:

std::sort(nums.begin(), nums.end(), std::greater<int>());
登录后复制

或者你也可以自己写一个比较函数,效果是一样的。


三、自定义比较函数:灵活应对复杂排序逻辑

当你要排序的对象不是简单数字,而是结构体、类对象,或者有多个字段要综合判断时,就需要自己写比较函数。

Chromox
Chromox

Chromox是一款领先的AI在线生成平台,专为喜欢AI生成技术的爱好者制作的多种图像、视频生成方式的内容型工具平台。

Chromox 184
查看详情 Chromox

比较函数格式要求:

比较函数应该接受两个参数,并返回一个布尔值。如果第一个参数应该排在前面,就返回

true
登录后复制

例如,我们有一个表示学生的结构体:

struct Student {
    std::string name;
    int score;
};
登录后复制

我们希望按分数从高到低排序:

bool compareByScore(const Student& a, const Student& b) {
    return a.score > b.score; // 分高的排前面
}
登录后复制

然后调用:

std::vector<Student> 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 < b.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与自定义比较函数实践的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号