[C++面试] 对通透比较器了解多少?(较少涉及,可跳过)
一、入门
1、什么是比较器
在 C++ 中,比较器是一个可调用对象(函数、函数对象或 Lambda 表达式),用于定义元素之间的比较规则。
用途:通常作为参数传递给标准库中的排序函数或关联容器,以指定元素的顺序。
std::vector<int> numbers = {5, 2, 8, 1, 9};// 使用 Lambda 表达式作为比较器进行降序排序std::sort(numbers.begin(), numbers.end(), [](int a, int b) {return a > b;});
Lambda 表达式 [](int a, int b) { return a > b; }
作为比较器传递给 std::sort
函数,用于定义降序排序规则。
2、什么是通透比较器(Transparent Comparator)
通透比较器是一种允许模板参数自动推导类型的比较器
解决泛型编程中比较器与容器元素类型严格绑定的问题(例如std::set
默认要求比较器类型与元素类型一致)
通过使用std::less<>
(C++17起默认支持通透性),可以直接比较不同类型的数据(如字符串和字符串视图),无需显式类型转换
std::set<std::string, std::less<>> s; // 使用通透比较器
s.find("hello"); // 可直接传入const char*类型,无需构造std::string
二、进阶
1、如何使用自定义的函数对象作为比较器来对自定义类型的对象进行排序?
// 定义自定义比较器函数对象
class AgeComparator {
public:bool operator()(const Person& p1, const Person& p2) const {return p1.age < p2.age;}
};
使用如下:
class Person {
public:std::string name;int age;Person(const std::string& n, int a) : name(n), age(a) {}
};int main() {std::vector<Person> people = {{"Alice", 25},{"Bob", 20},{"Charlie", 30}};// 使用自定义比较器进行排序std::sort(people.begin(), people.end(), AgeComparator());return 0;
}
2、通透比较器与传统比较函数有何区别?
- 传统比较器:需显式指定元素类型(如
std::less<std::string>
),要求参数类型严格匹配,否则需要类型转换。 - 通透比较器:通过类型透传(
operator()(const auto& a, const auto& b)
)允许模板自动推导类型,支持异构比较。例如std::less<>
可以比较std::string
和const char*
3、为什么通透比较器需要严格弱序保证?违反时可能引发哪些问题?
- 严格弱序要求:传递性(若
a < b
且b < c
,则a < c
)、反对称性(a < b
和b < a
不能同时成立)等。 - 问题示例:若比较器未满足严格弱序,
std::set
等容器可能出现元素重复或查找失败(未定义行为)
三、高阶
1、如何实现一个自定义通透比较器?核心机制是什么?
类型透传:通过模板参数推导(如operator()
的参数为通用引用)
严格弱序:确保比较逻辑满足严格弱序规则(传递性、反对称性等)
struct LengthCompare {template <typename T, typename U>bool operator()(T&& a, U&& b) const {return a.size() < b.size(); // 支持任意有size()成员的类型}
};
std::set<std::string, LengthCompare> s; // 按长度排序
2、C++20的三向比较运算符(<=>
)与通透比较器的关系是什么?
<=>
(太空船运算符)简化了比较逻辑的定义,通过返回std::strong_ordering
等类型自动生成全部比较运算符(如<
、==
)
通透比较器可与<=>
结合,例如在自定义比较器中直接调用a <=> b
实现类型透明的比较逻辑:
struct TransparentCompare {template <typename T, typename U>auto operator()(T&& a, U&& b) const -> decltype(a <=> b) {return a <=> b; // 自动推导比较结果类型}
};
3、通透比较器在模板元编程中的优化意义是什么?举例说明SFINAE如何支持通透性。
优化意义:避免模板特化冗余,通过单一模板适配多种类型。例如std::map
使用通透比较器时,find()
可接受任意可比较类型,减少运行时构造临时对象的开销。
SFINAE
(Substitution Failure Is Not An Error)替换失败并非错误,是 C++ 模板元编程的核心技术,允许编译器在模板参数替换失败时忽略该候选函数/类,而非直接报错。其核心思想是:通过编译期的条件筛选,选择最合适的模板实现。
template <typename T>
struct Compare {template <typename U>auto operator()(const T& a, const U& b) const -> decltype(a < b, std::true_type{}) { // 仅当a < b合法时启用return a < b;}
};
4、设计一个支持异构查找的容器,要求使用通透比较器和C++20特性
std::strong_ordering
是 C++20 引入的三向比较运算符(<=>
,飞船运算符)的返回类型之一,用于表示两个对象之间的严格顺序关系。它属于强序(Strong Ordering),要求比较结果满足以下特性:
- 传递性:若
a < b
且b < c
,则a < c
。- 反对称性:若
a < b
,则b > a
。- 完全性:任意两个值必须可比较(不存在无法比较的情况)
此外还有:std::weak_ordering、std::partial_ordering
#include <set>
#include <string>
#include <compare>struct HeterogeneousCompare {template <typename T, typename U>auto operator()(T&& a, U&& b) const -> std::strong_ordering {return a <=> b; // 使用三向比较运算符}
};std::set<std::string, HeterogeneousCompare> s;
s.emplace("apple");
bool exists = s.contains("apple"); // 直接传入字符串字面量
相关文章:
[C++面试] 对通透比较器了解多少?(较少涉及,可跳过)
一、入门 1、什么是比较器 在 C 中,比较器是一个可调用对象(函数、函数对象或 Lambda 表达式),用于定义元素之间的比较规则。 用途:通常作为参数传递给标准库中的排序函数或关联容器,以指定元素的顺序。…...
【高分论文密码】AI大模型和R语言的全类型科研图形绘制,从画图、标注、改图、美化、组合、排序分解科研绘图每个步骤
在科研成果竞争日益激烈的当下,「一图胜千言」已成为高水平SCI期刊的硬性门槛——数据显示很多情况的拒稿与图表质量直接相关。科研人员普遍面临的工具效率低、设计规范缺失、多维数据呈现难等痛点,因此科研绘图已成为成果撰写中的至关重要的一个环节&am…...
el-input-number添加自定义内容class-unit
在el-input,el-input-number中有需要在输入框后面添加单位的需求,这时候就需要用到class-unit <el-input-number size"small" class-unit"%" class"inputNumberClass"></el-input-number>// css .inputNumberClass[clas…...
MYSQL学习笔记(十一):MYSQL数据类型讲解
前言: 学习和使用数据库可以说是程序员必须具备能力,这里将更新关于MYSQL的使用讲解,大概应该会更新30篇,涵盖入门、进阶、高级(一些原理分析);这一篇数据类型,比较多,但是我感觉了解即可,ai时…...
【数据分享】1999—2023年我国地级市社会消费品零售总额和年末金融机构存贷款余额(Shp/Excel格式)
在之前的文章中,我们分享过基于2000-2024年《中国城市统计年鉴》整理的1999-2023年地级市的人口相关数据、染物排放和环境治理相关数据和房地产投资情况和商品房销售面积相关指标数据(均可查看之前的文章获悉详情)! 本次我们分享…...
使用 MyBatis-Plus 实现数据库的多租户管理
在现代 SaaS(软件即服务)应用中,多租户架构是一种常见的设计模式。它允许多个租户共享同一个应用实例,同时确保每个租户的数据相互隔离。MyBatis-Plus 提供了强大的多租户支持,能够帮助开发者轻松实现多租户管理。本文…...
大语言模型学习--向量数据库基础知识
1.向量 向量是多维数据空间中的一个坐标点。 向量类型 图像向量 文本向量 语音向量 Embedding 非结构化数据转换为向量过程 通过深度学习训练,将真实世界离散数据,投影到高维数据空间上,通过数据在空间中间的距离体现真实世界的相似度 V…...
计算机三级网络技术备考(5)
第七章:路由器及其配置 考点1:路由器概述及其工作原理 考点2:路由器工作模式及基础配置 考点3:路由器的接口配置 【sdh 0 2 sonet 0】 考点4:路由器的路由配置 考点5:路由器DHCP配置 考点6:…...
Java关键字与标识符
Java关键字是预定义的保留字,用于定义程序结构和语义,如if、for、class等,不能用作标识符。JDK 8有50个关键字,JDK 11引入var用于局部变量类型推断。标识符用于命名变量、类等,由字母、数字、_、$组成,不能…...
生活小妙招之UE ViewPortUV-SceneTextureUV
后处理材质customNode中写SceneTextureLookup遇到了一些问题,做做记录 比如要在custom中写一个普通的镜像模糊,脑子都不带转的上来就直接这么写了,像是顺理成章的就应该这么写,并且网上随便搜UE咋写镜像模糊估计都是这样式的。 但…...
FB投广探秘:为何Facebook广告账户不消耗
在Facebook上投放广告时,您是否遇到过这种情况:广告创建完成后却发现账户没消耗,广告没跑出去?为什么会遇到这种情况?小编将结合最新行业动态,为你解析广告为何无消耗。 一、原因解析 1、账户余额不足 最直接的原因往往最容易被忽视。若…...
亚信安全发布第七期《勒索家族和勒索事件监控报告》
本周态势快速感知 本周全球共监测到勒索事件121起,与上周相比,勒索事件数量大幅下降,仍需注意防范。从整体上看Clop是影响最严重的勒索家族;本周Ransomhub和Akira也是活动频繁的两个恶意家族,需要注意防范。本周&…...
flask实现mvc模式
Flask 默认是一个轻量级框架,并不强制使用 MVC 模式,但我们可以按照 MVC 结构来组织代码,使项目更加清晰和可维护。 Flask 实现 MVC 模式 Flask 本身并没有严格的 Controller 层,但我们可以通过 视图函数(View Functi…...
基于LabVIEW的脚本化子VI动态生成
该示例展示了一种利用LabVIEW VI脚本(VI Scripting)技术,通过程序化方式动态生成并替换子VI的解决方案。核心逻辑为:基于预定义的模板VI,根据用户选择的数学操作(加法或乘法),自动生…...
Linux 网络:skb 数据管理
文章目录 1. 前言2. skb 数据管理2.1 初始化2.2 数据的插入2.2.1 在头部插入数据2.2.2 在尾部插入数据 2.2 数据的移除 3. 小结 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. skb 数据管理 数…...
golang坐标转换 gomap3d库
gomap3d Go语言实现的多坐标系转换库,支持天文学/航天领域常用坐标系转换 基础算子支持c gomap3d 特性 支持5种坐标系互转: 站心坐标系 (AER)东北天坐标系 (ENU)地心地固坐标系 (ECEF)地心惯性坐标系 (ECI)大地坐标系 (LLA) 支持多种参考椭球体&#…...
电脑的常见问题的原因+解决方法
电脑常见问题涵盖软件和硬件两方面,以下是一些常见问题及解决方法: 软件问题 系统运行缓慢 原因:可能是开机启动项过多、系统垃圾文件堆积、病毒或恶意软件入侵、硬件驱动不兼容等。解决方法:利用系统自带的任务管理器或第三方软…...
JavaScript性能优化实战:从8s到0.8s的极致提升
摘要:页面卡顿、内存泄漏、CPU爆满?本文通过6个真实场景+可运行代码示例,手把手教你掌握JS性能优化核心技术!涵盖防抖节流、虚拟滚动、Web Workers、内存泄漏排查等高频痛点解决方案,最后提供Chrome性能分析工具实战指南,助你打造丝滑的Web应用! 一、性…...
英语学习(GitHub学到的分享)
【英语语法:https://github.com/hzpt-inet-club/english-note】 【离谱的英语学习指南:https://github.com/byoungd/English-level-up-tips/tree/master】 【很喜欢文中的一句话:如果我轻轻松松的学习,生活的幸福指数会提高很多…...
OTP单片机调试工具之—应广单片机ADC调试案例
上一篇文章说到了‘OTP单片机调试工具’的大概使用方法,现在做一个案例来说明情况。 这个案例是使用应广单片机ADC对可调电阻中间抽头电压值进行采样,分别用12bit和8bit进行显示,使用vdd做参考,采样数据没有进行滤波,通…...
Java基础关键_020_集合(四)
目 录 一、Set 集合 二、Map 集合 1.概览 2.说明 3.HashMap 说明 4.LinkedHashMap 说明 5.TreeMap 说明 6.Hashtable 说明 7.Properties 说明 三、Map 接口常用方法 1.put(K key, V value) 和 putAll(Map m) 2.get(Object key) 3.clear() 和 size() 4.contains…...
电商数据分析 电商平台销售数据分析 电商平台数据库设计 揭秘电商怎么做数据分析
《电商参谋数据分析平台方案》(28页PPT)是一套为电商行业量身定制的一体化解决方案,它通过全链路打通从数据获取到分析的全过程,帮助电商企业实现精细化运营和市场机会的挖掘。该方案针对电商行业在数据获取、加工整合及业务赋能方…...
Hugging Face的Transformers核心模块:Pipelines(参数说明,各种模型类型调用案例)
如果电脑配置不够可以参考文章《学AI-撸羊毛-免费GPU服务器-kaggle-每周30小时-可以进行数据训练,大模型微调》 申请免费服务器执行代码。 什么是Pipelines 将数据预处理、模型调用、结果后处理三部分组装成的流水线使我们能够直接输入文本便获得最终的答案 Pipeli…...
ChatGPT辅助学术写作有哪些挑战?怎么解决?
宝子们毕业之前需要完成的学术论文往往是学生时代最后一项挑战。无论宝子们对此过程多么熟悉,每次着手写新论文时,似乎都需重新规划、从头开始。 值得庆幸的是,借助ChatGPT、DeepSeek这些工具能够为论文旅程提供有力支持。ChatGPT作为备受推崇…...
【MySQL是怎么运行的】二、索引
引擎层有支持索引,如InnoDB和MyISAM,区别就是InnoDB支持事务、外键和行锁 索引物理结构 页:一页16KB,一页包含了多行记录 行:包含元数据和真实数据 元数据: record_type(记录的类型ÿ…...
MySQL中有哪些索引
1,B-Tree索引:常见的索引类型 2,哈希索引:基于哈希表实现,只支持等值查询 ,只有Memory存储引擎和NDB Cluster存储引擎显示支持哈希索引 3,全文索引:可在字符列上创建(T…...
Node.js中HTTPS模块应用详解
1. HTTPS 模块的概念 HTTPS(Hypertext Transfer Protocol Secure)是 HTTP 的安全版本,通过 SSL/TLS 协议对数据进行加密,确保数据在传输过程中不被窃取或篡改。在 Node.js 中,https 模块提供了创建 HTTPS 服务器和客户…...
facebook游戏投广:提高广告关键数据的方法
在当今竞争激烈的数字营销领域,游戏广告的投放效果直接关系到游戏公司的市场表现和盈利能力。然而,许多游戏公司在广告投放上面临着诸多挑战,如高昂的成本、低效的转化率以及难以追踪的效果。那么,如何才能通过数据分析真正提升游…...
每天五分钟深度学习框架PyTorch:ResNet算法模型完成CAFIR十分类
本文重点 ResNet模型已经搭建完成了,本文我们使用ResNet来跑一下CAFIR10的数据集,看一下分类效果如何? 代码 本文总结 在之前的课程中我们对残差块以及ResNet模型进行了详细的介绍,并且我们对模型训练这些基础的数据集进行了详…...
Python中很常用的100个函数整理
Python 内置函数提供了强大的工具,涵盖数据处理、数学运算、迭代控制、类型转换等。本文总结了 100 个常用内置函数,并配备示例代码,提高编程效率。 1. abs() 取绝对值 print(abs(-10)) # 10 2. all() 判断所有元素是否为真 print(all([…...
nginx与openSSL版本不兼容问题
本人先前使用的nginx-version为1.18.0,openSSL-version为3.0.2; 在源码的安装configure过程中,出现以下报错 error: ‘ENGINE_free’ is deprecated: Since OpenSSL 3.0 [-Werrordeprecated-declarations]734 | ENGINE_free(en…...
【RabbitMQ】事务
事务的简单配置及使用 配置事务管理器声明队列生产者代码测试 RabbitMQ是基于AMQP协议实现的,该协议实现了事务机制,因此RabbitMQ也支持事务机制. SpringAMQP也提供了对事务相关的操作.RabbitMQ事务允许开发者确保消息的发送和接收是原子性的,…...
【C#学习笔记03】进制转换与反码、补码、原码
1. 进制转换 计算机中的数据通常以二进制形式存储,但在编程和调试过程中,我们经常需要与十进制、八进制和十六进制打交道。因此,掌握进制转换是C语言学习中的重要一环。 1.1 进制的基本概念 二进制(Binary)ÿ…...
线性搜索算法
何时使用线性搜索算法? 当处理一个小数据集时。当搜索存储在连续内存中的数据集时。 线性搜索算法在什么情况下优于其他搜索算法? 当列表或数组未排序时,或者当输入的大小相对较小时,首选线性搜索算法。它易于实现,并…...
基于深度文档理解的开源 RAG 引擎RAGFlow的介绍和安装
目录 前言1. RAGFlow 简介1.1 什么是 RAGFlow?1.2 RAGFlow 的核心特点 2. RAGFlow 的安装与配置2.1 硬件与软件要求2.2 下载 RAGFlow 源码2.3 源码编译 Docker 镜像2.4 设置完整版(包含 embedding 模型)2.5 运行 RAGFlow 3. RAGFlow 的应用场…...
蓝桥杯—走迷宫(BFS算法)
题目描述 给定一个NM 的网格迷宫 G。G 的每个格子要么是道路,要么是障碍物(道路用 11表示,障碍物用 0 表示)。 已知迷宫的入口位置为 (x1,y1),出口位置为 (x2,y2)。问从入口走到出口,最少要走多少…...
基于云函数的自习室预约微信小程序+LW示例参考
全阶段全种类学习资源,内涵少儿、小学、初中、高中、大学、专升本、考研、四六级、建造师、法考、网赚技巧、毕业设计等,持续更新~ 文章目录 [TOC](文章目录) 1.项目介绍2.项目部署3.项目部分截图4.获取方式 1.项目介绍 技术栈工具:云数据库…...
Flutter 学习之旅 之 flutter 不使用插件,实现简单带加载动画的 LoadingToast 功能
Flutter 学习之旅 之 flutter 不使用插件,实现简单带加载动画的 LoadingToast 功能 目录 Flutter 学习之旅 之 flutter 不使用插件,实现简单带加载动画的 LoadingToast 功能 一、简单介绍 二、LoadingToast 三、简单案例实现 四、关键代码 一、简单…...
GStreamer —— 2.17、Windows下Qt加载GStreamer库后运行 - “播放教程 5:色彩平衡“(附:完整源码)
运行效果 介绍 亮度、对比度、色相和饱和度是常见的视频调整, 在 GStreamer 中统称为 Color Balance 设置。 本教程展示了: • 如何找出可用的色彩平衡通道 • 如何更改它们 允许访问颜色平衡设置。如果 元素支持这个接口,只需将其转发给应用…...
在wsl2中安装ubuntu
Linux 是操作系统内核,Ubuntu 是基于Linux的发行版。 虚拟机 是运行操作系统的虚拟环境,可以在物理机上运行多个操作系统,包括Linux和Ubuntu。 1:启用 WSL 功能 以管理员身份打开 PowerShell。(winR,输入powershell&…...
SPFA算法——负权图且没有负环
SPFA算法其实是对Bellman-ford算法的优化,Bellman-ford算法更新最短路是采用的是遍历每一条边,找到最短的边进行更新d[v]min(d[v],d[u]w(u,v)),由 d[v]min(d[v],d[u]w(u,v))可知只有当 d[ u ]变小时才有可能更新,所以用一个队列存…...
5G基本概念
作者:私语茶馆 1. 5G应用场景概述 1.1.5G应用场景 ITU域2015年定义了三大应用场景:eMBB(增强型移动宽带)、uRLLC(低时延高可靠通信)、mMTC(海量物联网通信); emBB:Enhanced Mobile Broadband ,移动互联网应用,是4G MBB(移动宽带)的升级,主要侧重于网络速率、带…...
conda 安装软件报错 Found conflicts! Looking for incompatible packages.
问题描述: 利用 conda 安装某包 conda install -c "nvidia/label/cuda-11.8.0" cuda-nvcc时发现报错: Collecting package metadata (current_repodata.json): done Solving environment: failed with initial frozen solve. Retrying with…...
PySide(PyQT),QGraphicsItem的pos()和scenePos()区别
在QGraphicsItem中,pos()和scenePos()是两个重要的方法,用于描述图形项的位置,但它们的含义和用途有所不同。理解它们的区别对于正确操作和管理QGraphicsItem的位置至关重要。 1. pos()方法 • 定义:pos()返回的是QGraphicsItem在…...
【每日八股】计算机网络篇(四):HTTP
目录 HTTP 与 HTTPS 的区别?HTTPS 加密与认证的过程?ClientHelloServerHello客户端回应服务端回应 HTTPS 一定安全可靠吗?HTTPS 状态码的含义?HTTP 缓存有哪些实现方式?HTTP 1.0、HTTP 1.1、HTTP 2.0 和 HTTP 3.0 的区…...
基于python下载ERA5小时尺度和月尺度的数据
前言:由于ERA5网站的更新,原始的代码都无法使用,这里将会提供下载小时尺度和月尺度的代码。 一、前期的工作 需要重新在ERA5网站上注册新的账号(ERA5网站)。然后在User guide里,选择API,将代码…...
【一起学Rust | Tauri2.0框架】基于 Rust 与 Tauri 2.0 框架实现软件开机自启
文章目录 前言 一、准备工作1.1 环境搭建1.2 创建 Tauri 项目1.3 添加依赖 二、实现开机自启的基本原理2.1 开机自启的基本概念2.2 Tauri 应用的生命周期 三、Windows 平台实现3.1 Windows 注册表机制3.2 实现步骤3.3 注意事项 四、Linux 平台实现4.1 Linux systemd 服务4.2 实…...
C++20 模块:告别头文件,迎接现代化的模块系统
文章目录 引言一、C20模块简介1.1 传统头文件的局限性1.2 模块的出现 二、模块的基本概念2.1 模块声明2.2 模块接口单元2.3 模块实现单元 三、模块的优势3.1 编译时间大幅减少3.2 更好的依赖管理3.3 命名空间隔离 四、如何使用C20模块4.1 编译器支持4.2 示例项目4.3 编译和运行…...
【技海登峰】Kafka漫谈系列(五)Java客户端之生产者Producer核心组件与实现原理剖析
【技海登峰】Kafka漫谈系列(五)Java客户端之生产者Producer核心组件与实现原理剖析 向Kafka Broker服务节点中发送主题消息数据的应用程序被称为生产者,生产者与消费者均属于Kafka客户端,几乎所有主流语言都支持调用客户端API。官方提供了基于Java实现的kafka-clients,用于…...
java-单列模式-final-枚举
内存存储区域 引用变量和普通变量引用变量放在栈中,基本数据类型的内容是在堆内存中。 对象放在堆内存中,其引用变量放在栈中,指向堆内存存放对象的地址。 静态变量放在静态区中,静态变量在程序的执行始中中分配一次,…...