当前位置: 首页 > news >正文

编程基础:详解 C++ 中的 `std::sort` 函数

编程基础:详解 C++ 中的 std::sort 函数

在C++编程中,排序是非常常见的操作,而std::sort是C++标准库中用于排序的一个高效函数。它提供了灵活的排序功能,可以使用默认排序规则或自定义的比较函数。本文将深入探讨std::sort的用法、参数要求、性能特点以及如何结合实际场景灵活运用。

文章目录

  • 编程基础:详解 C++ 中的 `std::sort` 函数
    • 摘要
    • 一、什么是`std::sort`?
      • 1.1 定义
      • 1.2 应用场景
      • 1.3 基本语法
    • 二、`std::sort`的基本用法
      • 2.1 默认排序规则示例
      • 2.2 自定义排序规则示例
    • 三、`std::sort` 的高级用法
      • 3.1 对结构体排序
      • 3.2 对二维数组排序
    • 四、注意事项与常见错误
      • 4.1 使用`std::sort`时的注意事项
      • 4.2 常见错误
    • 五、总结

摘要

本文详细介绍了C++标准库中的std::sort函数。内容包括函数的定义、使用场景、参数要求、基本语法和常见示例。通过具体代码示例,展示了std::sort的基本用法和自定义排序的方式,并结合常见的错误和注意事项,帮助读者掌握如何使用这个强大的排序工具。

一、什么是std::sort

1.1 定义

std::sort是C++标准库中用于对元素进行排序的函数,位于<algorithm>头文件中。它采用了一种混合排序算法,通常是快速排序和插入排序的结合,能够在大多数情况下提供接近 O(n log n) 的时间复杂度。

核心原理

  • std::sort通常基于快速排序实现,但为了优化性能,可能会在较小数据量时切换到插入排序。
  • 默认情况下,std::sort按升序排序,但也支持自定义比较函数或仿函数。

1.2 应用场景

  • 当需要对容器(如数组、vector等)中的数据进行排序时,std::sort是高效且易用的工具。
  • 适用于需要按特定规则排序的数据结构,如排序成绩、按照字母顺序排列字符串等。

1.3 基本语法

std::sort(Iterator first, Iterator last);
std::sort(Iterator first, Iterator last, Compare comp);
  • firstlast:分别表示排序的范围 [first, last),即从 first 指向的元素开始,到 last 指向的元素前一个结束。
  • comp:可选的自定义比较函数,定义排序规则。默认按照小于运算符<进行排序。

二、std::sort的基本用法

2.1 默认排序规则示例

以下是一个使用std::sort对整数数组进行默认升序排序的简单示例:

#include <iostream>
#include <algorithm>  // 导入 std::sort
#include <vector>     // 导入 std::vectorint main() {std::vector<int> numbers = {5, 2, 9, 1, 5, 6};  // 初始化一个整型数组// 使用 std::sort 进行排序std::sort(numbers.begin(), numbers.end());// 输出排序后的结果std::cout << "Sorted numbers: ";for (int num : numbers) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

解释

  • 该示例中,std::sort(numbers.begin(), numbers.end())按照升序对numbers中的整数排序。
  • begin()end() 分别返回容器的起始和结束迭代器,指定要排序的范围。

2.2 自定义排序规则示例

假设我们有一组数据,想要按降序排列。这时可以传递一个自定义比较函数或使用lambda表达式。

#include <iostream>
#include <algorithm>
#include <vector>int main() {std::vector<int> numbers = {5, 2, 9, 1, 5, 6};  // 初始化一个整型数组// 使用 std::sort 并传入自定义的比较函数,按降序排序std::sort(numbers.begin(), numbers.end(), [](int a, int b) {return a > b;  // 定义降序排序规则:如果 a > b,表示 a 在 b 前});// 输出排序后的结果std::cout << "Sorted numbers in descending order: ";for (int num : numbers) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

