sort自定义cmp

news/2025/11/19 14:31:45/文章来源:https://www.cnblogs.com/ecsilvia/p/19242322

好的,我们来详细探讨一下在 C++ 中如何自定义 sort 的排序规则。

sort 函数是 C++ 标准库中的一个强大工具,它默认使用升序排列。但很多时候,我们需要根据特定的需求来排序,比如降序、按字符串长度、或者像你之前看到的那样,按自定义的拼接规则排序。

自定义 sort 排序规则的核心是提供一个比较函数(或函数对象),告诉 sort 函数两个元素 ab 应该如何比较,即 a 应该排在 b 的前面还是后面。

方法一:使用函数指针(最常用)

这是最直接、最常用的方法。我们定义一个普通的函数,然后将它的名字作为参数传递给 sort

1. 降序排序

这是一个简单的例子,展示如何对一个整数数组进行降序排序。

#include <iostream>
#include <vector>
#include <algorithm>// 自定义比较函数
// 如果 a 应该排在 b 前面,返回 true
bool compareDescending(int a, int b) {return a > b; // 降序:大的数在前
}int main() {std::vector<int> nums = {3, 1, 4, 1, 5, 9};// sort 的第三个参数就是我们的比较函数std::sort(nums.begin(), nums.end(), compareDescending);for (int num : nums) {std::cout << num << " ";}// 输出: 9 5 4 3 1 1return 0;
}

2. 按字符串长度排序

我们可以排序一个字符串 vector,让短的字符串排在前面。

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>// 比较两个字符串的长度
bool compareByLength(const std::string &a, const std::string &b) {return a.size() < b.size(); // 短的在前
}int main() {std::vector<std::string> words = {"apple", "banana", "cherry", "date"};std::sort(words.begin(), words.end(), compareByLength);for (const std::string &word : words) {std::cout << word << " ";}// 输出: date apple banana cherryreturn 0;
}

方法二:使用 Lambda 表达式(C++11 及以后)

对于简单的比较逻辑,使用 Lambda 表达式可以让代码更简洁,因为你不需要在别处定义一个单独的函数。Lambda 表达式是一种匿名函数。

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> nums = {3, 1, 4, 1, 5, 9};// 使用 Lambda 表达式作为比较函数std::sort(nums.begin(), nums.end(), [](int a, int b) {return a > b; // 同样是降序排序});for (int num : nums) {std::cout << num << " ";}// 输出: 9 5 4 3 1 1return 0;
}

这对于一次性的、简单的比较逻辑非常方便。

方法三:使用函数对象(Functor)

函数对象是一个重载了 () 运算符的类。当你需要在比较函数中携带一些额外的状态(参数)时,这是一个非常强大的方法。

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>// 定义一个函数对象类
class StringComparator {
public:// 构造函数,用于接收额外的参数explicit StringComparator(bool ascending) : ascendingOrder(ascending) {}// 重载 () 运算符bool operator()(const std::string &a, const std::string &b) const {if (ascendingOrder) {return a.size() < b.size(); // 升序} else {return a.size() > b.size(); // 降序}}private:bool ascendingOrder; // 用于存储排序方向的状态
};int main() {std::vector<std::string> words = {"apple", "banana", "cherry", "date"};// 按长度降序排序StringComparator descComparator(false);std::sort(words.begin(), words.end(), descComparator);std::cout << "降序: ";for (const std::string &word : words) {std::cout << word << " ";}// 输出: 降序: banana cherry apple datestd::cout << std::endl;// 按长度升序排序StringComparator ascComparator(true);std::sort(words.begin(), words.end(), ascComparator);std::cout << "升序: ";for (const std::string &word : words) {std::cout << word << " ";}// 输出: 升序: date apple banana cherryreturn 0;
}

总结与核心原则

无论使用哪种方法,你的比较函数都必须遵循一个基本原则,以确保 sort 能正确工作:

比较函数必须定义一个“严格弱序”(Strict Weak Ordering)。

简单来说,对于任意两个元素 ab

  1. 不可反身性compare(a, a) 必须返回 false。一个元素不能比它自己小。
  2. 不对称性:如果 compare(a, b)true,那么 compare(b, a) 必须为 false
  3. 传递性:如果 compare(a, b)truecompare(b, c)true,那么 compare(a, c) 必须为 true

在你之前提供的代码中,return (a+b)>(b+a); 这个比较函数就很好地遵守了这些规则,因此 sort 能够正确地对字符串进行排序,以得到最大的拼接结果。

// 你的比较函数
bool cmp(string a,string b){return (a+b)>(b+a); // "3"+"30" = "330" > "303" = "30"+"3"
}

总而言之,自定义 sort 的排序规则就是:创建一个比较函数,它接受两个同类型的参数 ab,并返回一个 bool 值,这个值为 true 就意味着 a 应该在排序后的序列中位于 b 之前。 你可以根据需要选择使用普通函数、Lambda 表达式或函数对象来实现这个比较逻辑。

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

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

相关文章

846. 大学生HTML期末大作业 ―【响应式自适应个人博客网页(1页)】 Web前端网页制作 html5+css3 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年集成安全继电器定制厂家权威推荐榜单:进口安全继电器/稳定的安全继电器/CE安全继电器源头厂家精选

在工业自动化与智能制造加速发展的背景下,集成安全继电器作为保障设备与人员安全的核心组件,其可靠性、定制化能力与合规性已成为工业安全领域的关键指标。据行业统计,全球中低压保护继电器市场销售额预计2031年将达…

2025年11月国内PMS酒店管理系统公司排行榜TOP5:智能化转型首选指南

