关闭

函数符

363人阅读 评论(0) 收藏 举报

来自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()就是把第二个参数实例化。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:109703次
    • 积分:1561
    • 等级:
    • 排名:千里之外
    • 原创:37篇
    • 转载:35篇
    • 译文:0篇
    • 评论:15条
    文章分类
    最新评论