STL(Standard Template Library)中的函数对象(也称为仿函数,Functor)是一种重载了函数调用操作符 operator()
的类对象。函数对象可以像普通函数一样被调用,但它们可以保存状态,并且可以作为参数传递给算法。STL 提供了多种类型的函数对象,以下是一些常见的类型及其区别:
1. 一元函数对象(Unary Function Object)
特点:
-
接受一个参数并返回一个结果。
-
通常用于对单个元素进行操作。
示例:
struct Increment {int operator()(int x) const {return x + 1;}
};
2. 二元函数对象(Binary Function Object)
特点:
-
接受两个参数并返回一个结果。
-
通常用于对两个元素进行操作。
示例:
struct Add {int operator()(int x, int y) const {return x + y;}
};
3. 谓词(Predicate)
特点:
-
返回布尔值的一元函数对象。
-
通常用于条件判断。
示例:
struct IsEven {bool operator()(int x) const {return x % 2 == 0;}
};
4. 二元谓词(Binary Predicate)
特点:
-
返回布尔值的二元函数对象。
-
通常用于比较两个元素。
示例:
struct LessThan {bool operator()(int x, int y) const {return x < y;}
};
5. 算术函数对象(Arithmetic Function Object)
特点:
-
提供基本的算术操作(加、减、乘、除等)。
-
通常用于算术运算。
示例:
std::plus<int> add;
std::minus<int> subtract;
std::multiplies<int> multiply;
std::divides<int> divide;
6. 比较函数对象(Comparison Function Object)
特点:
-
提供基本的比较操作(等于、不等于、小于、大于等)。
-
通常用于比较运算。
示例:
std::equal_to<int> equal;
std::not_equal_to<int> not_equal;
std::less<int> less;
std::greater<int> greater;
7. 逻辑函数对象(Logical Function Object)
特点:
-
提供基本的逻辑操作(与、或、非)。
-
通常用于逻辑运算。
示例:
std::logical_and<bool> logical_and;
std::logical_or<bool> logical_or;
std::logical_not<bool> logical_not;
8. 绑定器(Binder)
特点:
-
将二元函数对象的一个参数绑定到一个固定值,生成一个一元函数对象。
-
通常用于简化函数对象的使用。
示例:
std::bind1st(std::less<int>(), 10); // 生成一个一元函数对象,判断是否小于10
std::bind2nd(std::greater<int>(), 5); // 生成一个一元函数对象,判断是否大于5
9. 函数适配器(Function Adapter)
特点:
-
将函数对象与其他函数对象或函数组合使用。
-
通常用于组合多个操作。
示例:
std::not1(std::less<int>()); // 生成一个一元函数对象,判断是否不小于
std::not2(std::greater<int>()); // 生成一个二元函数对象,判断是否不大于
总结
-
一元函数对象:接受一个参数并返回一个结果,适用于对单个元素进行操作。
-
二元函数对象:接受两个参数并返回一个结果,适用于对两个元素进行操作。
-
谓词:返回布尔值的一元函数对象,适用于条件判断。
-
二元谓词:返回布尔值的二元函数对象,适用于比较两个元素。
-
算术函数对象:提供基本的算术操作,适用于算术运算。
-
比较函数对象:提供基本的比较操作,适用于比较运算。
-
逻辑函数对象:提供基本的逻辑操作,适用于逻辑运算。
-
绑定器:将二元函数对象的一个参数绑定到一个固定值,生成一个一元函数对象,适用于简化函数对象的使用。
-
函数适配器:将函数对象与其他函数对象或函数组合使用,适用于组合多个操作。