My TinySTL中各个头文件的作用(4)---仿函数篇

首先我们先要明白什么是仿函数。

仿函数(Functor):

  • 是一种设计模式,指的是一个类的对象,该对象重载了函数调用运算符operator(),使得该对象可以像函数那样被调用。
  • 它们本质上是类的实例,但通过重载()操作符,能够以函数的形式被使用。
  • 仿函数可以拥有内部状态,这是普通函数所不具备的特性。这意味着仿函数可以在调用时保留一些信息,使得每次调用时的行为可能不同。
  • 因为它们是对象,所以可以被复制、存储和作为参数传递给其他函数。

例:

#include <iostream>
2
3// 定义一个仿函数类,用于计算平方
4class Square {
5public:
6    // 重载函数调用操作符(),使之可以像函数一样被调用
7    int operator()(int x) const {
8        return x * x; // 计算并返回x的平方
9    }
10};
11
12int main() {
13    Square squareFunc; // 创建一个Square类的实例,即仿函数对象
14
15    // 使用仿函数对象,像调用函数一样计算数值的平方
16    int number = 5;
17    int result = squareFunc(number); // 通过仿函数计算5的平方
18
19    std::cout << "The square of " << number << " is " << result << std::endl; // 输出结果
20
21    return 0;
22}

在这个例子中,Square类就是一个仿函数类,因为它重载了operator()。我们创建了Square的一个实例squareFunc,并像调用函数那样使用它来计算一个整数的平方。这种机制使得仿函数在STL算法中特别有用,因为它们可以作为算法的参数传递,从而允许用户自定义这些算法的行为。 

functional.h

该头文件中定义了一个简化版的函数对象库,模仿了C++标准库中的 <functional> 头文件,提供了各种数学运算和比较的仿函数,以及哈希函数。下面是这个代码的详细解析:

一元和二元函数对象基类模板

  • unary_function<Arg, Result> 和 binary_function<Arg1, Arg2, Result> 分别是为一元和二元函数对象定义的基类模板。它们主要为了提供类型定义(typedef),方便编译器和程序员理解这些仿函数的输入参数类型和返回类型。

算术运算仿函数

  • plus<T>minus<T>multiplies<T>divides<T>modulus<T>, 和 negate<T> 分别对应加法、减法、乘法、除法、取模和取负操作的仿函数。这些仿函数都继承自相应的基类,并重载了 operator() 来执行对应的数学运算。

比较仿函数

  • equal_to<T>not_equal_to<T>greater<T>less<T>greater_equal<T>, 和 less_equal<T> 提供了等于、不等于、大于、小于、大于等于和小于等于的比较操作。

逻辑运算仿函数

  • logical_and<T>logical_or<T>, 和 logical_not<T> 实现了逻辑与、逻辑或和逻辑非操作。

其他辅助仿函数

  • identity<T> 返回其参数本身,selectfirst<Pair> 和 selectsecond<Pair> 分别从pair中选择第一个和第二个元素,projectfirst<Arg1, Arg2> 和 projectsecond<Arg1, Arg2> 则分别返回二元操作的第一个和第二个参数。

哈希函数对象

  • hash<Key> 是一个泛型哈希函数对象模板,对于大多数类型没有直接定义行为。针对指针类型,哈希函数简单地将指针地址转换为大小。针对基本整型和浮点数类型,提供了特化版本来生成哈希值,其中浮点数类型的哈希基于其二进制表示的逐位异或和乘法散列算法。

此代码段旨在提供一组基础的函数对象,它们在实现自定义算法、数据结构(如关联容器需要哈希函数)或进行类型安全的函数回调时非常有用。这些仿函数的设计遵循了面向对象的原则,通过继承和多态提供了灵活且类型安全的函数调用机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值