C++函数对象-运算符函数对象 - 比较 - 实现 x == y 的函数对象(std::equal_to)

任何定义了函数调用操作符的对象都是函数对象。C++ 支持创建、操作新的函数对象,同时也提供了许多内置的函数对象。

运算符函数对象

C++ 针对常用的算术和逻辑运算定义了很多函数对象:

比较

实现 x == y 的函数对象

std::equal_to

template< class T >
struct equal_to;

(C++14 前)

template< class T = void >
struct equal_to;

(C++14 起)

进行比较的函数对象。调用类型 T 上的 operator== ,除非特化。

进行比较的函数对象。调用类型 T 上的 operator== ,除非特化。

特化

标准库提供 std::equal_to 在未指定 T 时的特化,这使得参数类型和返回类型留待推导。

equal_to<void>

实现 x == y 并推导参数和返回类型的函数对象
(类模板特化)
(C++14 起)

成员类型

类型定义
result_type(C++17 中弃用)bool
first_argument_type(C++17 中弃用)T
second_argument_type(C++17 中弃用)T
(C++20 前)

 

成员函数

operator()

检查参数是否相等
(公开成员函数)

 

std::equal_to::operator()

bool operator()( const T& lhs, const T& rhs ) const;

(C++14 前)

constexpr bool operator()( const T& lhs, const T& rhs ) const;

(C++14 起)

检查 lhs 是否等于 rhs

参数

lhs, rhs-要比较的值

返回值

若 lhs == rhs 则为 true ,否则为 false 。

异常

(无)

可能的实现

constexpr bool operator()(const T &lhs, const T &rhs) const 
{return lhs == rhs;
}

调用示例

#include <iostream>
#include <functional>struct Cell
{int x;int y;Cell() = default;Cell(int a, int b): x(a), y(b) {}Cell(const Cell &cell){x = cell.x;y = cell.y;}bool operator <(const Cell &cell) const{if (x == cell.x){return y < cell.y;}else{return x < cell.x;}}Cell &operator+(const Cell &cell){x += cell.x;y += cell.y;return *this;}Cell &operator+=(const Cell &cell){x += cell.x;y += cell.y;return *this;}Cell &operator*=(int n){x *= n;y *= n;return *this;}Cell &operator++(){x += 1;y += 1;return *this;}friend Cell operator +(const Cell &cell1, const Cell &cell2){Cell cell = cell1;cell += cell2;return cell;}friend Cell operator *(const Cell &cell1, const Cell &cell2){Cell cell = {cell1.x * cell2.x, cell1.y * cell2.y};return cell;}friend Cell operator /(const Cell &cell1, const Cell &cell2){Cell cell = {cell1.x / cell2.x, cell1.y / cell2.y};return cell;}friend Cell operator %(const Cell &cell1, const Cell &cell2){Cell cell = {cell1.x % cell2.x, cell1.y % cell2.y};return cell;}friend bool operator ==(const Cell &cell1, const Cell &cell2){return cell1.x == cell2.x && cell1.y == cell2.y;}
};std::ostream &operator<<(std::ostream &os, const Cell &cell)
{os << "{" << cell.x << "," << cell.y << "}";return os;
}int main()
{std::cout << std::boolalpha;int *ptr = nullptr;std::cout << "std::equal_to<int*>()(1023, 1024):        "<< std::equal_to<int*>()(ptr, nullptr) << std::endl;std::cout << "std::equal_to<char>()(50, 2):             "<< std::equal_to<char>()(50, 2) << std::endl;std::cout << "std::equal_to<char>()('a', 97):           "<< std::equal_to<char>()('a', 97) << std::endl;std::cout << "std::equal_to<int>()(1023, 1024):         "<< std::equal_to<int>()(1023, 1024) << std::endl;std::cout << "std::equal_to<long>()(1023, 1024):        "<< std::equal_to<long>()(1023, 1024) << std::endl;std::cout << "std::equal_to<long long>()(1023, 1024):   "<< std::equal_to<long long>()(1023, 1024) << std::endl;std::cout << "std::equal_to<uint8_t>()(1023, 1024):     "<< std::equal_to<uint8_t>()(8, 32) << std::endl;std::cout << "std::equal_to<uint16_t>()(123, 456):      "<< std::equal_to<uint16_t>()(123, 456) << std::endl;std::cout << "std::equal_to<uint32_t>()(101, 202):      "<< std::equal_to<uint32_t>()(101, 202) << std::endl;std::cout << "std::equal_to<uint64_t>()(10230, 10240):  "<< std::equal_to<uint64_t>()(10230, 10240) << std::endl;std::cout << "std::equal_to<int8_t>()(1023, 1024):      "<< std::equal_to<int8_t>()(8, 32) << std::endl;std::cout << "std::equal_to<int16_t>()(123, 456):       "<< std::equal_to<int16_t>()(123, 456) << std::endl;std::cout << "std::equal_to<int32_t>()(101, 202):       "<< std::equal_to<int32_t>()(101, 202) << std::endl;std::cout << "std::equal_to<int64_t>()(10230, 10240):   "<< std::equal_to<int64_t>()(10230, 10240) << std::endl;std::cout << "std::equal_to<double>()(3.14, 3.14):      "<< std::equal_to<double>()(3.14, 3.14) << std::endl;std::cout << "std::equal_to<float>()(3.14, 3.14):       "<< std::equal_to<float>()(3.14, 3.14) << std::endl;std::cout << "std::equal_to<float>()(3, 3):             "<< std::equal_to<float>()(3, 3) << std::endl;std::cout << "std::equal_to<float>()(3.56, 3.14):       "<< std::equal_to<float>()(3.56, 3.14) << std::endl;std::cout << "std::equal_to<int>()(3.14, 3.14):         "<< std::equal_to<int>()(3.34, 3.34) << std::endl;std::cout << "std::equal_to<Cell>()(Cell{101, 101}, Cell{202, 202}):       "<< std::equal_to<Cell>()(Cell{101, 101}, Cell{202, 202}) << std::endl;std::cout << "std::equal_to<std::string>()(\"I am a \", \"handsome programmer\"):"<< std::equal_to<std::string>()("I am a ", "handsome programmer") << std::endl;return 0;
}

