C++ sort函数自定义排序方法_C++ STL算法库高级技巧

答案:std::sort 支持自定义排序,可通过函数对象、Lambda 表达式或普通函数实现;例如用结构体重载 operator() 实现降序,或用 Lambda 按 pair 的 second 排序,或用函数指针按学生分数排序,提升灵活性。

c++ sort函数自定义排序方法_c++ stl算法库高级技巧

在C++中,std::sort 是 STL 算法库中最常用的排序函数之一,定义在 algorithm 头文件中。它默认对基本类型进行升序排序,但实际开发中我们常需要按特定规则排序复杂数据类型,这就需要用到自定义排序方法。

使用函数对象(仿函数)自定义排序

函数对象是重载了 operator() 的类或结构体,可像函数一样调用。通过定义函数对象,可以实现灵活的排序逻辑。

例如,对整数进行降序排序:

struct Greater {    bool operator()(int a, int b) {        return a > b;    }};std::vector nums = {5, 2, 8, 1};std::sort(nums.begin(), nums.end(), Greater());

此时序列将按从大到小排列。该方式适用于需要复用排序规则的场景。

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

使用Lambda表达式简化自定义排序

C++11 起支持 Lambda 表达式,可直接在调用 std::sort 时内联定义比较逻辑,代码更简洁。

例如,对 pair 按第二个元素排序:

std::vector<std::pair> data = {{1, 5}, {2, 3}, {3, 8}};std::sort(data.begin(), data.end(), [](const auto& a, const auto& b) {    return a.second < b.second;});

Lambda 避免了额外定义结构体的开销,适合一次性使用的排序规则。

对自定义类或结构体排序

当容器中存储的是自定义类型时,必须提供明确的比较方式。

例如,定义一个表示学生的结构体:

struct Student {    std::string name;    int score;};std::vector students = {{"Alice", 85}, {"Bob", 90}, {"Charlie", 70}};

按成绩降序、姓名升序排列:

std::sort(students.begin(), students.end(), [](const Student& a, const Student& b) {    if (a.score != b.score) {        return a.score > b.score;    }    return a.name < b.name;});

这种多级排序在实际应用中非常常见,如成绩优先,相同时按字典序排姓名。

注意事项与性能提示

自定义比较函数必须满足严格弱序(strict weak ordering),即:

不可自反:compare(a, a) 必须为 false 若 compare(a, b) 为 true,则 compare(b, a) 应为 false 传递性:若 compare(a, b) 和 compare(b, c) 成立,则 compare(a, c) 也应成立

否则可能导致未定义行为或死循环。此外,比较函数尽量声明为 const 引用传参,避免不必要的拷贝。

基本上就这些。掌握自定义排序能大幅提升 C++ 编程效率,尤其在处理复杂数据结构或算法题时非常实用。

以上就是C++ sort函数自定义排序方法_C++ STL算法库高级技巧的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1488384.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 11:30:42
下一篇 2025年12月19日 11:30:48

相关推荐

发表回复

登录后才能评论
关注微信