解释

  • 这里通过lambda表达式 [](int a, int b) { return a > b; },定义了一个自定义的降序排序规则。
  • std::sort的第三个参数是自定义的比较函数,它会根据该函数的返回值来确定元素的顺序。

三、std::sort 的高级用法

3.1 对结构体排序

除了简单的数据类型,std::sort还可以用于结构体等复杂数据类型的排序。比如我们有一个包含姓名和年龄的结构体,我们可以根据年龄对结构体进行排序。

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>// 定义 Person 结构体
struct Person {std::string name;int age;
};int main() {std::vector<Person> people = {{"Alice", 30},{"Bob", 25},{"Charlie", 35}};// 根据年龄对 people 进行排序std::sort(people.begin(), people.end(), [](const Person &a, const Person &b) {return a.age < b.age;  // 按年龄升序排序});// 输出排序结果std::cout << "Sorted people by age: " << std::endl;for (const auto &person : people) {std::cout << person.name << ": " << person.age << std::endl;}return 0;
}

解释

  • 在该示例中,我们定义了一个Person结构体,其中包含nameage字段。
  • 使用std::sortPerson对象进行排序时,通过自定义比较函数来指定排序规则(这里按照age升序排序)。

3.2 对二维数组排序

有时,我们可能需要对多维数组(如二维数组或嵌套的vector)进行排序。此时可以根据某一列的值进行排序。

#include <iostream>
#include <algorithm>
#include <vector>int main() {std::vector<std::vector<int>> matrix = {{1, 2, 3},{3, 2, 1},{2, 3, 1}};// 按第二列的值进行排序std::sort(matrix.begin(), matrix.end(), [](const std::vector<int>& a, const std::vector<int>& b) {return a[1] < b[1];  // 按第二列升序排序});// 输出排序后的二维数组std::cout << "Sorted matrix by second column: " << std::endl;for (const auto& row : matrix) {for (int elem : row) {std::cout << elem << " ";}std::cout << std::endl;}return 0;
}

解释

  • 在这个示例中,我们定义了一个二维数组matrix,并根据第二列的值对整个矩阵进行排序。

四、注意事项与常见错误

4.1 使用std::sort时的注意事项

  • 未定义行为:使用std::sort时,比较函数需要遵循严格弱序规则。即自定义比较函数需要确保满足!comp(b, a)comp(a, b)两者不可同时为真。
  • 大数据量排序:对于非常大的数据集,考虑使用std::stable_sort,它是稳定排序算法,能够保证相同元素的顺序不变。

4.2 常见错误

  • 错误使用比较函数:比较函数必须返回一个布尔值,表示两个元素的相对顺序。如果比较函数不符合这一规则,可能会导致未定义行为。

    错误示例:

    std::sort(vec.begin(), vec.end(), [](int a, int b) {return a - b;  // 错误!返回的是整数而非布尔值
    });
    

五、总结

std::sort是C++中功能强大的排序函数,能够在大多数场景下高效排序数据。它可以用于简单的升序或降序排序,也可以通过自定义比较函数实现复杂的排序逻辑。无论是处理简单的数据类型,还是自定义的复杂结构,std::sort都能够提供灵活的排序支持。

特性描述
默认排序使用<运算符,升序排序
自定义排序通过传入比较函数,自定义排序规则
稳定性std::sort不保证稳定性
复杂度最佳为 O(n log n),最差为 O(n^2)

✨ 我是专业牛,一个渴望成为大牛🏆的985硕士🎓,热衷于分享知识📚,帮助他人解决问题💡,为大家提供科研、竞赛等方面的建议和指导🎯。无论是科研项目🛠️、竞赛🏅,还是图像🖼️、通信📡、计算机💻领域的论文辅导📑,我都以诚信为本🛡️,质量为先!🤝

如果你觉得这篇文章对你有所帮助,别忘了点赞👍、收藏📌和关注🔔!你的支持是我继续分享知识的动力🚀!✨ 如果你有任何问题或需要帮助,随时留言📬或私信📲,我都会乐意解答!😊

相关文章:

编程基础:详解 C++ 中的 `std::sort` 函数

编程基础&#xff1a;详解 C 中的 std::sort 函数 在C编程中&#xff0c;排序是非常常见的操作&#xff0c;而std::sort是C标准库中用于排序的一个高效函数。它提供了灵活的排序功能&#xff0c;可以使用默认排序规则或自定义的比较函数。本文将深入探讨std::sort的用法、参数要…...

51单片机的宠物自动投喂系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温湿度传感器DS1302时钟模块蓝牙步进电机按键、蜂鸣器等模块构成。适用于猫猫/狗狗宠物自动喂食器等相似项目。 可实现基本功能: 1、LCD1602实时显示北京时间和温湿度 2、温湿度传感器DHT11采集环境温湿度 3、时…...

MongoDB快速实战与基本原理

目录 链接:https://note.youdao.com/ynoteshare/index.html?id=5e038498891617c552667b853742fdc1&type=note&_time=1727935558812 Mongo数据库的特点: mongo数据库和关系型数据库的区别: ​编辑 关系型数据库和文档型数据库的主要概念对比: 下载和启动(具体…...

编程技巧:优化

第一种&#xff1a;构造回文串---构造法 题目描述 [NOIP2016 普及组] 回文日期 - 洛谷 那么这道题我们总结一些题目要求&#xff1a; 1.输入两个字符串&#xff0c;为起始和终止日期 2.年份不会出现前导0 3.如果是回文日期&#xff0c;答案1 4.如果月份是2&#xff0c;要…...

pycharm中使用anaconda创建多环境,无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

问题描述 用的IDE是&#xff1a; 使用anaconda创建了一个Python 3.9的环境 结果使用pip命令的时候&#xff0c;报错 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案 为了不再增加系统变量&#xff0c;我们直接将变量添加在当前项目中你的Ter…...

【Linux】进程周边之优先级

目录 一、优先级 1.为什么要有进程优先级&#xff1f; 2.什么是进程优先级&#xff1f; 3.优先级的初始设定 3.1 PRI 和 NI 3.2如何修改优先级&#xff1f;&#xff08;sudo/root&#xff09; 3.2.1 概念&#xff1a; 3.2.2 如何查看进程的优先级&#xff1f; 3.3.3 或…...

Linux高级编程_29_信号

文章目录 进程间通讯 - 信号信号完整的信号周期信号的编号信号的产生发送信号1 kill 函数(他杀)作用&#xff1a;语法&#xff1a;示例&#xff1a; 2 raise函数(自杀)作用&#xff1a;示例&#xff1a; 3 abort函数(自杀)作用&#xff1a;语法&#xff1a;示例&#xff1a; 4 …...

uniapp修改uni-ui组件样式(对微信小程序/H5有效,vue3)

寻找要修改的样式 使用开发者工具找到具体要修改的class类名 修改 <style lang"scss">//.nav为上一级的class.nav::v-deep .uni-navbar--border {border-bottom-style: none !important;} </style>完整代码 <template><view><uni-na…...

Python 封装 socket 为 [TCP/UDP/MULTICAST] 服务端

在新线程中创建 TCP/UDP/MULTICAST 协议的服务端套接字&#xff0c;接收客户端的连接请求或数据&#xff0c;并调用 on_recv 回调函数处理数据。 #!/usr/bin/env python # -*- coding: utf-8 -*- import socket import threading import multiprocessingclass ServerSocket:de…...

c++ STL库 unordered_map

#include <iostream #include <string #include <unordered_map int main() { // 创建一个 unordered_map std::unordered_map<std::string, int> wordCount; // 插入元素 wordCount["apple"] 1; wordCount["banana"] 2;// 使用 insert…...

【接口测试】任务1:登录接口

