函数符

转载 2012年03月25日 11:00:34

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

C++ 函数符

一,什么是函数符? 函数对象也叫函数符,函数符是可以以函数方式与()结合使用的任意对象。这包括函数名、指向函数的指针和重载了()运算符的类对象。 二,使用重载了()运算符的类对象...
  • cloud323
  • cloud323
  • 2017年07月13日 09:27
  • 247

C++类型转换符使用详解

关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的《C++的设计和演化》。最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_cast, d...
  • cbNotes
  • cbNotes
  • 2014年08月22日 12:01
  • 1570

Objective-c的第一个问题:中缀符,到底什么是函数名,什么是参数?

声明时是这样 Objective C code ? 1 2 3 @interface C : NSObject +(int) fun: (int) a second:...
  • aoyuehan11
  • aoyuehan11
  • 2013年08月03日 21:05
  • 2107

STL 之 函数对象(函数符)

函数对象     也叫做 函数符 (functor)。函数符是可以以函数方式与()结合使用的任意对象。这包括函数名、指向函数的指针和重载了()操作符的类对象(即定义了函数operator()()...
  • qq_25301067
  • qq_25301067
  • 2015年11月04日 17:44
  • 206

C/C++中取地址符&的语义

在C语言中,&符号大家一定很熟悉吧。它除了可以作为按位运算“与”之外还有更常用的功能——取变量地址。我们首先看下面一个简单的例子: #include  int main(void){    int a...
  • zenny_chen
  • zenny_chen
  • 2008年06月04日 19:41
  • 28388

关于重载和比较函数

最近刚学习了C++中有关重载运算负中的知识,总算明白了如何通过重载一些运算符来改变一些容器的排序顺序 如 priority_queue优先队列的优先顺序和 sort 函数的二级排序,在不写比较函数的情...
  • qq_35562816
  • qq_35562816
  • 2016年10月24日 20:18
  • 359

C++类型转换函数(类型转换运算符函数)

用转换构造函数可以将一个指定类型的数据转换为类的对象。但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成double类型数据)。 C++提供类型转换函数(...
  • u010781856
  • u010781856
  • 2015年04月11日 19:57
  • 346

SHELL 中分界符(EOF)的用法

在shell脚本中,通常将EOF与 EOF只是一个分界符,当然也可以用abcde替换。 当shell遇到 此分界符可以是所定义的任何字符串,其实,不一定要用EOF,只要是“内容段”中没有出现的...
  • shuizhizhiyin
  • shuizhizhiyin
  • 2016年08月03日 14:57
  • 327

sqlserver 某字段格式化 千位隔符方法

--格式: 整数和2位小数 select convert(varchar(100),cast(1000000 as money),1) 结果:1,000,000.00 --格式: 不要小数部分 ...
  • shuicaohui5
  • shuicaohui5
  • 2012年06月19日 10:56
  • 845

函数对象(函数符)

函数对象(函数符) 很多STL算法都使用函数对象,也叫函数符(functor)。函数符是以函数方式与( )结合使用的任意对象,如函数名、指向函数的指针、重载了( )运算符的类对象 函数符概念 1.生成...
  • xianyun2009
  • xianyun2009
  • 2014年02月07日 12:26
  • 858
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:函数符
举报原因:
原因补充:

(最多只允许输入30个字)