【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不仅关乎产品的物料计划、采购、库存控制及物流协调,还直接影响到企业的生产效率、成本控制以及市场竞争力。面对这一专业领域的学习需求,许多…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...