输出

std::equal_to<int*>()(1023, 1024):        true
std::equal_to<char>()(50, 2):             false
std::equal_to<char>()('a', 97):           true
std::equal_to<int>()(1023, 1024):         false
std::equal_to<long>()(1023, 1024):        false
std::equal_to<long long>()(1023, 1024):   false
std::equal_to<uint8_t>()(1023, 1024):     false
std::equal_to<uint16_t>()(123, 456):      false
std::equal_to<uint32_t>()(101, 202):      false
std::equal_to<uint64_t>()(10230, 10240):  false
std::equal_to<int8_t>()(1023, 1024):      false
std::equal_to<int16_t>()(123, 456):       false
std::equal_to<int32_t>()(101, 202):       false
std::equal_to<int64_t>()(10230, 10240):   false
std::equal_to<double>()(3.14, 3.14):      true
std::equal_to<float>()(3.14, 3.14):       true
std::equal_to<float>()(3, 3):             true
std::equal_to<float>()(3.56, 3.14):       false
std::equal_to<int>()(3.14, 3.14):         true
std::equal_to<Cell>()(Cell{101, 101}, Cell{202, 202}):       false
std::equal_to<std::string>()("I am a ", "handsome programmer"):false

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

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

相关文章

DelayQueue的使用

具体思路&#xff1a; 在容器初始化的时候就创建出一个 延迟队列 然后项目启动后随即启动一个线程一直监听这个队列 手动调用接口往队列中添加任务 依赖 一个最简单的web的应用即可项目文件结构 第一步&#xff1a;在项目启动的时候就创建出一个延迟队列 Configuration publ…

小程序定制开发前,应该考虑些什么?

引言 在移动互联网时代&#xff0c;小程序已经成为许多企业和个人推广业务、提供服务的理想平台。然而&#xff0c;在进行小程序定制开发之前&#xff0c;开发者和业务方需要细致入微地考虑一系列关键因素&#xff0c;以确保最终的小程序既能满足用户需求&#xff0c;又能够顺…

PHP入门指南:起步篇

PHP入门指南&#xff1a;起步篇 PHP入门指南&#xff1a;起步篇什么是PHP&#xff1f;PHP 的优点PHP 开发环境搭建选择本地服务器软件包安装PHP环境配置Web服务器和PHP测试PHP安装 第一个PHP脚本PHP基础语法标记注释变量数据类型常量条件语句循环函数 PHP入门指南&#xff1a;起…

Oracle Server一台价值百万的服务器内存更换过程

数据库代码敲多了&#xff0c;看乏了吧&#xff01; 带各位DBA看看你们的数据库运行在什么样的硬件上。 1、故障现象 事发时2号位置报警 登录ILO发现内存报警 查看详细信息 查看详细报警 2、关于ORACLE 服务器DIMM 备用 默认情况下在 Oracle ILOM 中启用 DIMM 备用。由 DIMM 提…

[linux] kolla-ansible 部署的openstack 修改mariadb默认端口号

kolla-ansible 部署前修改global.yml #freezer_database_backend: "mariadb" database_port: 9306 mariadb_port: 9306如果已经部署成功&#xff0c;直接修改配置文件里的端口号重启是没有用的&#xff0c;怀疑内部做了缓存&#xff0c;查看openstack 使用的memcach…

yarn/npm certificate has expired

目录 报错 原因&#xff1a;HTTPS 证书验证失败 方法 a.检查网络安全软件&#xff1a;可能会拦截或修改 HTTPS 流量 b.strict-ssl:false关闭验证【临时方法】 报错 info No lockfile found. [1/4] Resolving packages... error Error: certificate has expired at TLS…

