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

C++ vector 自定义排序实战:从基础规则到Lambda表达式进阶

1. 为什么需要自定义vector排序在日常开发中我们经常遇到标准排序规则无法满足需求的情况。比如处理二维坐标点时可能需要先按x轴降序排列x相同的再按y轴升序排列或者处理任务队列时需要根据任务优先级和创建时间进行多级排序。这时候就需要自定义排序规则。C的vector容器虽然提供了默认的sort排序但面对复杂数据结构时往往力不从心。我最近在优化一个游戏引擎的渲染系统时就遇到了需要对十万级别的精灵图元按层级和深度排序的需求默认排序完全无法满足性能要求。2. 基础排序方法比较函数2.1 一维vector的排序我们先从最简单的例子开始。假设有一个整数vectorvectorint numbers {3,1,4,1,5,9,2,6};默认的升序排序很简单sort(numbers.begin(), numbers.end()); // 结果1,1,2,3,4,5,6,9如果想降序排列可以使用标准库提供的greatersort(numbers.begin(), numbers.end(), greaterint()); // 结果9,6,5,4,3,2,1,12.2 二维vector的排序当处理二维vector时情况就变得有趣了。考虑一个存储坐标点的vectorvectorvectorint points {{0,2},{1,5},{1,9},{4,6},{5,9},{8,10}};默认排序会先比较每个子vector的第一个元素相等时再比较第二个sort(points.begin(), points.end()); // 结果{0,2},{1,5},{1,9},{4,6},{5,9},{8,10}但如果我们想要先按x坐标降序x相同再按y升序呢这就需要自定义比较函数static bool cmp(const vectorint a, const vectorint b) { if(a[0] b[0]) return a[1] b[1]; // x相同则y升序 return a[0] b[0]; // x降序 } sort(points.begin(), points.end(), cmp); // 结果{8,10},{5,9},{4,6},{1,5},{1,9},{0,2}这里有个关键点比较函数必须声明为static。这是因为在类内部定义时非静态成员函数有隐含的this指针参数与sort函数期望的调用约定不匹配。我在LeetCode刷题时就因为这个坑卡了半天。3. pair类型的排序技巧3.1 pair的基本排序pair是C中非常实用的模板类常用于存储键值对。它的默认排序规则是先比较first再比较secondvectorpairint,int pairs {{0,2},{1,5},{1,9},{4,6},{5,9},{8,10}}; sort(pairs.begin(), pairs.end()); // 结果{0,2},{1,5},{1,9},{4,6},{5,9},{8,10}3.2 自定义pair排序假设我们要实现和之前一样的排序规则first降序second升序。比较函数可以这样写static bool cmp(const pairint,int a, const pairint,int b) { if(a.first b.first) return a.second b.second; return a.first b.first; } sort(pairs.begin(), pairs.end(), cmp); // 结果{8,10},{5,9},{4,6},{1,5},{1,9},{0,2}在实际项目中我经常用pair来存储带权重的数据。比如在实现Dijkstra算法时就需要按距离优先处理节点这时候自定义排序就派上用场了。4. Lambda表达式更现代的解决方案4.1 Lambda基础用法C11引入的Lambda表达式让自定义排序变得更简洁。上面的例子可以改写为sort(points.begin(), points.end(), [](const vectorint a, const vectorint b) { if(a[0] b[0]) return a[1] b[1]; return a[0] b[0]; });Lambda的语法糖让我们可以就地定义排序规则不需要额外写比较函数。这在算法竞赛和快速原型开发中特别有用。4.2 使用auto简化代码C14进一步增强了Lambda的能力允许参数使用autosort(points.begin(), points.end(), [](const auto a, const auto b) { if(a[0] b[0]) return a[1] b[1]; return a[0] b[0]; });这种写法更通用可以适配不同类型的容器元素。我在处理模板代码时特别喜欢用这种方式可以减少很多重复代码。4.3 捕获外部变量Lambda的强大之处在于它能捕获外部变量。比如我们需要根据一个外部定义的权重表来排序unordered_mapint, int weight_table {{0,5}, {1,3}, {4,8}, {5,2}, {8,1}}; sort(points.begin(), points.end(), [weight_table](const auto a, const auto b) { return weight_table[a[0]] weight_table[b[0]]; });这个特性在处理复杂业务逻辑时非常有用。记得我在开发一个推荐系统时就利用这个特性实现了基于多种因素加权的动态排序。5. 性能考量与最佳实践5.1 比较函数与Lambda的性能很多人担心Lambda会带来性能开销但实际上现代编译器对简单Lambda的优化非常好。在我的测试中对于基本类型的排序Lambda和普通函数的性能差异可以忽略不计。但对于复杂对象建议尽量使用引用传递参数避免不必要的拷贝// 好使用const引用 sort(items.begin(), items.end(), [](const BigObject a, const BigObject b) { return a.value b.value; }); // 不好值传递会导致拷贝 sort(items.begin(), items.end(), [](BigObject a, BigObject b) { return a.value b.value; });5.2 稳定排序的重要性当排序的等价元素需要保持原有相对顺序时应该使用stable_sort而不是sortvectorStudent students {...}; stable_sort(students.begin(), students.end(), [](const auto a, const auto b) { return a.grade b.grade; // 按成绩降序同分学生保持原顺序 });在处理GUI元素排序或者有多个排序条件的场景下这个特性特别有用。5.3 多条件排序的技巧当需要按多个条件排序时可以这样组织代码sort(employees.begin(), employees.end(), [](const auto a, const auto b) { if(a.department ! b.department) return a.department b.department; if(a.salary ! b.salary) return a.salary b.salary; return a.hire_date b.hire_date; });这种模式清晰表达了先按部门升序同部门按薪资降序最后按入职时间升序的业务逻辑。我在处理人力资源系统时就用这种方式实现了复杂的员工排序需求。

