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;
1071




被折叠的 条评论
为什么被折叠?