Java类的继承

XHTMLMapper继承 XWPFDocumentVisitor&#xff1a; 由于endVisitTableCell是抽象方法&#xff0c;XHTMLMapper中必须要实现&#xff1b; existErr()子类是否重写都是自由的&#xff1b; public abstract class XWPFDocumentVisitor<T, O extends Options, E extends IXWPFM…

Unity类银河恶魔城学习记录1-12 PlayerComboAttack源代码 P39

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili PlayerPrimaryAttack.cs using System.Collections; using System.Collect…

实时语音转写的前端实现方案

// 创建一个音频上下文 const audioContext new (window.AudioContext || window.webkitAudioContext)(); // 创建一个MediaStreamSourceNode&#xff0c;用于获取用户的麦克风输入 navigator.mediaDevices.getUserMedia({ audio: true }) .then(stream > { const m…

音箱、功放播放HDMI音频解决方案之HDMI音频分离器HHA

HDMI音频分离器HHA简介 HDMI音频分离器HHA具有一路HDMI信号输入&#xff0c;转换成一路HDMI信号、一路5.1光纤音频信号、一路5.1 SPDIF/同轴音频信号和一路模拟左右声道立体声信号输出&#xff0c;同时还支持EDID存储及兼容HDCP功能&#xff1b;分辨率最高支持1920*1080p&#…

国产软件很流氓?4款没有广告的黑科技软件,白嫖党有福了

提到国产软件&#xff0c;许多人可能会想到一些负面的标签&#xff0c;如“流氓、捆绑、广告多”。然而&#xff0c;事实上&#xff0c;国内也有许多良心软件&#xff0c;不仅功能强大&#xff0c;而且完全免费。 1、原本&#xff08;图片处理神器&#xff09; 在日常生活中和…

国内最全的Spring Boot系列之七

• 阿里巴巴前高级研发工程师 • 三家千万级互联网企业技术顾问 • MBTI/盖洛普技术专家 • 厦门某高校外聘教师 • 51CTO特约合作讲师 • 网易云课堂签约讲师 •《深入理解设计模式》作者 一转眼马上要过年了&#xff0c;回首2023年&#xff0c;感觉自己无所事事、碌碌无…

[SWPUCTF 2021 新生赛]ez_unserialize

根据下面的user_agent和Disallow可以判断这个是在robots.txt 我们看的出来这是一个反序列化需要我们adminadmin passwdctf construct 构造方法&#xff0c;当一个对象被创建时调用此方法&#xff0c;不过unserialize()时却不会被调用 destruct 析构方法&#xff0c;PHP将在对象…

可以讲讲Flink的优化吗,具体以项目中某个例子举例一下?

优化的话&#xff1a;可以参考下面几点 GC的配置 &#xff08;1&#xff09;调整老年代与新生代的比值 或者 更换垃圾收集器 &#xff08;2&#xff09;增加JVM内存数据倾斜 &#xff08;1&#xff09;需要重新设计key&#xff0c;以更小粒度的key使得task大小合理化。 &…

jQuery---移除元素属性

介绍 使用jQuery移除元素的属性。 示例 $(".optBtn").removeAttr(disabled);

FastCAE合作开发项目更新:OpenFOAM求解器集成

开发内容 1. 参数化建模&#xff0c;可根据模型参数、块参数、样条参数生成前处理模型并进行三维展示 2. 前处理网格生成&#xff0c;可根据流域参数生成二维面网格或三维体网格&#xff0c;可调节网格基本尺寸&#xff0c;可设置生成棱柱层及棱柱层参数&#xff0c;网格加密…

Vulnhub靶机:hacksudo2 (HackDudo)

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;hacksudo2 (HackDudo)&#xff08;10.0.2.44&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnh…

【Win10下实现开机Jar启动的CICD自动化流程】

目录 在Win10下实现开机Jar启动的CICD自动化流程,可以按照以下步骤进行操作:在Win10下实现开机Jar启动的CICD自动化流程,可以按照以下步骤进行操作: 安装Java环境:确保你的计算机上已经安装Java环境,可以通过命令行运行java -version来验证Java环境是否已安装。 编写启动…

DS:时间复杂度和空间复杂度

创作不易&#xff0c;感谢三连&#xff01; 一、算法 1.1 什么是算法 算法(Algorithm):就是定义良好的计算过程&#xff0c;他取一个或一组的值为输入&#xff0c;并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤&#xff0c;用来将输入数据转化成输出结果。…

Qt---资源文件添加

Qt—资源文件添加 Qt 资源系统是一个跨平台的资源机制&#xff0c;用于将程序运行时所需要的资源以二进制的形式存储于可执行文件内部。如果编写的程序需要加载特定的资源&#xff0c;那么将其放置在资源文件中&#xff0c;便不需要担心文件的缺失。 1 需求 为菜单栏设置图标&…