C++ 11 - STL - 函数对象(Function Object) (上)

1. 定义

在STL中,可以把函数传递给算法,也可以把函数对象传递给算法。

那么,什么是函数对象呢?

我们来看下它的声明:

class X
{
public:
  // define function call operator
  return-value operator() (arguments) const;
  ...
}

你可以这样调用:
X fo;

...

fo(arg1, arg2);

我们来看个简单的打印的例子

PrintInt.h

#ifndef        Print_Int_H_
#define        Print_Int_H_

#include <iostream>
using namespace std;
class PrintInt
{
public:
    void operator() (int elem) const
    {
        cout << elem << ‘ ‘;
    }
};

#endif

FuncObjectTest.h

#ifndef        Stl_Alg_Func_Object_Test_H_
#define        Stl_Alg_Func_Object_Test_H_

#include "../../TestBase.h"

class FuncObjectTest : public TestBase
{
public:
    FuncObjectTest(const string &c, const string &d) : TestBase(c, d) { }
    void run();
private:
    void printFuncObject();
};

#endif

FuncObjectTest.cpp

#include <vector>
#include <algorithm>
#include <iostream>
#include "FuncObjectTest.h"
#include "../../Core/PrintInt.h"

using namespace std;

void FuncObjectTest::printFuncObject()
{
    vector<int> coll;

    // insert elements from 1 to 9
    for (int i = 1; i <= 9; ++i) {
        coll.push_back(i);
    }

    // print all elements
    for_each(coll.cbegin(), coll.cend(),  // range
        PrintInt());                 // operation
    cout << endl;
}

void FuncObjectTest::run()
{
    printStart("printFuncObject()");
    printFuncObject();
    printEnd("printFuncObject()");
}

运行结果:

---------------- printFuncObject(): Run Start ----------------
1 2 3 4 5 6 7 8 9
---------------- printFuncObject(): Run End ----------------

时间: 2024-08-13 22:48:05

C++ 11 - STL - 函数对象(Function Object) (上)的相关文章

C++ 11 - STL - 函数对象(Function Object) (下)

1. 预定义函数对象 C++标准库内含许多预定义的函数对象,也就是内置的函数对象. 你可以充分利用他们,不必自己费心去写一些自己的函数对象. 要使用他们,你只要包含如下头文件 #include <functional> eg: set<int, less<int>> coll;  // sort elements with < set<int, greater<int>> coll;  // sort elements with >

C++ 11 - STL - 函数对象(Function Object) (中)

我们再来看一个复杂的例子 需求: 我们需要对集合内每个元素加上一个特定的值 代码如下: AddInt.h class AddInt { private: int theValue; // the value to add public: // constructor initializes the value to add AddInt(int v) : theValue(v) { } // the "function call" for the element adds the va

STL函数对象和Lambda表达式

1.基本概念 Function object是定义了operator()的object. FunctionObjectType fo; fo(…);调用函数对象的operator()代替函数fo()的调用. 等价于:fo.operator()(…); 函数对象的三个好处: (1) 函数对象可以有自己的状态,因此可能是更聪明的.你可以拥有同一个函数对象的两个实例,它们可能有不同的状态. (2) 每个函数对象是一个类型.你可以把函数对象作为模版的参数用于指定一个特定的行为. (3)函数对象通常比函数

STL 函数对象

一.函数对象? 若一个类重载了运算符 “()”,则该类的对象就成为函数对象 1 class CMyAverage { //函数对象类 2 public: 3 double operator() ( int a1, int a2, int a3 ) { 4 return (double)(a1 + a2+a3) / 3; 5 } 6 }; 7 CMyAverage average; //函数对象 8 cout << average(3,2,3); // average.operator()(3,

11、函数对象、函数的嵌套、名称空间与作用域

一.函数对象 函数对象,函数是第一类对象,即函数可以当做数据传递 具体特点: 1.可以被引用: 1 def foo(): 2 print('from foo') 3 4 func=foo 5 6 print(foo) 7 print(func) 8 func() 2.可以当作参数传递 1 def foo(): 2 print('from foo') 3 4 def bar(func): 5 print(func) 6 func() 7 8 bar(foo) 3.返回值可以是函数 1 def fo

STL源码剖析——STL函数对象

前言 在STL中,函数对象也是比较重要的,有时候可以限定STL算法的行为,例如在前面介绍的<STL算法剖析>中,每个算法基本上都提供了两个操作版本,其中就用一个版本允许用户指定函数对象,这样可以根据用户的需要对算法进行操作.函数对象是一种具有函数特质的对象,所以可以作为算法的参数.本文介绍的函数对象比较简单,是基于一元或者二元操作结构的算术类函数对象.关系运算类函数对象.逻辑运算类函数对象.在定义函数对象时,为了使其具有函数行为,则必须重载operator()操作符.本文源码出自SGI STL

函数指针和函数对象

函数指针(全局函数/类成员函数).函数对象(Function object) 一. 函数指针类型为全局函数. #include "stdafx.h" #include <iostream>using namespace std; class TestAction; typedef void (*fp)(int); void Drink(int i){cout<<"No. "<<i<<" drink...&qu

STL简单函数对象(仿函数)的实现

1.简介 本文介绍的东西,在STL历史上有两个不同的名称.仿函数(functors)是早期的命名,C++标准定案后,采用的新名称是函数对象(function objects). 函数对象,顾名思义,首先是对象(后面我们可以看到,函数对象是用struct而不是class定义的),其次,我们可以像调用函数一样,调用函数对象.这和函数指针很像,遗憾的是,函数指针不能满足面向对象的要求,不能满足STL对模板抽象性的要求,而且函数指针不能与STL其他组件搭配使用.于是聪明的科学家们发挥奇思妙想,给赤裸裸的

Python标准库:内置函数map(function, iterable, ...)

本函数是把函数对象function作为函数,iterable对象的每一项作为参数,然后进行计算后输出迭代子iterator.如果函数对象function可以输入多参数,那么后面可以跟多个可迭代的对象.多个迭代对象时,以最短的对象为运行结果的判断. 例子: #map() x = range(10) print(list(map(hex, x))) print(list(map(lambda y : y * 2 + 1, x))) print(list(map(lambda y, z : y * 2