STL中的函数对象(Funciont Objects)

转载 2007年09月30日 22:36:00

概要
一个函数对象(Function Object或者Functor)简单的说就是能够以函数调用的形式出现的任何东西。一个普通的函数显然就是一个函数对象,函数指针也是,更一般的,一个定义了operator()的Class也是。

描述
基本的函数对象的概念有Generator,Unary Function(一元函数),Binary Function(二元函数):他们各自表示能以F(),F(x),F(x,y)的形式出现的函数对象。当让这些可以扩展为Ternary Funtion甚至更多,但是实际上没有哪个STL算法用到了两个以上参数的函数对象。其他所有STL定义的函数对象的感念都是这三个基本概念的细化(refinements)。

返回bool类型的函数对象是相当重要的一类函数对象。一个返回bool值的Unary Function称作Predicate(谓词),相应的返回bool值的Binary Function称作Binary Predicate(二元谓词)。

在Function Objects和Adaptable Function Objects(可适应的函数对象)之间有重要但是有些微妙的区别。一般地说,虽然一个Function Objects对它的参数的类型有要求,但是操作符operator()可以重载,可以是模板,或者两者兼有。也就是说,没有准确地方法获得这个Function Objects的参数和返回类型的信息。但是一个Adaptable Function Objects必须以typedef的形式指定他的参数和返回值得类型。比如,类型F0是Adaptable Function Objects的模型,那么必须定义F0::result_type。类似的,如果F1是Adaptable Unary Function Objects的模型,那么F1::argument_type和F1::result_type必须有定义;如果F2是Adaptable Binary Function Objects的模型,那么必须定义F2::first_argument_type,F2::second_argument_type和F2::result_type。STL提供了基类 unary_function和binary_function来简化Adaptable Unary Functions和Adaptable Binary Functions的模型的定义。

Adaptable Function Objects是非常重要的,因为他们可以被function object adaptors(函数对象适配器,用来操作和控制其它函数对象)使用。STL提供了许多function object adaptors,包括unary_negate,unary_compose和binary_compose,用来对函数对象进行组合。

最后,STL包括了许多不同的预定义的函数对象,包括算子(plus,minus,multiplies,divides,modulus和negate),算术比较(equal_to,not_equal_to,greater,less,greater_equal和less_equal),和逻辑操作(logical_and,logical_or和logical_not)。这样你就可以不用手动写新的函数对象而是用这些函数对象就可以组合出相当复杂的操作。

例子
将一个vector<int>用随机数填充。这里,一个函数指针就是一个函数对象。
    vector<int> V(100);
    generate(V.begin(), V.end(), rand);

按照绝对值大小排序一个vector<int>。这里,函数对象是一个用户定义的class类型。

    struct less_mag : public binary_function<double, double, bool> {
 bool operator()(double x, double y) { return fabs(x) < fabs(y); }
    };

    vector<double> V;
    ...
    sort(V.begin(), V.end(), less_mag());

对一个vector<int>进行求和。这里,函数对象是一个可以保存状态的用户定义类型。

    struct adder : public unary_function<double, void>
    {
      adder() : sum(0) {}
      double sum;
      void operator()(double x) { sum += x; }
    };

    vector<double> V;
    ...
    adder result = for_each(V.begin(), V.end(), adder()); [3]
    cout << "The sum is " << result.sum << endl;

删除list<int>中所有大于100且小于1000的元素

    list<int> L;
    ...
    list<int>::iterator new_end =
  remove_if(L.begin(), L.end(),
     compose2(logical_and<bool>(),
       bind2nd(greater<int>(), 100),
       bind2nd(less<int>(), 1000)));
    L.erase(new_end, L.end());

附表
概念 Concepts

Generator
Unary Function
Binary Function

Predicate
Binary Predicate

Adaptable Generator
Adaptable Unary Function
Adaptable Binary Function
Adaptable Predicate
Adaptable Binary Predicate

类型 Types
plus
minus
multiplies (formerly called times)
divides
modulus,
negate
equal_to
not_equal_to
greater
less
greater_equal
less_equal,
logical_and
logical_or
logical_not
subtractive_rng
identity
project1st
project2nd
select1st
select2nd
unary_function
binary_function
unary_compose
binary_compose
unary_negate
binary_negate
binder1st
binder2nd
pointer_to_unary_function
pointer_to_binary_function

函数 Functions
compose1
compose2
not1
not2
bind1st
bind2nd
ptr_fun
 

从零开始学C++之STL(八):函数对象、 函数对象与容器、函数对象与算法

一、函数对象 1、函数对象(function object)也称为仿函数(functor) 2、一个行为类似函数的对象,它可以没有参数,也可以带有若干参数。 3、任何重载了调用运算符operat...
  • Simba888888
  • Simba888888
  • 2013年07月26日 22:14
  • 2717

STL 查找vector容器中的指定对象:find()与find_if()算法

1 从vector容器中查找指定对象:find()算法    STL的通用算法find()和find_if()可以查找指定对象,参数1,即首iterator指着开始的位置,参数2,即次iterato...
  • master_feng2009
  • master_feng2009
  • 2013年09月20日 21:48
  • 7269

linux下GDB调试C++标准库STL,打印STL对象的内容

示例代码: //============================================================================ // Name ...
  • lclwjl
  • lclwjl
  • 2016年05月12日 10:50
  • 1522

函数对象(Function Objects-STL)

简介(Introduction)         每个使用c++标准模板库(STL)的人都会碰到一些叫做函数对象的奇怪的东西。尽管他们与其他的普通的c++对象一样,但是他们通常与标准模板库(STL)...
  • leewon1988
  • leewon1988
  • 2012年02月17日 22:52
  • 293

underscore学习笔记—对象函数/Objects(一)

写在前面: 1.5.2版本,计28个函数 1、keys(取属性) _.keys(objects) 获取对象所有的属性名称 _.keys({one: 1, two: 2, three: 3})...
  • u014169707
  • u014169707
  • 2014年03月19日 17:43
  • 1054

标准模板库介绍(一元及二元函数对象Unary and Binary Function Objects)

第24章 标准模板库介绍 Chapter 24 Introducing the Standard Template Library 这一章介绍标准模板库-许多人认为这是最近几年被添加到C++的最重...
  • scut1135
  • scut1135
  • 2011年12月16日 15:56
  • 1495

函数对象 (Function Objects)

函数对象(Function Objects) C++必知必会第18条款 有时候需要一些行为类似于函数指针的东西,但函数指针显得笨拙、危险而且过时(让我们承认这一点)。通常最佳方式是使用函数对象(f...
  • biyesheng123
  • biyesheng123
  • 2011年08月25日 16:15
  • 170

Function Objects Adapter(函数对象适配器)

在讲函数对象适配器之前,让我来看看什么是适配器,广义上讲Adaper就是一种将某一接口转换为另一接口的组件。 比如某电器是欧式插头,你怎么插在国标插座上,最直观的想法就是再买个转接器转一下,没错,这...
  • kzq_qmi
  • kzq_qmi
  • 2015年06月16日 12:55
  • 471

分析stl function objects模块

分析stl function objects模块 从SGI的STl文档来看,STL functor(function object)模块主要分为两个部分:预先定义的functor 以及func...
  • xiaodan007
  • xiaodan007
  • 2012年05月11日 02:37
  • 428

泛型编程与STL(二):函数对象

一:何为函数对象(function object) 二:为什么函数对象 三:函数对象的用法 四:深入函数对象 一:何为函数对象 函数对象故名思议就是一个表示函数调用的对象,这个的对象...
  • u010224394
  • u010224394
  • 2013年04月17日 13:41
  • 599
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STL中的函数对象(Funciont Objects)
举报原因:
原因补充:

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