【C++】STL容器中的比较函数对象
目录
set、map容器
priority_queue容器
在STL中涉及到以某种规则排序的容器都需要比较函数对象,比如:set、map、priority_queue这些容器内部都是依赖比较函数对象以某种规则存储数据的。STL容器中的比较函数对象可以是:函数指针、仿函数(函数对象)。当然,比较函数对象的应用肯定是不限于STL容器的,比如某些排序函数,如:std::sort,对于sort而言其比较函数对象可以是:函数指针、仿函数、lambda表达式。
set、map容器
set类模板参数如下:

可以看到set和map的默认比较函数对象是std::less<T>,默认存储的数据是按照pair<const Key,T>中的键值升序排序的。如果要降序呢?std::greater<T>是降序的,我们也可以自己实现一个比较函数对象,如下是set的构造函数种类:

set的构造函数只有空构造和范围构造是可以对比较函数对象进行设置,至于拷贝构造中的比较函数对象则是与源对象x的相同。
比较函数对象的一个重要作用就是我们可以根据实际情况灵活设置容器的数据按照某种规则排序。
比如,现在要实现一个排序需求:set容器中存储的数据类型是结构体,里面存储学生的基本信息(年龄,身高,性别),将这些结构体数据按照学生的年龄升序排序:
#include <iostream>
#include <set>
#include <string>
using namespace std;
struct StuData
{StuData(int age, int height, const string& sex){_age = age;_height = height;_sex = sex;}int _age;int _height;string _sex;
};//仿函数
class Comp
{
public:bool operator()(const StuData& stu1, const StuData& stu2) const{return stu1._age < stu2._age;}
};//函数指针
bool comp(const StuData& stu1, const StuData& stu2)
{return stu1._age < stu2._age;
}
typedef bool(*func_t)(const StuData&, const StuData&);
int main()
{//比较函数对象为仿函数://set<StuData, Comp> myset({ StuData(23,170,"male"),StuData(21,165,"female"),StuData(25,160,"female") });//比较函数为函数指针:func_t f = comp;set<StuData, func_t> myset({ StuData(23,170,"male"),StuData(21,165,"female"),StuData(25,160,"female") }, f);cout<<"年龄排序:";for (const auto& e : myset)cout << e._age << " ";return 0;
}
需要注意的是:当比较函数对象是我们自己实现的仿函数,其operator()重载运算符函数必须后应该加上const,否则会报错,我们可以观察到set容器构造函数参数中设置比较函数是以传const引用传参的,如下:

