讲师中心 微信公众号
AI工具推荐 视频效率加速

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

云枫吖_5052

云枫吖_5052

发布时间:2025-11-18 18:06:05

|

786人浏览过

|

来源于php中文网

原创

使用自定义比较规则可灵活控制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中很常见,编译器通常能更好优化仿函数。

Cn Password Generator
Cn Password Generator

安全的随机密码生成器。支持自定义长度、字符类型(大写/小写字母、数字、特殊符号),排除相似字符,批量生成。纯 Python 标准库,无需 API 密钥。

下载

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

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++速学教程(入门到精通)
c++速学教程(入门到精通)

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

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5239

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5764

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2384

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1592

2025.10.17

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

1098

2023.09.04

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

1938

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1558

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2244

2023.09.04

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

60

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn