C++中的排序操作:sort与自定义排序(自定义排序函数、匿名函数、运算符重载)

在C++编程中,排序是一项常见而又重要的操作。本文将深入介绍C++标准库中的sort算法,以及如何利用其强大的自定义排序功能满足各种排序需求。

sort算法简介

C++标准库提供了sort算法,能够在O(N log N)的时间内对容器中的元素进行排序。这一高效的排序算法可以应用于数组、向量、链表等多种数据结构。

#include <algorithm>
#include <vector>int main() {std::vector<int> nums = {4, 2, 8, 5, 1, 7};std::sort(nums.begin(), nums.end());// 现在 nums = {1, 2, 4, 5, 7, 8}return 0;
}

自定义排序函数

sort算法还支持自定义排序函数,以满足更为复杂的排序需求。以下是一个自定义排序函数的示例,按照整数的绝对值进行排序:

#include <algorithm>
#include <vector>
#include <cmath>bool compareAbsolute(int a, int b) {return std::abs(a) < std::abs(b);
}int main() {std::vector<int> nums = {-4, 2, -8, 5, -1, 7};std::sort(nums.begin(), nums.end(), compareAbsolute);// 现在 nums = {-1, 2, -4, 5, 7, -8}return 0;
}

Lambda表达式自定义排序

C++11引入了Lambda表达式,使得自定义排序变得更加简洁。下面的示例展示了如何使用Lambda表达式按照奇偶性对整数进行排序:

#include <algorithm>
#include <vector>int main() {std::vector<int> nums = {4, 2, 8, 5, 1, 7};std::sort(nums.begin(), nums.end(), [](int a, int b) {return a % 2 < b % 2;});// 现在 nums = {2, 4, 8, 1, 5, 7}return 0;
}

接下来,在Lambda表达式中,我们使用[](const auto& a, const auto& b)定义了一个匿名函数,通过a[2] < b[2]指定了按照二维数组中的第三个元素进行排序。

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<std::vector<int>> twoDArray = {{1, 2, 5},{3, 4, 1},{5, 6, 3},};// 使用Lambda表达式定义排序规则std::sort(twoDArray.begin(), twoDArray.end(), [](const auto& a, const auto& b) {return a[2] < b[2];});// 输出排序结果for (const auto& row : twoDArray) {std::cout << "(" << row[0] << ", " << row[1] << ", " << row[2] << ") ";}return 0;
}

运算符重载自定义类型排序

如果涉及自定义类型,可以通过运算符重载来定义排序规则。以下示例展示了如何对自定义结构体按照年龄进行排序:

#include <algorithm>
#include <vector>struct Person {std::string name;int age;// 运算符重载bool operator<(const Person& other) const {return age < other.age;}
};int main() {std::vector<Person> people = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 35}};std::sort(people.begin(), people.end());// 现在 people = {{"Bob", 25}, {"Alice", 30}, {"Charlie", 35}}return 0;
}

通过深入理解sort算法以及各种自定义排序方法,C++开发者能够更好地应对不同场景下的排序需求,写出更灵活、高效的代码。在实际开发中,根据具体情况选择最合适的排序方式,将为项目的性能和可维护性带来积极的影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/637804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速下载百度网盘的文件——使用motrix

问题描述 下载速度慢 上传速度快 解决方案&#xff1a; Motrix 在该开源程序里面 选windows选择zip 启动之后 &#xff0c;把百度网盘的链接转化成磁力链接。然后输入转化后的连接。转换的网页 每次设置下载认任务是选择高级选项里面的请求头 修改为LogStatistic 然后就能超…

“低绩效”指南

前言 一看这个标题&#xff0c;大家是否有个疑问&#xff0c;为啥是低绩效指南&#xff0c;而不是高绩效指南。可以这么说&#xff0c;能拿到高绩效的人大多有共通之处&#xff0c;然而获得低绩效的同学原因各不相同&#xff0c;针对笔者总结的一些经验或许能帮助大家反向操作…

Qt5编译MySQL数据驱动、部署MySQL服务器、Qt写代码连接MySQL数据库_案例介绍

一、前言 由于Qt 5在高版本中取消了对MySQL数据库的默认支持,要在QT里继续使用mysql需要自己编译库。本篇文章介绍Qt5(我用的Qt5.12.6)里如何编译MySQL的库文件,讲解在Linux下安装配置MySQL数据库,Qt编写代码连接上自己的MySQL数据库完成数据存储。 MySQL是一个开源的关…

Odrive 学习系列四:如何使用脚本自动初始化odrive配置

一、背景: 在学习markbase的教程后,发现odrive的初始化配置命令确实有点多。尽管odrive有自动补全: 且可以通过 ctrl + → 来快速补全: 但是对初学者而言,仍旧有比较大的工作量。 而针对于此,我们可以通过powershell脚本的方式来解决这个问题。 二、设计初始化…

接口测试 03 -- 接口自动化思维 Requests库应用

1. 接口自动化思维梳理 1.1接口自动化的优点 接口测试自动化&#xff0c;简单来讲就是功能测试用例脚本化然后执行脚本&#xff0c;产生一份可视化测试报告。不管什么样的测试方式&#xff0c;都是为了验证功能与发现 BUG。那为什么要做接口测试自动化呢&#xff1f;一句话概括…

【ARM 嵌入式 编译系列 2.1 -- GCC 预处理命令 #error 和 #warning 详细介绍 】

文章目录 #error 和 #warning#error示例 #warning示例 打印行号示例 #error 和 #warning 在C语言中&#xff0c;#error 和 #warning 预处理指令可以用于在编译时生成错误或警告信息&#xff0c;通常用于调试或当代码中某些条件未满足时提醒开发者。当这些指令被编译器处理时&a…

项目解决方案:多地医馆的高清视频监控接入汇聚联网

目 录 一、背景 二、建设目标及需求 1.建设目标 2.现状分析 3.需求分析 三、方案设计 1.设计依据 2.设计原则 3.方案设计 3.1 方案描述 3.2 组网说明 四、产品介绍 1.视频监控综合资源管理平台介绍 2.视频录像服务器和存储 2.1概述 2.2存储设计 …

51单片机流水灯

**led 介绍**LED是“Light Emitting Diode”的缩写&#xff0c;即发光二极管。它是一种半导体器件&#xff0c;能够将电能转化为可见光。LED灯通常由LED芯片、封装材料、铝基板和灯罩等部件组成。 **LED灯具有以下特点&#xff1a;** 节能&#xff1a;LED灯具有较高的光电转换…

oracle篇—19c新特性自动索引介绍

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

Go 知识slice

Go 知识slice 1. 什么是slice2. slice 基础2.1 定义 2.2 实现原理2.2.1 make 创建2.2.2 切片 创建 2.3 操作2.3.1 append 追加2.3.2 表达式切片2.3.3 扩展表达式2.3.4 扩容2.3.5 拷贝 3. 测试一下3.1 len && cap3.2 append && 扩容3.3 切片表达式 1. 什么是sli…

Vue2移动端项目使用$router.go(-1)不生效问题记录

目录 1、this.$router.go(-1) 改成 this.$router.back() 2、存储 from.path&#xff0c;使用 this.$router.push 3、hash模式中使用h5新增的onhashchange事件做hack处理 4、this.$router.go(-1) 之前添加一个 replace 方法 问题背景 &#xff1a; 在 Vue2 的一个移动端开发…

/bin/rm Argument list too long – Linux 删除海量文件报错的解决方法

文章目录 /bin/rm Argument list too long – Linux”配合find与xargs完成删除海量文件使用find的delete选项 /bin/rm Argument list too long – Linux” 这种情况主要在大批量删除居多文件的情况下发生&#xff0c;也是因为删除的命令参数超过了shell参数的个数导致的&#…

Docker安装与启动

Docker概述 Docker是一个快速交付应用、运行应用的技术&#xff1a; 可以将程序及其依赖、运行环境一起打包为一个镜像&#xff0c;可以迁移到任意Linux操作系统运行时利用沙箱机制形成隔离容器&#xff0c;各个应用互不干扰启动、移除都可以通过一行命令完成&#xff0c;方便…

kotlin Pair 和 Triple

在 Kotlin 中&#xff0c;Pair 和 Triple 是两种内建的数据类&#xff0c;用于表示固定数量的元素对和三元组 Pair Pair 类型是用来存储两个相关联值的数据类&#xff0c;它有两个属性&#xff1a;first 和 second。 val pairExample Pair("Apple", "Banana…

AttributeError: module ‘numpy‘ has no attribute ‘float‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

YOLOv5改进系列(27)——添加SCConv注意力卷积(CVPR 2023|即插即用的高效卷积模块)

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

【Docker】安装Nginx容器并部署前后端分离项目

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Docker实战》。&#x1f3af;&#x1f3af; &…

小程序分享群获取群id

前端 // 分享页 onShareAppMessage(res) {return {path: /pages/index/index?uid${uni.getStorageSync(id)}&msg分享****,} },// APP页面 async onLaunch(options) {console.log(App Launch, options)wx.login({success: res > {console.log(res1111111111:, res)if (…

爬虫requests+综合练习

Day2 - 1.requests第一血_哔哩哔哩_bilibili requests作用&#xff1a;模拟浏览器发请求 requests流程&#xff1a;指定url -> 发起请求 -> 获取响应数据 -> 持续化存储 爬取搜狗首页的页面数据 import requests# 指定url url https://sogou.com # 发起请求 resp…

Three.JS教程1 环境搭建、场景与相机

Three.JS教程1 环境搭建、场景与相机 一、Three.JS简介二、环境搭建1. 开发准备2. 安装 three.js3. 新建文件index.htmlmain.js 4. 关于附加组件5. 启动 三、创建场景1. 场景的概念2. 相机的概念3. 相机的几个相关概念&#xff08;1&#xff09;视点&#xff08;Position&#…