相关文章:

C++ vector 自定义排序实战:从基础规则到Lambda表达式进阶

1. 为什么需要自定义vector排序? 在日常开发中,我们经常遇到标准排序规则无法满足需求的情况。比如处理二维坐标点时,可能需要先按x轴降序排列,x相同的再按y轴升序排列;或者处理任务队列时,需要根据任务优先…...

从零搭建 LNMP+WordPress:从环境部署到网站上线全流程教程

在搭建个人博客、企业官网时,LNMP(LinuxNginxMySQLPHP) 是业内最稳定、高效、轻量化的经典组合。不管是阿里云 ECS 云服务器,还是本地 CentOS 虚拟机,跟着这篇教程走,新手也能从 0 到 1 完成网站搭建&#…...

2026年腾讯云入门流程:怎么部署OpenClaw?Coding Plan配置与大模型API Key教程

2026年腾讯云入门流程:怎么部署OpenClaw?Coding Plan配置与大模型API Key教程。OpenClaw(前身为Clawdbot/Moltbot)作为开源、本地优先的AI助理框架,凭借724小时在线响应、多任务自动化执行、跨平台协同等核心能力&…...

《QClaw白名单精细化配置全指南,从入门到精通》

深夜的台灯把桌面切成明暗两半,指尖悬在鼠标上迟迟不敢落下,屏幕里是攒了半个月的项目初稿和客户签字的保密协议扫描件。窗外的车流声渐渐稀疏,整个房间只剩下键盘敲击的余响和自己的心跳声。之前有过一次糟糕的经历,用某款热门云…...

从模型编译到板端推理:手把手教你将自定义YOLO模型部署到RK3568 NPU

从模型编译到板端推理:RK3568 NPU部署YOLO模型的工程实践指南 当我们将训练好的YOLO模型部署到边缘设备时,RK3568凭借其强大的NPU加速能力成为理想选择。但模型从开发环境到实际硬件的高效迁移,往往让工程师面临诸多挑战——环境配置、模型转…...

AI产品经理:不只是懂算法,更需AI思维,引爆智能未来!大模型产品经理成长路线

本文探讨了AI产品经理的核心特质,强调其不仅需掌握AI算法,更应具备AI思维。文章指出,AI产品设计以操作简单为标准,但背后是复杂的系统支持。同时,AI发展依赖于产业生态的共同推进,包括上游芯片提供算力、中…...

WindowResizer终极指南:如何强制调整任意Windows窗口大小

WindowResizer终极指南:如何强制调整任意Windows窗口大小 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 你是否曾遇到过那些"顽固"的Windows应用程序窗口&a…...

如何快速激活Adobe创意云:Adobe-GenP 3.0终极指南

