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

#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. python httprequest, locust

    r = self.client.get("/orders", headers = {"Cookie": self.get_user_cookie(user[0] ...

  2. WP8.1 状态栏隐藏

    StatusBar statusbar = StatusBar.GetForCurrentView(); await statusbar.HideAsync();

  3. python pip安装问题

    scipy-0.18.1-cp34-cp34m-win32.whl is not a supported wheel on this platform. 遇到该问题需要更新pip版本 1.更新pip: ...

  4. DataTables样式

    Styling 官方链接 AdminLTE HTML代码 <div class="row"> <div class="col-xs-12"&g ...

  5. 使用MSMQ 远程队列

    ------------------------------------------------------------------------------------------------- -- ...

  6. VSCode+Ionic+Apache Ripple开发环境搭建

    vscode作为一个轻量级编辑器,有其独特的魅力. 安装Ionic:npm install -g ionic 安装Apache Ripple模拟器: npm install -g ripple-emu ...

  7. 把Mongodb配置成windows服务

    在mongodb/bin 下运行命令窗口需要配置日志和db路径,如下:mongod --logpath d:\mongo\logs\logfilename.log --logappend --dbpa ...

  8. DNS 中的协议字段详细定义

    DNS中的协议字段定义 Table of Contents 1 概述 2 DNS Classes 3 DNS OpCodes 4 DNS RCODEs 5 DNS Label Types 6 DNS资 ...

  9. PAT复杂度_最大子列和问题、最大子列和变种

    01-复杂度1. 最大子列和问题 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j ...

  10. 使用JFinal的第一个项目出现的问题(The return type is incompatible with JspSourceDependent.getDependants())

    四月 08, 2016 4:35:34 下午 org.apache.catalina.core.ApplicationDispatcher invoke严重: Servlet.service() fo ...