简单地说,函数对象就是一个重载了()运算符的类实例,它可以像一个函数一样使用。

#include <iostream>
using namespace std; class Add
{
public:
int operator ()(const int &a, const int &b)
{
return (a + b);
}
double operator ()(const double &a, const double &b)
{
return (a + b);
}
}; void main()
{
Add plus;
cout << plus(, ) << endl;//
cout << plus(44.3, 58.4) << endl;//102.7
}

用模板:

#include <iostream>
using namespace std; template <typename T>
class Add
{
public:
T operator ()(const T &a, const T &b)
{
return (a + b);
}
}; void main()
{
Add<int> plus1;
cout << plus1(, ) << endl;//
Add<double> plus2;
cout << plus2(44.3, 58.4) << endl;//102.7
}

标准库中的find_if、count_if、for_each等与之相关:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std; template <typename T>
class ShowT
{
public:
void operator ()(const T &a)
{
cout << a << '\t';
}
}; void show(const int &a)
{
cout << a << '\t';
} void main()
{
vector<int> vec = {, , , , , , , , , };
//for_each(vec.begin(), vec.end(), show); //ok
for_each(vec.begin(), vec.end(), ShowT<int>()); //ok
cout << endl;
}

与普通函数不同,因为类可以有数据成员,所以仿函数可以有状态的:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std; template <typename T>
class AddT
{
T m_data = ;
public: void operator ()(const T &a)
{
m_data += a;
} T result() const
{
return m_data;
} }; void main()
{
vector<int> vec = {, , , , , , , , , }; AddT<int> sum = for_each(vec.begin(), vec.end(), AddT<int>()); //for_each返回第三个参数的【拷贝】(A copy of the function object )
cout << sum.result()
<< endl;
}

//函数功能:对一区间[beg,end)执行_Func.并返回_Func.
template<class _InIt, class _Fn1>
inline _Fn1 _For_each(_InIt _First, _InIt _Last, _Fn1 _Func)
{
for (;_First != _Last; ++_First)
_Func(*_First);
return(_Func);
} template<class _InIt, class _Fn1>
inline _Fn1 for_each(_InIt _First, //start interval
_InIt _Last, //endinterval, [_First,_Last)
_Fn1_Func) //function object or function(unary_function)
{
// perform function for each element
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Func);
return(_For_each(_Unchecked(_First), _Unchecked(_Last), _Func));
}

for_each

template<class _InIt,
class _Pr> inline
_InIt _Find_if(_InIt _First, _InIt _Last, _Pr _Pred)
{
// find first satisfying _Pred
for (;_First != _Last; ++_First)
if(_Pred(*_First))//bool(*pFun)( T )
break;
return(_First);
} template<class _InIt,
class _Pr> inline
_InIt find_if(_InIt _First, _InIt _Last, _Pr _Pred)
{
// find first satisfying _Pred
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Pred);
return(_Rechecked(_First, _Find_if(_Unchecked(_First),_Unchecked(_Last), _Pred)));
}

find_if

template<class _InIt,
class _Pr> inline
typename iterator_traits<_InIt>::difference_type
_Count_if(_InIt _First, _InIt _Last, _Pr _Pred)
{
// count elements satisfying _Pred
typename iterator_traits<_InIt>::difference_type _Count = ; for (;_First != _Last; ++_First)
if(_Pred(*_First))
++_Count;
return(_Count);
} template<class _InIt,
class _Pr> inline
typename iterator_traits<_InIt>::difference_type
count_if(_InIt _First, _InIt _Last, _Pr _Pred)
{
// count elements satisfying _Pred
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Pred);
return(_Count_if(_Unchecked(_First), _Unchecked(_Last), _Pred));
}

count_if