如何快速激活Adobe创意云:Adobe-GenP 3.0终极指南 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 还在为Adobe Creative Cloud高昂的订阅费用发愁吗&…...

Rust 性能优化的三个方向

Rust 性能优化的三个方向 Rust 以其高效、安全和并发能力著称,但即使如此,性能优化仍然是开发者需要关注的重点。Rust 的性能优化主要围绕三个方向展开:减少内存分配、提高代码执行效率以及利用并发优势。这三个方向相辅相成,能够…...

Snap.Hutao终极使用指南:免费开源的原神工具箱完全攻略

Snap.Hutao终极使用指南:免费开源的原神工具箱完全攻略 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 🧰 / Multifunctional Open-Source Genshin Impact Toolkit 🧰 项目地址: https://gitcode.com/GitHub_Trending/sn/Snap.Hu…...

Java NIO 与异步 IO 对比

Java NIO与异步IO对比:高并发场景下的技术选型 在当今高并发的网络应用中,如何高效处理I/O操作成为开发者关注的核心问题。Java NIO(Non-blocking I/O)和异步IO(如AIO)是两种主流的解决方案,它…...

从轴承润滑到代码实现:手把手教你用Python FDM求解稳态雷诺方程

从轴承润滑到代码实现:用Python FDM求解稳态雷诺方程的工程实践 滑动轴承的润滑性能直接影响旋转机械的寿命与效率。想象一下,你正在设计一台高速涡轮机,轴承的油膜压力分布直接决定了设备能否稳定运行。传统方法依赖昂贵的商业仿真软件&…...

如何高效使用Neper:多晶体建模与网格划分实战指南

如何高效使用Neper:多晶体建模与网格划分实战指南 【免费下载链接】neper Polycrystal generation and meshing 项目地址: https://gitcode.com/gh_mirrors/nep/neper 在材料科学和工程领域,构建精确的多晶体微观结构模型是进行有限元分析和性能预…...

前端新人必看:用nvm管理Node版本,再也不怕‘npm install’报错了(保姆级避坑指南)

前端新人必看:用nvm管理Node版本,再也不怕‘npm install’报错了(保姆级避坑指南) 刚入门前端开发时,最让人头疼的莫过于各种环境配置问题。尤其是当你兴致勃勃地准备运行一个Vue或React项目时,突然蹦出一堆…...

OCR + 自动翻译:跨境电商批量铺货方案(支持多语言自动识别)

OCR 自动翻译:跨境电商批量铺货方案(支持多语言自动识别) 跨境电商最大的问题不是选品,而是: 👉 语言处理成本太高 商品图是中文平台是英文 / 日文 / 西班牙文人工翻译效率极低 一、解决方案 商品图片…...

机器学习算法清单:从入门到精通的实用指南

1. 为什么需要创建机器学习算法清单作为一名从业多年的数据科学家,我深刻理解初学者面对海量机器学习算法时的困惑。教科书和开源库中充斥着数百种算法,光是记住名称就让人头疼。更糟糕的是,这种信息过载会导致两种典型问题:第一种…...

如何快速掌握LSLib:神界原罪与博德之门3文件处理的终极指南

如何快速掌握LSLib:神界原罪与博德之门3文件处理的终极指南 【免费下载链接】lslib Tools for manipulating Divinity Original Sin and Baldurs Gate 3 files 项目地址: https://gitcode.com/gh_mirrors/ls/lslib 想为《神界原罪》系列或《博德之门3》制作M…...

别再乱设帧率了!用DaVinci Resolve 18剪辑前,先搞定这3个关键设置(新手避坑)

别再乱设帧率了!用DaVinci Resolve 18剪辑前,先搞定这3个关键设置(新手避坑) 刚接触DaVinci Resolve的新手们,往往迫不及待地想要开始剪辑,却忽略了前期设置的重要性。错误的帧率选择、不当的缓存位置设置以…...

5大核心优势:Vue3+Ant Design后台框架的实战应用指南

5大核心优势:Vue3Ant Design后台框架的实战应用指南 【免费下载链接】ant-design-vue3-admin 一个基于 Vite2 Vue3 Typescript tsx Ant Design Vue 的后台管理系统模板,支持响应式布局,在 PC、平板和手机上均可使用 项目地址: https://…...

避坑指南:用STM32CubeMX配置MODBUS从机时,串口DMA和HAL库回调函数那些容易踩的‘坑’