摘要 随着酒店行业数字化进程加速,PMS酒店管理系统成为提升运营效率的核心工具。2025年,国内PMS市场呈现智能化、集成化趋势,头部企业通过技术创新引领行业变革。本文基于市场调研数据,精选5家最具实力的PMS服务商…

2025年国内PMS酒店管理系统公司权威推荐排行榜

文章摘要 随着酒店行业数字化转型加速,PMS酒店管理系统成为提升运营效率的核心工具。本文基于行业数据和技术指标,对2025年国内主流PMS厂商进行综合评估,为酒店经营者提供选型参考。榜单重点推荐在技术创新和服务体…

2025 天冬树脂厂家最新推荐榜单:国际协会权威测评 + 多维度考核,优质品牌实力领衔行业防水/建筑涂料/聚脲/防腐/美缝剂天冬树脂公司推荐

引言 在全球绿色化工产业升级浪潮下,天冬树脂作为高性能环保材料的核心品类,已成为涂料、胶黏剂、防水防腐等领域的关键原料,市场需求持续攀升。然而行业发展不均衡导致产品质量差异显著,部分产品存在环保不达标、…

AtCoder Beginner Contest 430

D - Neighbor Distance set模拟 #include<bits/stdc++.h> using namespace std; #define endl \n #define yes cout << "Yes" << endl #define no cout << "No" <<…

2025 最新自动投篮机厂家推荐,智能自动投篮机源头厂家权威排行榜 便携可折叠 / 抛投式 / 分体式篮球训练器优质品牌精选

引言 智能体育产业的蓬勃发展推动自动投篮机成为全球健身、校园及家庭运动的核心装备,但其市场呈现 “品质分层明显、技术差异悬殊” 的现状。据国际体育装备协会(ISEA)2024 年度测评数据显示,全球自动投篮机产品合…

2025 工业加热器厂家最新推荐排行榜:实力制造商深度解析,覆盖多场景加热设备优质解决方案

引言 工业加热器作为生产流程中的核心关键设备,其性能优劣直接关系到工艺稳定性、产品质量把控与企业综合成本控制,广泛应用于机械制造、化工生产、新能源、船舶航空等多个核心领域。当前市场上加热器品牌良莠不齐,…

SQL Server 2025 正式版发布 - 从本地到云端的 AI 就绪企业数据库

SQL Server 2025 正式版发布 - 从本地到云端的 AI 就绪企业数据库SQL Server 2025 正式版发布 - 从本地到云端的 AI 就绪企业数据库 SQL Server 2025 - AI ready enterprise database from ground to cloud 请访问原文…

虚拟机上redhat7.2安装oracle 11g

linux下oracle安装过程 先上传4个压缩文件和两个脚本文件1 vi /config文件 修改ip hostname oracleSID 2 运行 python脚本 1_init_os 3 root下改文件属性,4个zip文件改为oracle用户下的文件 chown -R or…

树形结构转换工具类

项目中使用了很多树状结构,为了方便使用开发一个通用的工具类。 使用工具类的时候写一个类基础BaseNode,如果有个性化字段添加到类里面,然后就可以套用工具类。 工具类会将id和pid做关联返回一个树状结构的集合。使…

完整教程:解读ASME BPVC.II.A-2023

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

linux drcom

您提到的 + #引号 + drcom + #引号 + 可能是某个特定软件或服务的名称,但根据常见的 Linux 系统和相关技术, + #引号 + drcom + #引号 + 并不是一个标准的 Linux 命令或工具。可能是以下几种情况之一:1.…

linux doxygen

在 Linux 系统中,doxygen 是一个常用的文档生成工具,主要用于从 C/C++ 代码中自动生成 API 文档。如果你想要在 Linux 系统中使用 doxygen,可以按照以下步骤进行操作:? 一、安装 Doxygen 1. 使用包管理器安装(适…

NetworkManager接管vxlan网卡等导致容器网络不通

表格 复制 检查方式 结果含义 nmcli device status 中 vxlan 接口为 unmanaged 未接管 nmcli connection show 中有 vxlan 配置 已接管 ip link 能看到接口但 nmcli 看不到 手动创建,未接管 // 确认有类似…

2025年生芝麻去石机订做厂家权威推荐榜单:生芝麻清理机/全自动洗芝麻机/芝麻清选机源头厂家精选

在粮油加工行业持续升级的背景下,生芝麻去石机作为芝麻预处理的核心设备,其性能直接影响芝麻制品的品质与安全。据行业统计,2025年全球芝麻加工设备市场规模预计达85亿元,其中智能化清理设备需求增长显著。为帮助用…

linux do while

在 Linux 中,没有直接的 do-while 循环结构,这是伪代码或特定语言(如 C、C++、Java 等)中的语法。在 Bash 脚本中,可以使用 while 循环来模拟 do-while 的行为。? 伪代码(C/C++风格): do {// 代码块 } while …

OpenCVSharp:使用三种不同的局部二值化算法

概述 局部二值化(Local Binarization)是一种图像处理技术,用于将灰度图像转换为二值图像(黑白图像)。与全局二值化不同,局部二值化不是对整个图像使用单一阈值,而是根据图像中每个像素周围的局部区域特征来动态…

linux dns重启

在 Linux 系统中,如果你想要重启 DNS 服务,通常是指重启 named(BIND)、dnsmasq 或 systemd-resolved 等 DNS 服务。以下是几种常见场景下的重启方法:? 1. 重启 named(BIND)服务(适用于 Debian/Ubuntu 系统) …

电流互感器:电力系统中的“智慧之眼”与应用全景

电流互感器通过电磁感应将大电流转换为小电流,实现安全测量与智能控制,广泛应用于电力系统各环节。在庞大而复杂的电力系统中,如何安全、精准地测量高达数十万安培的电流?如何确保从发电厂到千家万户的用电安全?在…