来自http://hi.baidu.com/qinpanke/blog/item/728d7888dfcd18be0f24448e.html
非常感谢 “墙角里的光线”转载的这篇文章
什么是函数符?
函数对象也叫做函数符(functor)。
函数符是可以以函数方式与()结合使用的任意对象。这包括函数名,指向函数的指针和重载了()操作符的类对象(即定义了函数operator()()的 类)。
例如:
class Linear
{
private:
double a;
public:
Linear(double b):a(b){}
bool operator()(double b) {return a > b;}
}
Linear f1(3.0);
bool isbig = f1(4.0);//实际上调用的是f1.operator()(4.0)
ok,现在让我们回想一下for_each函数
for_each(books.begin(), books.end(), ShowReview);
第三个参数是常规函数,那如何让for_each即可以接受常规函数,又可以接受上面这种类对象。
模板可以满足要求:
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f);
这样对于普通函数ShowReview原型如下:
void ShowReview(const Review&);
标识符ShowReview的类型将为void(*)(const Review&),这也是赋给模板参数Function的类型。对于不同的函数调用,Function参数可以表示具有重载的()操作符的类类 型。最终,for_each()代码将具有一个使用f()的表达式,在ShowReview()范例中,f是指向函数的指针,而f()调用该函数。如果最 后的for_each()参数是一个对象,则f()将是调用其重载的()操作符的对象。
2.函数符相关的概念
(1)生成器(generator)是不用参数就可以调用的函数符
(2)一元函数(unary function)是用一个参数可以调用的函数符。
(3)二元函数(binary function)。。。。
(4)返回bool值的一元函数是断言(predicate)
(5)返回bool值的二元函数是二元断言(binary predicate)
3.系统预定义函数符
操作符 | 相应的函数符 |
+ | plus |
- | minus |
* | multiplies |
/ | divides |
% | modulus |
- | negate |
== | equal_to |
!= | not_equal_to |
> | greater |
< | less |
>= | greater_equal |
<= | less_equal |
&& | logical_and |
|| | logical_or |
! | logical_not |
用法举例:
sort(v.begin(), v.end(), greater<int>());
4.函数适配器
介绍两个函数:
bind1st()和bind2st();
举例:
transform(v.begin(), v.end(), out.begin(), bind1st(multiplies<double>(), 2.5) );
意思就是把v中的所有元素乘以2.5输出到out中。
bind1st()的作用就是把二元函数,第一个参数实例化,这样这个二元函数就可以用在需要一元函数的地方.
同样bind2st()就是把第二个参数实例化。