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

sort自定义cmp

好的,我们来详细探讨一下在 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.jsqmd.com/news/44618/

相关文章:

  • 846. 大学生HTML期末大作业 ―【响应式自适应个人博客网页(1页)】 Web前端网页制作 html5+css3 - 实践
  • 2025年集成安全继电器定制厂家权威推荐榜单:进口安全继电器/稳定的安全继电器/CE安全继电器源头厂家精选
  • 2025年11月国内PMS酒店管理系统公司排行榜TOP5:智能化转型首选指南
  • 2025 天冬树脂厂家最新推荐榜单:国际协会权威测评 + 多维度考核,优质品牌实力领衔行业防水/建筑涂料/聚脲/防腐/美缝剂天冬树脂公司推荐
  • 2025年国内PMS酒店管理系统公司权威推荐排行榜
  • AtCoder Beginner Contest 430
  • 2025 最新自动投篮机厂家推荐,智能自动投篮机源头厂家权威排行榜 便携可折叠 / 抛投式 / 分体式篮球训练器优质品牌精选
  • 2025 工业加热器厂家最新推荐排行榜:实力制造商深度解析,覆盖多场景加热设备优质解决方案
  • SQL Server 2025 正式版发布 - 从本地到云端的 AI 就绪企业数据库
  • 虚拟机上redhat7.2安装oracle 11g
  • 树形结构转换工具类
  • 汽车行业PPM统计乱象
  • 熵、交叉熵、KL散度
  • Studio 3T 2025.21 发布 - MongoDB 的终极 GUI、IDE 和 客户端
  • 2025年长沙心理咨询机构专家团队排名,在线/线上心理咨询公司排行
  • SLS 脱敏函数实践:智能化与数据安全的融合
  • .net 行不行?在线客服系统成功支持客户双11大促,21客服在线,高峰超300会话并发
  • 手机WebView启用硬件GPU加速 - jerry
  • Cisco Secure Email and Web Manager Virtual 16.0.2 MD - 集中管理思科安全设备
  • PVE9安装R8125 2.5G网卡驱动、开启缓冲区、开启硬件多队列支持(基于联想来酷MiniPro)
  • 单部电梯调度程序
  • 2025年吨包醋酸钠定制厂家权威推荐榜单:‌工业级乙酸钠/醋酸钠乙酸钠/醋酸钠乙酸钠源头厂家精选
  • 完整教程:解读ASME BPVC.II.A-2023
  • linux doxygen
  • 2025 最新钢管设备厂家权威推荐榜:3PE 防腐 / 抛丸除锈 / 涂塑喷粉设备综合测评重磅发布内壁抛丸除锈设备/涂塑设备,防腐设备,粉末喷涂设备,内外壁喷粉设备,抛丸除锈设备公司推荐
  • 2025 最新管道设备供应厂家口碑推荐榜:聚焦 3PE / 除锈 / 涂塑设备,精选品牌权威测评推荐管道除锈设备/管道涂塑设备/管道内壁喷粉设备/管道涂塑设备公司推荐
  • 2025年人参皂苷化学对照品源头厂家权威推荐榜单:维生素K2化学对照品/蜕皮激素化学对照品/麦角甾醇化学对照品源头厂家精选
  • CODE1:GPIO输出和输入 - LI,Yi
  • 生成ppt图片的网站
  • Teamcenter 导入 mpp创建时间表 - 张永全