0

0

C++怎么对vector排序_C++使用sort函数排序【实战】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-03-16 19:19:03

|

346人浏览过

|

来源于php中文网

原创

std::sort要求容器迭代器为随机访问类型,仅vector、array、deque等支持;需传begin/end迭代器、包含<algorithm>和<vector>头文件;可自定义比较函数;排序后原下标失效,应改用索引数组或max_element等替代方案。

c++怎么对vector排序_c++使用sort函数排序【实战】

std::sortstd::vector 前必须确保有随机访问迭代器

std::vector 天然支持 std::sort,因为它的迭代器是随机访问类型。但如果你误用了 std::list 或自定义容器,直接套用会编译失败——错误信息通常是 no match for 'operator-' 或类似提示,本质是缺少 it - it 这类运算。

实操建议:

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

  • 确认容器类型:只有 std::vectorstd::arraystd::deque 等支持随机访问的容器能直接用 std::sort
  • 别传错迭代器:写成 sort(v.begin(), v.end()),不是 sort(v, v + n)(C 风格数组才这么用)
  • 头文件别漏:#include <algorithm>#include <vector> 都得有

默认升序不够用?自定义比较函数要传函数对象或 lambda

std::sort 默认用 operator<,对 intdouble 没问题,但对 struct 或需要降序时就得手动指定比较逻辑。常见错误是把 lambda 写成带返回值声明的完整函数体,或者捕获了局部变量却没注意生命周期。

实操建议:

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

  • 降序排序 vector<int>:用 sort(v.begin(), v.end(), greater<int>{}) 或 lambda [](int a, int b) { return a > b; }
  • 按结构体字段排序:确保 lambda 捕获方式安全,比如 [&v] (const auto& x, const auto& y) { ... } 一般没必要,直接用参数就够了
  • 避免在比较函数里修改元素:行为未定义,std::sort 可能多次调用比较函数,且不保证顺序

排序后下标失效是高频陷阱,别依赖原位置索引

一旦调用 std::sortvector 元素物理位置就变了。如果之前存了某个元素的下标(比如 int idx = 5;),排序后 v[idx] 不再是你以为的那个值。这不是 bug,是预期行为。

‎ Gemini Storybook
‎ Gemini Storybook

Google Gemini推出的AI绘本生成工具

下载

实操建议:

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

  • 需要保留原始顺序关系时,改用索引数组:先建 vector<size_t> indices(v.size()); iota(indices.begin(), indices.end(), 0);,再按 v[i]indices
  • 如果只是找最大/最小值,用 std::max_element / std::min_element 更轻量,不用动原容器
  • 调试时别只看前几个元素就断定排好了——检查边界值,尤其是重复元素和负数

性能敏感场景要注意 move 语义和自定义类型构造成本

std::sort 内部会大量交换(swap)元素。对 int 这种 trivial 类型毫无压力;但对含 std::stringstd::vector 成员的大对象,频繁拷贝可能拖慢速度。C++11 起默认用 std::move 优化,但前提是你的类型支持移动构造/赋值。

实操建议:

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

  • 自定义类记得显式实现移动操作,或用 = default 让编译器生成(前提是所有成员都可移动)
  • 真卡顿?考虑用 vector<unique_ptr<T>> 排指针,避免移动实体对象
  • std::stable_sort 保持相等元素相对顺序,但通常比 std::sort 慢一点,只在必要时换

排序本身不难,难的是你有没有意识到“排序之后,整个容器的逻辑状态已经变了”。尤其当 vector 被多个模块共享,或作为某次计算的中间结果时,这个变化很容易被忽略。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

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

1071

2023.08.02

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

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

410

2023.09.04

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

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

565

2023.09.20

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

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

510

2025.06.09

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

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

204

2025.07.04

string转int
string转int

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

1071

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

617

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

335

2025.08.29

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.5万人学习

C 教程
C 教程

共75课时 | 5.5万人学习

C++教程
C++教程

共115课时 | 22.2万人学习

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

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