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

2024-02-06 09:52

本文主要是介绍C++函数对象-运算符函数对象 - 比较 - 实现 x > y 的函数对象 (std::greater),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

运算符函数对象

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

比较

实现 x > y 的函数对象

std::greater

template< class T >
struct greater;

(C++14 前)

template< class T = void >
struct greater;

(C++14 起)

实现比较的函数对象。调用类型 T 上的 operator> ,除非特化。

特化

std::greater 的特化为任何指针类型产生严格全序,即使内建的 operator> 不如此。严格全序在 std::less 、 std::greater 、 std::less_equal 和 std::greater_equal 对该指针类型的特化间一致,且亦与对应的内建运算符( <><=>= )所强加的部分顺序一致。

若特化 std::greater<void> 的函数调用运算符调用内建运算符比较指针,则它产生严格全序,即使内建的 operator> 不如此。此严格全序在特化 std::less<void>std::greater<void>std::less_equal<void>std::greater_equal<void> 间一致,亦与对应的内建运算符所强加的部分顺序一致。

(C++14 起)

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

greater<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::greater::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;}friend bool operator !=(const Cell &cell1, const Cell &cell2){return cell1.x != cell2.x && cell1.y != cell2.y;}friend bool operator <(const Cell &cell1, const Cell &cell2){if (cell1.x == cell2.x){return cell1.y < cell2.y;}else{return cell1.x < cell2.x;}}friend bool operator >(const Cell &cell1, const Cell &cell2){if (cell1.x == cell2.x){return cell1.y > cell2.y;}else{return cell1.x > cell2.x;}}
};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::greater<int*>()(1023, 1024):        "<< std::greater<int*>()(ptr, nullptr) << std::endl;std::cout << "std::greater<char>()(50, 2):             "<< std::greater<char>()(50, 2) << std::endl;std::cout << "std::greater<char>()('a', 97):           "<< std::greater<char>()('a', 97) << std::endl;std::cout << "std::greater<int>()(1023, 1024):         "<< std::greater<int>()(1023, 1024) << std::endl;std::cout << "std::greater<long>()(1023, 1024):        "<< std::greater<long>()(1023, 1024) << std::endl;std::cout << "std::greater<long long>()(1023, 1024):   "<< std::greater<long long>()(1023, 1024) << std::endl;std::cout << "std::greater<uint8_t>()(1023, 1024):     "<< std::greater<uint8_t>()(8, 32) << std::endl;std::cout << "std::greater<uint16_t>()(123, 456):      "<< std::greater<uint16_t>()(123, 456) << std::endl;std::cout << "std::greater<uint32_t>()(101, 202):      "<< std::greater<uint32_t>()(101, 202) << std::endl;std::cout << "std::greater<uint64_t>()(10230, 10240):  "<< std::greater<uint64_t>()(10230, 10240) << std::endl;std::cout << "std::greater<int8_t>()(1023, 1024):      "<< std::greater<int8_t>()(8, 32) << std::endl;std::cout << "std::greater<int16_t>()(123, 456):       "<< std::greater<int16_t>()(123, 456) << std::endl;std::cout << "std::greater<int32_t>()(101, 202):       "<< std::greater<int32_t>()(101, 202) << std::endl;std::cout << "std::greater<int64_t>()(10230, 10240):   "<< std::greater<int64_t>()(10230, 10240) << std::endl;std::cout << "std::greater<double>()(3.14, 3.14):      "<< std::greater<double>()(3.14, 3.14) << std::endl;std::cout << "std::greater<float>()(3.14, 3.14):       "<< std::greater<float>()(3.14, 3.14) << std::endl;std::cout << "std::greater<float>()(3, 3):             "<< std::greater<float>()(3, 3) << std::endl;std::cout << "std::greater<float>()(3.56, 3.14):       "<< std::greater<float>()(3.56, 3.14) << std::endl;std::cout << "std::greater<int>()(3.14, 3.14):         "<< std::greater<int>()(3.34, 3.34) << std::endl;std::cout << "std::greater<Cell>()(Cell{101, 101}, Cell{202, 202}):       "<< std::greater<Cell>()(Cell{101, 101}, Cell{202, 202}) << std::endl;std::cout << "std::greater<std::string>()(\"I am a \", \"handsome programmer\"):"<< std::greater<std::string>()("I am a ", "handsome programmer") << std::endl;return 0;
}

输出

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

这篇关于C++函数对象-运算符函数对象 - 比较 - 实现 x > y 的函数对象 (std::greater)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/683933

相关文章

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo