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
 

相关文章推荐

函数对象(Function Objects-STL)

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

函数对象 (Function Objects)

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

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

第24章 标准模板库介绍 Chapter 24 Introducing the Standard Template Library 这一章介绍标准模板库-许多人认为这是最近几年被添加到C++的最重...

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

写在前面: 1.5.2版本,计28个函数 1、keys(取属性) _.keys(objects) 获取对象所有的属性名称 _.keys({one: 1, two: 2, three: 3})...

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

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

C++ STL/ (12) 函数对象适配器

我们在前一节介绍了函数对象的概念,本节介绍基于函数对象的一个概念–函数对象适配器。在讲函数对象适配器之前,我们来讲一讲普通函数,函数对象和函数对象适配器的关系。 普通函数是对程序功能的一种封装。这种...

36STL之函数对象和谓词

STL之函数对象和谓词STL之函数对象和谓词 函数对象 谓词 一元函数对象案例 一元谓词案例 二元函数对象案例 二元谓词案例 综合示例代码 预定义函数对象 1算术函数对象 2关系函数对象 3逻辑函数对...

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

一:何为函数对象(function object) 二:为什么函数对象 三:函数对象的用法 四:深入函数对象 一:何为函数对象 函数对象故名思议就是一个表示函数调用的对象,这个的对象...

STL算法--函数对象

函数对象算法的头文件#include //功能:比较、交换、查找、遍历、复制、修改、反转、排序、合并等 #include //数学运算(加法和乘法序列上的一些操作) #include //定义了模板...

STL之函数对象(二)

STL中很多算法都要对迭代器范围内的元素做特定操作,这些操作是需要用户显示传递给迭代器,如何才能有效地传递这些操作呢?STL为我们提供了函数对象来解决这个问题。本文先简要介绍函数对象的概念,然后配合源...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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