STM32CubeMX配置MODBUS从机:DMA与HAL库回调函数避坑实战 当你在深夜调试MODBUS从机程序时,突然发现串口接收的数据总是莫名其妙丢失最后几个字节——这种场景是否似曾相识?作为嵌入式开发者,我们都经历过从基础中断收发升级到DMA传…...

ZLibrary架构揭秘:数字资源分发的技术前沿

从ZLibrary入口看数字资源分发架构的技术文章大纲引言数字资源分发在互联网时代的核心作用ZLibrary作为典型案例的背景介绍文章结构概述ZLibrary的技术架构分析前端入口设计:域名系统与访问路由负载均衡与高可用性实现方案分布式存储系统的数据组织方式资源分发关键…...

BitNet b1.58-2B-4T-GGUF开源大模型教程:原生训练量化 vs 后量化性能对比

BitNet b1.58-2B-4T-GGUF开源大模型教程:原生训练量化 vs 后量化性能对比 1. 项目概述 BitNet b1.58-2B-4T-GGUF 是一款革命性的开源大语言模型,采用创新的1.58-bit量化技术。与传统的后训练量化不同,该模型在训练过程中就实现了量化&#…...

GPU算力梯队划分与选型指南

GPU算力梯队划分标准以显存容量、CUDA核心数、Tensor Core数量、FP32/FP64算力为基准指标消费级(如RTX 4090)、专业级(如A100)、超算级(如H100)的硬件参数对比各梯队典型型号的峰值算力与能效比数据训练任务…...

明日方舟游戏素材完整指南:如何快速获取并使用官方美术资源

明日方舟游戏素材完整指南:如何快速获取并使用官方美术资源 【免费下载链接】ArknightsGameResource 明日方舟客户端素材 项目地址: https://gitcode.com/gh_mirrors/ar/ArknightsGameResource 如果你正在寻找《明日方舟》的高质量游戏素材,那么这…...

手把手教你用Python脚本绕过SQL过滤,在BUUCTF靶场实战GetShell

Python自动化SQL注入:从字符编码到实战GetShell的高级技巧 在CTF竞赛中,SQL注入始终是Web安全赛道的核心考点。当面对严格的关键词过滤时,传统的手工注入往往举步维艰。本文将深入探讨如何通过Python脚本自动化构造char()编码Payload&#xf…...

ChatGPT Codex 实战指南:从安装到使用

📗 OpenAI 官方 AI 编程 Agent,并行处理任务的云端智能工程师 📅 2026 年 4 月更新 | ⏱ 阅读约 8 分钟 目录 什么是 ChatGPT Codex三种使用方式前置准备云端网页版使用CLI 命令行安装VS Code 扩展安装实战演示常用命令速查使用建议与注意事…...

百度网盘下载加速终极指南:BaiduPCS-Web与KinhDown免费高速下载方案

百度网盘下载加速终极指南:BaiduPCS-Web与KinhDown免费高速下载方案 【免费下载链接】baidupcs-web 项目地址: https://gitcode.com/gh_mirrors/ba/baidupcs-web 你是否还在忍受百度网盘几十KB/s的龟速下载?当你急需下载重要文件时,进…...

Visual C++运行库终极指南:一站式解决Windows程序启动问题

Visual C运行库终极指南:一站式解决Windows程序启动问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 当你遇到"缺少MSVCR120.dll"、&qu…...

Claude Code vs ChatGPT Codex 深度对比:2026 年哪款 AI 编程工具更适合你?

⚔️ 深度对比评测 客观中立 📅 2026 年 4 月 | ⏱ 阅读约 10 分钟 目录 工具概览安装与上手难度定价与订阅代码质量与生成能力指令遵循能力上下文理解与记忆系统生态系统与扩展能力综合评分适用场景推荐总结与选购建议 一、工具概览 2025-2026 年,AI…...

别再只会用QDateTime::currentDateTime()了!Qt时间处理的5个实战技巧与避坑指南

Qt时间处理进阶:5个实战技巧与避坑指南 在Qt开发中,时间处理看似简单却暗藏玄机。很多开发者习惯性地使用QDateTime::currentDateTime()获取当前时间,却不知道这背后可能隐藏着性能损耗、时区陷阱和格式化问题。本文将带你深入Qt时间处理的进…...