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 >

predefinedFuncObjectTest.cpp

deque<int> coll = { 1, 2, 3, 5, 7, 11, 13, 17, 19 };

PRINT_ELEMENTS(coll, "initialized: ");

// negate all values in coll
transform(coll.cbegin(), coll.cend(),      // source
    coll.begin(),                   // destination
    negate<int>());                 // operation
PRINT_ELEMENTS(coll, "negated:     ");

// square all values in coll
transform(coll.cbegin(), coll.cend(),      // first source
    coll.cbegin(),                  // second source
    coll.begin(),                   // destination
    multiplies<int>());             // operation
PRINT_ELEMENTS(coll, "squared:     ");

运行结果:

---------------- predefinedFuncObject(): Run Start ----------------
initialized: 1 2 3 5 7 11 13 17 19
negated:     -1 -2 -3 -5 -7 -11 -13 -17 -19
squared:     1 4 9 25 49 121 169 289 361
---------------- predefinedFuncObject(): Run End ----------------

2. 预定义函数对象绑定

你可以使用binder将预定义函数对象和其他数值进行绑定。

pdFuncObjectBind.cpp

using namespace std::placeholders;

set<int, greater<int>> coll1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
deque<int> coll2;

// Note: due to the sorting criterion greater<>() elements have reverse order:
PRINT_ELEMENTS(coll1, "initialized: ");

// transform all elements into coll2 by multiplying them with 10
transform(coll1.cbegin(), coll1.cend(),      // source
    back_inserter(coll2),             // destination
    bind(multiplies<int>(), _1, 10));   // operation
PRINT_ELEMENTS(coll2, "transformed: ");

// replace value equal to 70 with 42
replace_if(coll2.begin(), coll2.end(),       // range
    bind(equal_to<int>(), _1, 70),     // replace criterion
    42);                             // new value
PRINT_ELEMENTS(coll2, "replaced:    ");

// remove all elements with values between 50 and 80
coll2.erase(remove_if(coll2.begin(), coll2.end(),
    bind(logical_and<bool>(),
    bind(greater_equal<int>(), _1, 50),
    bind(less_equal<int>(), _1, 80))),
    coll2.end());
PRINT_ELEMENTS(coll2, "removed:     ");

运行结果:

---------------- pdFuncObjectBind(): Run Start ----------------
initialized: 9 8 7 6 5 4 3 2 1
transformed: 90 80 70 60 50 40 30 20 10
replaced:    90 80 42 60 50 40 30 20 10
removed:     90 42 40 30 20 10
---------------- pdFuncObjectBind(): Run End ----------------

时间: 2024-10-05 14:32:13

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) (中)

我们再来看一个复杂的例子 需求: 我们需要对集合内每个元素加上一个特定的值 代码如下: 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

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

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

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