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 value
    void operator() (int& elem) const
    {
        elem += theValue;
    }
};

设置一个打印模板类

print.hpp

template <typename T>
inline void PRINT_ELEMENTS (const T& coll,
                            const std::string& optstr="")
{
    std::cout << optstr;
    for (const auto&  elem : coll) {
        std::cout << elem << ‘ ‘;
    }
    std::cout << std::endl;
}

测试程序:

list<int> coll;

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

PRINT_ELEMENTS(coll, "initialized:                ");

// add value 10 to each element
for_each(coll.begin(), coll.end(),    // range
    AddInt(10));               // operation

PRINT_ELEMENTS(coll, "after adding 10:            ");

// add value of first element to each element
for_each(coll.begin(), coll.end(),    // range
    AddInt(*coll.begin()));    // operation

PRINT_ELEMENTS(coll, "after adding first element: ");    

运行结果:

---------------- addFuncObject(): Run Start ----------------
initialized:                1 2 3 4 5 6 7 8 9
after adding 10:            11 12 13 14 15 16 17 18 19
after adding first element: 22 23 24 25 26 27 28 29 30
---------------- addFuncObject(): Run End ----------------

时间: 2024-08-02 05:19:44

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

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

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 >

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,

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

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

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

函数指针和函数对象

函数指针(全局函数/类成员函数).函数对象(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

js中函数对象创建的总结

在JavaScript的函数对象创建方法中,可以分为三种情况: 1:第一种是使用function语句定义函数 1 <script type="text/javascript"> 2 function fun1(){ 3 alert("我的第一个方法"); 4 } 5 6 //这里边JavaScript带参数的时候不需要提前的定义和声明,而且在定义的时候也不需要带参数类型,直接写参数名称.在使用的时候直接传参就行了,传的是啥类型的参数,就是用啥类型的参数

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

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