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

c++如何使用std::sort排序结构体_c++结构体排序示例【总结】

云强君_1853

云强君_1853

发布时间:2026-02-25 14:37:08

|

805人浏览过

|

来源于php中文网

原创

std::sort自定义比较需传lambda或函数指针,参数须const&、返回bool且严格弱序;重载operator

c++如何使用std::sort排序结构体_c++结构体排序示例【总结】

std::sort 传自定义比较函数时必须是可调用对象

结构体默认没定义 ,直接 <code>std::sort 会编译失败,报错类似:invalid operands to binary expression ('const Person' and 'const Person')。不是语法写错了,是编译器根本不知道怎么比。

最稳妥的做法是传一个 lambda 或普通函数指针,要求两个参数、返回 bool,且不能修改参数(得加 const &):

std::sort(vec.begin(), vec.end(), [](const Person& a, const Person& b) {
    return a.age < b.age;  // 升序:小的在前
});
  • lambda 捕获列表必须为空([ ]),带捕获的 lambda 不能隐式转成函数指针,而 std::sort 内部可能做类型擦除或优化,依赖可转换性
  • 如果用独立函数,记得声明为 bool cmp(const Person&, const Person&),不能漏 const 和引用,否则临时对象构造开销大,还可能绑定失败
  • 别写成 return a.age ——相等时返回 <code>true 会破坏严格弱序,导致未定义行为,程序可能崩溃或结果乱序

结构体内重载 operator 后能直接用 <code>std::sort

如果你控制结构体定义,且这个“自然顺序”固定(比如总按 id 排),重载 operator 最省事,之后所有容器排序都无需额外传比较逻辑。

struct Person {
    int id;
    std::string name;
    int age;
    bool operator<(const Person& other) const {
        return id < other.id;
    }
};
  • 必须加 const 成员函数修饰,否则 std::sort 传入的 const 引用无法调用它
  • 只重载 operator 就够了,<code>std::sort 不关心 == 或 >
  • 如果后续需要多种排序方式(比如有时按年龄、有时按姓名),硬编码 operator 反而碍事,这时候还是用 lambda 更灵活

用 std::stable_sort 保持相等元素的原始顺序

当结构体字段有重复值(比如多人同龄),又希望“先输入的排前面”,就得换 std::stable_sort。它比 std::sort 稍慢,但保证稳定性。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

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

常见场景:日志按时间戳排序,但同一秒内多条日志要维持采集顺序;或分页数据合并后去重再排序,需保留原始插入位置关系。

  • 稳定性不等于“结果确定”,而是指:若 a 和 b 比较结果为相等(即 !cmp(a,b) && !cmp(b,a)),则排序后 a 在 b 前的相对位置不变
  • 不要以为加个 return a.age 就能模拟稳定——这是错的,会破坏算法前提,结果不可预测
  • std::stable_sort 对随机访问迭代器(如 vector)是 O(n log²n),空间复杂度略高,大数据量时注意内存

结构体含指针或非 trivial 成员时,排序本身不触发深拷贝问题

std::sort 移动的是结构体对象本身,不是靠拷贝构造——只要结构体支持移动(默认生成的移动构造函数可用),就只搬内存位,不调用构造/析构。这点常被误解。

例如结构体里有 std::string 或 std::vector,它们内部是堆内存指针,std::sort 交换时只是交换这些指针值,不 new/delete,所以安全高效。

  • 唯一要注意的是:确保结构体没有用户自定义的、非 noexcept 的移动构造函数,否则 std::sort 可能退化为拷贝(C++11 起标准要求移动操作最好是 noexcept)
  • 如果结构体含裸指针(如 int*)且手动管理内存,排序后指针值还在,但指向内容没变——这本身没问题;出问题往往是后续误以为指针随对象“一起迁移”了,其实只是地址被复制了
  • 别为了“避免拷贝”把结构体改成存 std::shared_ptr<person></person> 再排序——多一层间接,缓存不友好,纯属过度设计
实际写的时候,90% 的情况用 lambda 最直白;真要复用比较逻辑,抽成命名函数比重载 operator 更可控;稳定性需求不常有,但一旦有,别硬凑 <code>std::sort 加时间戳字段来 hack。

相关文章

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

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

下载

相关标签:

c++

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

热门AI工具

更多
DeepSeek

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

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

音述AI
音述AI Hot

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

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

讯飞智作

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

豆包大模型

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

WorkBuddy

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

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

相关专题

更多
string转int
string转int

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

7239

2023.08.02

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

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

1158

2023.09.04

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

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

2398

2023.09.20

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

5274

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

5451

2025.07.04

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

5274

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

5451

2025.07.04

string转int
string转int

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

7239

2023.08.02

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

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