需要技能竞赛软件测试资料的同学们可s聊我&#xff0c;详细了解 任务实现要求 根据系统管理员—登录—接口API文档&#xff0c;编写接口测试用例&#xff0c;分别使用PostMan及JMeter进行接口测试&#xff0c;需要检查系统接口是否能正常工作&#xff0c;返回值是否正确&#…...

二、Spring Boot集成Spring Security之实现原理

Spring Boot集成Spring Security之实现原理 一、Spring Security实现原理概要介绍二、使用WebSecurityConfiguration向Spring容器中注册FilterChainProxy类型的对象springSecurityFilterChain1、未配置securityFilterChain过滤器链时使用默认配置用于生成默认securityFilterCha…...

基于深度学习的点云处理模型PointNet++学习记录

前面我们已经学习了Open3D&#xff0c;并掌握了其相关应用&#xff0c;但我们也发现对于一些点云分割任务&#xff0c;我们采用聚类等方法的效果似乎并不理想&#xff0c;这时&#xff0c;我们可以想到在深度学习领域是否有相关的算法呢&#xff0c;今天&#xff0c;我们便来学…...

Javascript Object.assgin()详解以及深浅拷贝

Object.assign() 方法是 JavaScript 中用于将所有可枚举属性的值从一个或多个源对象复制到目标对象的方法。它将返回目标对象。这是一种浅拷贝&#xff0c;也就是说&#xff0c;如果源对象中的属性是一个对象或数组&#xff0c;那么这个属性的引用将被复制&#xff0c;而不是对…...

Redis篇(应用案例 - UV统计)(持续更新迭代)

目录 一、HyperLogLog 二、测试百万数据的统计 一、HyperLogLog 首先我们搞懂两个概念&#xff1a; UV&#xff1a;全称Unique Visitor&#xff0c;也叫独立访客量&#xff0c;是指通过互联网访问、浏览这个网页的自然人。 1天内同一个用户多次访问该网站&#xff0c;只记录…...

解锁微信小程序新技能:ECharts动态折线图搭配WebSocket,数据刷新快人一步!

在微信小程序中&#xff0c;数据可视化展示越来越受到开发者的重视。本文将为您介绍如何在微信小程序中使用ECharts绘制折线图&#xff0c;并通过WebSocket实现实时更新图表数据。 一、准备工作 创建微信小程序项目 首先&#xff0c;我们需要创建一个微信小程序项目。如果您已…...

上交所服务器崩溃:金融交易背后的技术隐患暴露杭州BGP高防服务器43.228.71.X

一、上交所宕机事件始末 2024 年 9 月 27 日&#xff0c;上交所交易系统突发崩溃&#xff0c;这一事件犹如一颗巨石投入平静的湖面&#xff0c;引起了轩然大波。当天上午&#xff0c;众多投资者反馈券商交易出现延迟问题&#xff0c;随后上交所发布了《关于股票竞价交易出现异常…...

P4、P4D、HelixSwarm 各种技术问题咨询

多年大型项目P4仓库运维经验&#xff0c;为你解决各种部署以及标准工业化流程问题。 Perforce 官网SDPHelixCore GuideHelixSwarm GuideHelixSwarm Download...

Linux 应用层协议HTTP

文章目录 一、初始HTTP协议二、URL格式网络中怎么通过URL进行定位资源呢&#xff1f;编码和解码 三、HTTP的请求格式和响应格式HTTP的请求格式HTTP的响应格式HTTP的请求方法GET方法POST方法GET Vs PostHTTP的封装和分用文件流操作浏览器获得一个完整的网页流程 HTTP的状态码对3…...

Python和C++混淆矩阵地理学医学物理学视觉语言模型和算法模型评估工具

&#x1f3af;要点 优化损失函数评估指标海岸线检测算法评估遥感视觉表征和文本增强乳腺癌预测模型算法液体中闪烁光和切伦科夫光分离多标签分类任务性能评估有向无环图、多路径标记和非强制叶节点预测二元分类评估特征归因可信性评估马修斯相关系数对比其他准确度 Python桑…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...