文章目录
- 一、预定义函数对象
- 1、预定义函数对象概念
- 2、预定义函数对象组成
- 二、预定义函数对象分类
- 1、预定义 算术运算符 函数对象
- 2、预定义 比较运算符 函数对象
- 3、预定义 逻辑运算符 函数对象
- 三、代码示例 - plus 函数对象使用
- 1、plus 函数对象
- 2、代码示例
- 3、执行结果
一、预定义函数对象
1、预定义函数对象概念
C 的 标准模板库 ( STL , Standard Template Library ) 中 , 预定义了一系列的 " 函数对象 “ , 又称为 ” 仿函数 Functors " ;
这些 " 预定义函数对象 " 在 STL 算法中 , 可以 作为 算法的参数 , 定制某些参数的行为 , 如 :
- for_each 遍历算法中 , 传入 " 一元函数对象 " , 用于执行单个元素的遍历操作 ;
- find_if 查找算法中 , 传入 " 一元谓词 " , 用于判定某个元素是否符合查找规则 ;
- transform 变换算法中 , 传入 " 二元函数对象 " , 用于将 2 个范围的元素进行变换操作 ;
- sort 排序算法中 , 传入 " 二元谓词 " , 用于判定 2 个元素之间的 排序规则 ;
2、预定义函数对象组成
预定义 函数对象 , 是由 调用操作符 和 T 泛型类型 组合使用的 , 以 plus<T>
为例 ,
- plus 表示这是 " 预定义 算术运算符 函数对象 " ;
- T 泛型类型 表示 该函数对象 执行的是 什么类型 的操作 ,
- 如果 T 为 int , 则表示 两个 int 整型值 进行加法操作 ;
- 如果 T 为 string , 则表示 两个 string 字符串 进行加法操作 ;
二、预定义函数对象分类
预定义函数对象 分为 如下几类 :
- 预定义 算术运算符 函数对象
- 预定义 比较运算符 函数对象
- 预定义 逻辑运算符 函数对象
1、预定义 算术运算符 函数对象
预定义 算术运算符 函数对象 :
- plus<T> : 加法运算 ;
- minus<T> : 减法运算 ;
- multiplies<T> : 乘法运算 ;
- divides<T> : 除法运算 ;
- modulus<T> : 取模运算 ;
上述 " 预定义 算术运算符 函数对象 " 都是 二元函数对象 , 通常用于 transform 变换算法 , accumulate 累加和算法 , 等算法中 ;
2、预定义 比较运算符 函数对象
预定义 比较运算符 函数对象 :
- equal_to<T> : 判断两个值是否相等 ;
- not_equal_to<T> : 判断两个值是否不相等 ;
- greater<T> : 判断第一个值是否大于第二个值 ;
- less<T> : 判断第一个值是否小于第二个值 ;
- greater_equal<T> : 判断第一个值是否大于或等于第二个值 ;
- less_equal<T> : 判断第一个值是否小于或等于第二个值 ;
这些 函数对象 都是 二元谓词 , 通常用于 sort 排序算法 , find_if 查找算法 等算法中 ;
3、预定义 逻辑运算符 函数对象
预定义 逻辑运算符 函数对象 :
- logical_and<T> : 逻辑与运算 ;
- logical_or<T> : 逻辑或运算 ;
- logical_not<T> : 执行逻辑非运算 ; logical_not 函数对象 通常不直接用于算法中 , 而是用于构造其他函数对象 ;
三、代码示例 - plus 函数对象使用
1、plus 函数对象
plus 函数对象原型如下 :
代码语言:javascript复制// STRUCT TEMPLATE plus
template <class _Ty = void>
struct plus {
_CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty first_argument_type;
_CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty second_argument_type;
_CXX17_DEPRECATE_ADAPTOR_TYPEDEFS typedef _Ty result_type;
constexpr _Ty operator()(const _Ty& _Left, const _Ty& _Right) const {
return _Left _Right;
}
};
其重载的 " 函数调用操作符 () " 函数原型如下 :
代码语言:javascript复制 constexpr _Ty operator()(const _Ty& _Left, const _Ty& _Right) const {
return _Left _Right;
}
上述函数 , 接收 2 个 T 类型函数 , 将这两个函数相加 , 并返回相加的结果 ;
2、代码示例
代码示例 :
代码语言:javascript复制#include "iostream"
using namespace std;
#include <vector>
#include <algorithm>
#include "functional"
int main() {
// I . int 类型相加
// 创建 plus 函数对象实例
plus<int> intPlus;
// 定义传入 plus 函数对象的参数
int a = 222;
int b = 666;
// 执行 plus 函数对象
int c = intPlus(a, b);
// 打印 plus 函数对象执行结果
cout << "c = " << c << endl;
// II . string 类型相加
// 创建 plus 函数对象实例
plus<string> stringPlus;
// 定义传入 plus 函数对象的参数
string s1 = "Hello";
string s2 = "World";
// 执行 plus 函数对象
string s = stringPlus(s1, s2);
// 打印 plus 函数对象执行结果
cout << "s = " << s << endl;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
3、执行结果
执行结果 :
c = 888 s = HelloWorld 请按任意键继续. . .