也就是说,我们实现的仿函数在传入到set对象中,此时这个仿函数是具有const属性的,然而调用被const属性修饰的对象中的某成员函数时(调用该成员函数时也不会修改对象中的成员变量时),此时就应该在该成员函数后加上const,那么这个成员函数参数列表中的this指针类型就从Comp*变成了const Comp*。这个对于比较函数对象按传const引用传参的设置应该是考虑到传入的仿函数是匿名对象的情况。
priority_queue容器
对于priority_queue的构造函数参数列表中,设置比较函数对象也是传const引用传参,优先级队列默认是大堆,对应的默认的比较函数对象是std::less<T>,我们也可以根据实际情况来实现新的比较函数对象。
一个应用:
合并K个升序链表
class Solution {
public://仿函数class Compare{public:bool operator()(const ListNode* node_1, const ListNode* node_2)const{return node_1->val > node_2->val;}};ListNode* mergeKLists(vector<ListNode*>& lists) {if (0 == lists.size())return nullptr;int size = lists.size();priority_queue<ListNode*, vector<ListNode*>, Compare> q;for (int i = 0;i < size;++i){if (lists[i] != nullptr)q.push(lists[i]);}ListNode* head = new ListNode();ListNode* cur = head;while (!q.empty()){ListNode* tmp = q.top();q.pop();cur->next = tmp;cur = cur->next;if (tmp->next != nullptr)q.push(tmp->next);}cur = head->next;delete head;return cur;}
};
相关文章:
【C++】STL容器中的比较函数对象
目录 set、map容器 priority_queue容器 在STL中涉及到以某种规则排序的容器都需要比较函数对象,比如:set、map、priority_queue这些容器内部都是依赖比较函数对象以某种规则存储数据的。STL容器中的比较函数对象可以是:函数指针、仿函数(函…...
深度学习基础02_损失函数BP算法(上)
目录 一、损失函数 1、线性回归损失函数 1.MAE损失 2.MSE损失 3.SmoothL1Loss 2、多分类损失函数--CrossEntropyLoss 3、二分类损失函数--BCELoss 4、总结 二、BP算法 1、前向传播 1.输入层(Input Layer)到隐藏层(Hidden Layer) 2.隐藏层(Hidden Layer)到输出层(Ou…...
6.584-Lab4A
6.584-LabA HomeworkReference CodeReference Blog 通过作业提供的概览图可以看出整个系统的组成:用户 Clerk 会发出命令(Get、Put、Append)到每个 Service,每个 Service 接收到命令后向下传递到 RaftCode 层,由 RaftC…...
语义版本控制
注意: 本文内容于 2024-11-27 22:25:05 创建,可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容,请访问原文地址:语义版本控制。感谢您的关注与支持! 由于自己平时喜欢写点小玩意,自然而…...
深入理解HTML基本结构:构建现代网页的基石
深入理解HTML基本结构:构建现代网页的基石 在数字时代,HTML(超文本标记语言)是构建和设计网页的基础。了解HTML的基本结构对于任何希望掌握网页开发的人来说至关重要。本文将详细介绍HTML文件的基本骨架,包括其核心标…...
一体化数据安全平台uDSP 入选【年度创新安全产品 TOP10】榜单
近日,由 FreeBuf 主办的 FCIS 2024 网络安全创新大会在上海隆重举行。大会现场揭晓了第十届 WitAwards 中国网络安全行业年度评选获奖名单,该评选自 2015 年举办以来一直饱受赞誉,备受关注,评选旨在以最专业的角度和最公正的态度&…...
【机器学习】机器学习的基本分类-监督学习(Supervised Learning)
监督学习是一种通过已有的输入数据(特征)和目标输出(标签)对模型进行训练的机器学习方法,旨在学到一个函数,将输入映射到正确的输出。 1. 监督学习概述 监督学习需要: 输入数据(特…...
Oracle之提高PLSQL的执行性能
目录 1、SQL解析详解 2、演示示例 3、启用Oracle跟踪事件 4、查看改造后SQL性能对比结果 更多技术干货,关注个人博客吧 1、SQL解析详解 SQL解析是数据块处理SQL语句不可缺少的步骤,是在解析器中执行的。将SQL转换成数据库可以执行的低级指令。 SQL解析分为硬解析和软…...
[VSCode] vscode下载安装及安装中文插件详解(附下载文件)
前言 vscode 链接:https://pan.quark.cn/s/3acbb8aed758 提取码:dSyt VSCode 是一款由微软开发且跨平台的免费源代码编辑器;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能,并且内置了命令行工具和Git版本控制系统。 …...
PHP中类名加双冒号的作用
在 PHP 中,类名加双冒号(::) 是一种用于访问类的静态成员和常量的语法。它也可以用来调用类的静态方法和访问 PHP 的类相关关键词(如 parent、self 和 static)。以下是详细的解释和用法。 1. 用途概述 :: 被称为作用域…...
前端编程训练 异步编程篇 请求接口 vue与react中的异步
文章目录 前言代码执行顺序的几个关键点接口请求vue与react中的异步vue中的异步react的state修改异步 前言 本文是B站三十的前端课的笔记前端编程训练,异步编程篇 代码执行顺序的几个关键点 我们可以理解为代码就是一行一行,一句一句是执行(定义变量&…...
【kafka03】消息队列与微服务之Kafka 读写数据
Kafka 读写数据 参考文档 Apache Kafka 常见命令 kafka-topics.sh #消息的管理命令 kafka-console-producer.sh #生产者的模拟命令 kafka-console-consumer.sh #消费者的模拟命令 创建 Topic 创建topic名为 chen,partitions(分区)为3࿰…...
【分布式系统】唯一性ID的实现
1、UUID(通用唯一标识符) 1、UUID本身 一种用于标识信息的标准化方法。一个128位的数字,常表示为32个十六进制数字,以连字符分隔成五组:8-4-4-4-12。 版本: UUID有不同的版本,最常见的是基于时…...
哪里能找到好用的动物视频素材 优质网站推荐
想让你的短视频增添些活泼生动的动物元素?无论是搞笑的宠物瞬间,还是野外猛兽的雄姿,这些素材都能让视频更具吸引力。今天就为大家推荐几个超实用的动物视频素材网站,不论你是短视频新手还是老手,都能在这些网站找到心…...
SRAM芯片数据采集解决方案
SRAM芯片数据采集解决方案致力于提供一种高效、稳定且易于操作的方法,以确保从静态随机存取存储器SRAM芯片中准确无误地获取数据。 这种解决方案通常包括硬件接口和软件工具,它们协同工作,以实现对SRAM芯片的无缝访问和数据传输。 在硬件方…...
【贪心算法第七弹——674.最长连续递增序列(easy)】
目录 1.题目解析 题目来源 测试用例 2.算法原理 3.实战代码 代码分析 1.题目解析 题目来源 674.最长递增子序列——力扣 测试用例 2.算法原理 贪心思路 3.实战代码 class Solution { public:int findLengthOfLCIS(vector<int>& nums) {int n nums.size();in…...
[AI] 知之AI推出3D智能宠物:助力语言学习与口语提升的新选择
Hello! 知之AI官网 [AI] 知之AI推出3D智能宠物:助力语言学习与口语提升的新选择 随着人工智能技术的飞速发展,虚拟助手和智能设备不断进入我们的生活。近日,知之AI重磅推出了一款创新产品——3D智能宠物。这一产品不仅具备多国语言交流能力&…...
Android 14之HIDL转AIDL通信
Android 14之HIDL转AIDL通信 1、interface接口1.1 接口变更1.2 生成hidl2aidl工具1.3 执行hidl2aidl指令1.4 修改aidl的Android.bp文件1.5 创建路径1.6 拷贝生成的aidl到1和current1.7 更新与冻结版本1.8 编译模块接口 2、服务端代码适配hal代码修改2.1 修改Android.bp的hidl依…...
【R库包安装】R库包安装总结:conda、CRAN等
【R库包安装】R studio 安装rgdal库/BPST库 R studio 安装rgdal库解决方法 R studio 安装BPST库(github)解决方法方法1:使用devtools安装方法2:下载安装包直接在Rstudio中安装 参考 基础 R 库包的安装可参见另一博客-【R库包安装】…...
学习PMC要不要去培训班?
在当今快速变化的商业环境中,PMC作为供应链管理的核心环节之一,其重要性日益凸显。PMC不仅关乎产品的物料计划、采购、库存控制及物流协调,还直接影响到企业的生产效率、成本控制以及市场竞争力。面对这一专业领域的学习需求,许多…...
K8S-etcd集群节点数据不一致的修复与恢复
1. 当etcd集群出现数据不一致时会发生什么 想象一下你正在管理一个三节点的Kubernetes集群,突然发现其中一个节点的etcd服务无法启动。这种情况就像乐队中的小提琴手突然走调,整个乐团的演奏都会受到影响。etcd作为Kubernetes的"大脑"…...
DAMOYOLO-S入门教程:如何扩展自定义类别——微调适配行业新标签
DAMOYOLO-S入门教程:如何扩展自定义类别——微调适配行业新标签 你是不是遇到过这样的问题?手头有一个很棒的通用目标检测模型,比如DAMOYOLO-S,它识别猫猫狗狗、汽车行人很在行,但你想让它帮你检测生产线上的特定零件…...
Step3-VL-10B-Base模型微调:LSTM时间序列预测实战
Step3-VL-10B-Base模型微调:LSTM时间序列预测实战 用最简单的方式,教你如何用Step3-VL-10B-Base模型做时间序列预测,无需深厚数学背景,跟着做就能上手 1. 前言:为什么选择这个模型做时间序列预测 时间序列预测是个很有…...
Pixel Fashion Atelier应用场景:像素艺术工作坊教学——青少年AI创意设计课教案
Pixel Fashion Atelier应用场景:像素艺术工作坊教学——青少年AI创意设计课教案 1. 项目概述 Pixel Fashion Atelier(像素时装锻造坊)是一款专为青少年创意教育设计的AI图像生成工具。它基于Stable Diffusion和Anything-v5技术,…...
【2026年阿里巴巴春招- 3月25日-算法岗-第二题- 该博弈了】(题目+思路+JavaC++Python解析+在线测试)
题目内容 有一个 nmnmnm 的棋盘,记第 iii<...
ROS小车导航避坑指南:move_base + AMCL + TEB 配置全流程与常见问题排查
ROS导航实战:从AMCL定位到TEB路径规划的避坑手册 当你的机器人在地图上疯狂转圈、对着墙壁直冲或者干脆拒绝移动时,导航栈的调试就变成了充满挫败感的解谜游戏。本文将带你穿越move_base、AMCL和TEB配置的迷雾森林,用工程化的排查思路解决那些…...
OpenClaw技能组合:Qwen3.5-9B串联多个插件完成复杂数据分析
OpenClaw技能组合:Qwen3.5-9B串联多个插件完成复杂数据分析 1. 当数据分析遇上自动化:我的真实需求场景 上个月我需要定期分析某电商平台的竞品价格数据,传统做法是手动导出CSV→Excel处理→制作图表→写分析报告。重复三周后我意识到&…...
UniApp微信小程序分享页的‘回家’按钮:一个getCurrentPages()的巧妙应用
UniApp微信小程序分享页的智能导航设计:基于页面栈的优雅解决方案 在移动应用生态中,微信小程序因其轻量化和社交属性获得了广泛应用。作为开发者,我们经常面临一个看似简单却影响用户体验的核心问题:当用户通过分享链接进入小程序…...
Web毕业设计效率提升指南:从脚手架选型到自动化部署的全流程优化
最近在帮学弟学妹们看毕业设计,发现大家普遍在项目初期浪费了大量时间。不是卡在环境配置,就是困在重复的脚手架搭建里,真正花在业务逻辑上的时间反而很少。今天就来聊聊,如何通过一套标准化的流程和工具,把 Web 毕业设…...
CAN总线故障诊断与维修全指南
经典CAN总线现场故障分析与诊断指南1. CAN总线故障概述1.1 常见故障现象当CAN总线系统出现传输异常时,通常会表现为多种复合故障现象,包括但不限于:仪表板显示异常车辆启动/熄火功能失效动力系统性能下降特定电控模块功能丧失这些现象的根本原…...