函数对象(仿函数 functor)的更多相关文章

  1. STL——容器(Set & multiset)之 仿函数(函数对象)functor 的用法

    Set/multiset 中元素的存储数据总是会按照从大到小或者从小到大排列,这个是怎么实现的?这就要说 "仿函数" 这个概念了. 仿函数概念 1. 尽管函数指针被广泛用于实现函数 ...

  2. 函数对象与仿函数(function object and functor)

    part 1. 仿函数在STL组件中的关系 如下图: # 仿函数配合算法完成不同的策略变化. # 适配器套接仿函数. part 2. 仿函数介绍 传递给算法的“函数型实参”不一定得是函数,可以是行为类 ...

  3. STL仿函数functor

    一:仿函数functor介绍 尽管函数指针被广泛用于实现函数回调,但C++还提供了一个重要的实现回调函数的方法,那就是函数对象. functor,翻译成函数对象,伪函数,算符,是重载了“()”操作符的 ...

  4. C++ STL 之 函数对象

    重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函数那样调用.注意 ...

  5. C++ STL 之 函数对象适配器

    谓词是指普通函数或重载的 operator()返回值是 bool 类型的函数对象(仿函数).如果operator 接受一个参数,那么叫做一元谓词,如果接受两个参数,那么叫做二元谓词,谓词可作为一个判断 ...

  6. STL 仿函数(函数对象)

    ##定义 仿函数(functor):一种具有函数性质的对象. 仿函数在C++中的新名称为函数对象(function object). 仿函数类对象像函数一样被调用,调用仿函数类对象时,实际调用的是仿函 ...

  7. STL基础--仿函数(函数对象)

    1 首先看个仿函数的例子 class X { public: void operator()(string str) { // 函数调用运算符,返回类型在operator之前 cout << ...

  8. STL——仿函数(函数对象)

    一.仿函数(也叫函数对象)概观 仿函数的作用主要在哪里?从第6章可以看出,STL所提供的各种算法,往往有两个版本,其中一个版本表现出最常用(或最直观)的某种运算,第二个版本则表现出最泛化的演算流程,允 ...

  9. c++仿函数 functor

    内容整理自国外C++教材 先考虑一个简单的例子:假设有一个vector<string>,你的任务是统计长度小于5的string的个数,如果使用count_if函数的话,你的代码可能长成这样 ...

随机推荐

  1. C++ 环形缓冲区的实现

    参考文章:http://blog.csdn.net/linyt/article/details/53355355 本文参考linux系统中 kfifo缓冲区实现.由于没有涉及到锁,在多线程环境下,只适 ...

  2. c语言中的副作用!!千万小心!

    今天刚看完书上的副作用,博主觉得呢,副作用其实就在改变变量的值,也就是一个赋值操作!不过刚刚在知道上还是犯了错!!尴尬啊!! 大家都知道,c语言中的赋值操作符是自右向左结合的!! 下面有一个关于赋值中 ...

  3. JAVASE02-Unit07: 基本IO操作 、 文本数据IO操作

    基本IO操作 . 文本数据IO操作 java标准IO(input/output)操作 package day07; import java.io.FileOutputStream; import ja ...

  4. 17+个ASP.NET MVC扩展点【附源码】

    1.自定义一个HttpModule,并将其中的方法添加到HttpApplication相应的事件中!即:创建一个实现了IHttpmodule接口的类,并将配置WebConfig.  在自定义的Http ...

  5. 使用 apache2 + `mod_proxy_uwsgi` + uwsgi + upstart 部署

    使用 apache2 + mod_proxy_uwsgi + uwsgi + upstart 部署 网上运行 python wsgi 的应用时,大部分的资料都是使用 nginx .uwsgi ,很少资 ...

  6. MVC5中EF6 Code First启动慢及间隙变慢优化的实践经验(转)

    最近项目在使用EF了,mvc使用EF确实方便,因为添加功能的时候可以使用vs自动生成用ef的增.删.查.改的模板,大的提高的工作效率.但是很多人都遇到过用EF开发的程序在第一次访问的时候会比用ADO纯 ...

  7. 主页面、iframe之间调用以及传值

    主页面.iframe之间的调用和传值,无非就是两个交互形式: 主页面与子页面的交互 子页面之间的交互 接下来要讲的是四种交互传值的方式:利用postMessage方法传值.DOM操作传值.URL方式传 ...

  8. jquery easyui-datagrid/treegrid 清空数据参考

    在使用easyui的treegrid或datagrid的过程经常会有这样的场景,如:需要按不同的类型加载数据时,如果选择的分类下没有数据应该把上次展示的数据清空,以免引用歧义.下面给出两种方法供初学者 ...

  9. [Android Tips] 20. Android Studio Tips

    [译]Android Studio 使用技巧系列(一)-快捷键 [译]Android Studio 使用技巧系列(二)-快捷键 [译]Android Studio 使用技巧系列(三)-调试 [译]An ...

  10. C语言的概述--学习c的第二天

    以下是整理的知识点: #include <stdio.h>/* 引入stdio.h文件c的标准函数库 */ int main(void)/* 定义一个函数main(),int定义函数返回的 ...