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

c++如何使用sort函数自定义排序_C++自定义比较规则实现方法

冰火之心
发布: 2025-11-18 18:06:05
原创
652人浏览过
使用自定义比较规则可灵活控制C++中sort函数的排序逻辑,支持函数指针、仿函数和Lambda表达式三种方式。1. 函数指针适用于简单降序等场景,如bool cmp(int a, int b) { return a > b; }实现整数降序排列。2. 仿函数通过重载()运算符定义比较逻辑,如struct CmpByLength { bool operator()(const string& a, const string& b) { return a.length() < b.length(); }};可用于按字符串长度排序,且常被编译器优化。3. Lambda表达式(推荐)语法简洁,适合局部逻辑,如[](const auto& a, const auto& b) { if (a.second != b.second) return a.second < b.second; return a.first < b.first; }可对pair按第二关键字升序排序。4. 注意事项:比较函数需满足严格弱序,即cmp(a,a)必须为false;相等元素顺序需保持时应使用stable_sort;自定义类型建议在类外定义比较逻辑以提高复用性;Lambda通常不捕获外部变量,除非必要。根据场景选择方式:简单用Lambda,复杂或高频复用用仿函数,传统环境可用函数指针,从而高效应对各类排序需求。

c++如何使用sort函数自定义排序_c++自定义比较规则实现方法

在C++中使用sort函数进行自定义排序,关键在于提供一个自定义的比较规则。这个规则可以通过函数指针、仿函数(函数对象)或Lambda表达式来实现。默认情况下,sort按照元素的“小于”关系升序排列,但通过自定义比较函数,可以灵活控制排序逻辑。

1. 使用函数指针定义比较规则

可以编写一个返回bool类型的函数,接收两个参数,当第一个参数应排在第二个之前时返回true

示例:按整数降序排列

#include <algorithm>
#include <vector>
using namespace std;

bool cmp(int a, int b) {
    return a > b; // 降序:a排在b前当a更大
}

int main() {
    vector<int> nums = {3, 1, 4, 1, 5};
    sort(nums.begin(), nums.end(), cmp);
    // 结果:{5, 4, 3, 1, 1}
    return 0;
}
登录后复制

2. 使用仿函数(函数对象)

定义一个类或结构体,重载()运算符,使其行为像函数。

示例:按字符串长度排序

struct CmpByLength {
    bool operator()(const string& a, const string& b) {
        return a.length() < b.length();
    }
};

vector<string> words = {"hi", "hello", "ok", "yes"};
sort(words.begin(), words.end(), CmpByLength());
// 结果:{"hi", "ok", "yes", "hello"}
登录后复制

这种方式在STL中很常见,编译器通常能更好优化仿函数。

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

绘ai
绘ai

ai绘图提示词免费分享

绘ai 153
查看详情 绘ai

3. 使用Lambda表达式(推荐)

C++11起支持Lambda,适合简单、局部的比较逻辑,写法简洁。

示例:对pair按第二关键字升序

vector<pair<int, int>> vp = {{1,5}, {2,3}, {3,3}};
sort(vp.begin(), vp.end(), [](const auto& a, const auto& b) {
    if (a.second != b.second)
        return a.second < b.second;
    return a.first < b.first;
});
登录后复制

Lambda避免了额外命名,代码更集中易读。

4. 注意事项与技巧

  • 比较函数必须满足“严格弱序”:不能对相同元素返回true,即cmp(a,a)必须为false
  • 若需稳定排序,可使用stable_sort,保持相等元素的原始顺序。
  • 对自定义类型(如结构体),可在类外单独定义比较逻辑,提高复用性。
  • Lambda捕获列表一般为空([]),除非需要外部变量参与比较。

基本上就这些。选择哪种方式取决于场景:简单逻辑用Lambda,复杂或复用多的用仿函数,传统场合可用函数指针。掌握这些方法后,sort可以应对各种排序需求。

以上就是c++++如何使用sort函数自定义排序_C++自定义比较规则实现方法的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源: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号