C++ STL,三大核心组件:Containers, Iterators以及Algorithms,即容器,迭代器和算法。另外还一种重要组件,即函数对象(FunctionObject r)。函数对象又称为仿函数(functor)。函数对象其实就是一个行为类似函数的“东西”,它可以没有参数,也可以带有若干参数,其功能是获取一个值,或者改变操作的状态。
在C++程序设计中,任何普通函数和任何重载了函数调用运算符“()”的类的实例都是函数对象,都可以作为参数传递给STL算法。
例如 accumulate()算法
template<class InputIterator, class Type, class BinaryFunction> Type accumulate(InputIterator first, InputIterator last, Type val, BinaryFunctionbinaryOp);
//定义一个普通函数作为函数对象传递给算法accumulate(),进行累积运算
int mult(int x, int y) { return x * y; };
accumulate(a, a + N, 1, mult) //全局普通函数 mult作为函数对象如果通过类来定义函数对象:
class MultClass {
public:
int operator() (int x, int y) const { returnx * y; } //必须重载operator()函数
};
int main() { //测试函数
inta[] = { 1, 2, 3, 4, 5 };
constint N = sizeof(a) / sizeof(int); //求a的元素个数
cout<< "数组a的元素乘积= "
<<accumulate(a, a + N, 1, MultClass()) //调用默认构造函数生成临时匿名对象
<<endl;
return0;
}
除了通过自定义函数对象的两种方法外,STL也预定义了若干个函数对象
| 仿 函 数 名 称 | 类型 | 结果描述 |
算术类 函数对象 | 加法:plus<T>() | 二元函数 | arg1 + arg2 |
减法:minus<T>() | 二元函数 | arg1 - arg2 | |
乘法:multiples<T>() | 二元函数 | arg1 * arg2 | |
除法:divides<T>() | 二元函数 | arg1 / arg2 | |
模取:modules<T>() | 二元函数 | arg1 % arg2 | |
否定:negate<T>() | 一元函数 | -arg | |
关系运算类 函数对象 | 等同:equal_to<T>() | 二元函数 | arg1 == arg2 |
不等于:not_equal_to<T>() | 二元函数 | arg1 != arg2 | |
大于:greater<T>() | 二元函数 | arg1 > arg2 | |
大于等于:greater_equal<T>() | 二元函数 | arg1 >= arg2 | |
小于:less<T>() | 二元函数 | arg1 < arg2 | |
小于等于:less_equal<T>() | 二元函数 | arg1 <= arg2 | |
逻辑运算类 函数对象 | 与:logical_and<T>() | 二元函数 | arg1 && arg2 |
或:logical_or<T>() | 二元函数 | arg1 || arg2 | |
非: logical_not<T>() | 二元函数 | !arg1 |
//在下面的语句中将标准二元函数对象multiplies<int>()传递给通用算法
cout << "数组a的元素乘积= " << accumulate(a, a + N, 1, multiplies<int>())<< endl;