函数对象(仿函数 functor)

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

#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(45, 54) << endl;//99
    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(45, 54) << endl;//99
    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 = {1, 3, 5, 7, 9, 64, 128, 156, 200, 256};
    //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 = 0;
public:

    void operator ()(const T &a)
    {
        m_data += a;
    }

    T result() const
    {
        return m_data;
    }

};

void main()
{
    vector<int> vec = {1, 3, 5, 7, 9, 64, 128, 156, 200, 256};

    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 = 0;

            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

时间: 2024-12-17 01:04:38

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

C++ STL 基础及应用(7) 函数对象(仿函数)

把函数作为对象是程序设计的新思维.STL 通过重载类中的 operator() 函数实现函数对象功能,不但可以对容器中的数据进行各种各样的操作,而且能够维护自己的状态.因此,与标准 C 库函数相比,函数对象更为通用. 本章将介绍函数指针的使用.函数对象的定义.引入目的.使用方法,C++98 标准和C++11标准下 STL 内置函数对象的详细介绍.适配器类的使用.包括 bind1st bind2nd not1 not2 mem_fun mem_fun_ref ptr_fun bind ref cr

函数对象(仿函数)

参考博客:https://www.cnblogs.com/decade-dnbc66/p/5347088.html 1.重载 ( ) 2.仿函数 仿函数(functor),就是使一个类的使用看上去象一个函数.其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了. 仿函数(functor)又称为函数对象(function object).因为可以把构造产生的临时对象传递给左值或者函数的形参. 例子:使用count_if 统计字符数小于4的字符串的个数 方法1:

STL 仿函数(函数对象)

##定义 仿函数(functor):一种具有函数性质的对象. 仿函数在C++中的新名称为函数对象(function object). 仿函数类对象像函数一样被调用,调用仿函数类对象时,实际调用的是仿函数类中重载的operator()函数. 仿函数的主要用途是搭配STL算法. ##应用 STL的算法通常定义两个版本: 一种实现常用的功能,采用默认的处理方法. 另一种提供泛化能力,允许用户指定算法的比较准则,或者指定算法对容器中元素施加的"操作"等.这里的比较准则是算法中的一个模板参数.

仿函数(函数对象)

本文乃作者学习<C++标准程序库>的学习笔记,首先介绍了仿函数(函数对象)和函数适配器(配接器)的概念,然后列出STL中所有的仿函数,以及函数适配器,并摘录了几个例子演示仿函数和函数适配器的用法,最后讨论了仿函数的组合,以及实现方法. 1.仿函数是什么东西? <C++标准程序库>里对仿函数的解释是:仿函数是泛型编程强大威力和纯粹抽象概念的又一例证.你可以说,任何东西,只要其行为像函数,它就是一个函数.因此如果你定义了一个对象,行为像函数,它就可以被当做函数来用. 那么,什么才算具备

仿函数(函数对象)和STL算法

1仿函数可当作排序准则 程序员经常将某些class obect以有序的形式置于容器中或许你是 不能或不想反正你无法使用一般的operator<来对这些对象排序,你必须以某种特别规则通常基于某些成员函数此时仿函数派上用场例如: Class Person { Public: String firstname() const; String lastname() const; } Class personsortCriterion { Bool operator()(const Person& p

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

1 首先看个仿函数的例子 class X { public: void operator()(string str) { // 函数调用运算符,返回类型在operator之前 cout << "Calling functor X with parameter " << str<< endl; } operator string () const { return "X"; } //类型转换函数,返回类型在operator之后 };

C++仿函数(functor)详解

C++仿函数(functor)详解 所谓的仿函数(functor),是通过重载()运算符模拟函数形为的类. 因此,这里需要明确两点: 1 仿函数不是函数,它是个类: 2 仿函数重载了()运算符,使得它的对你可以像函数那样子调用(代码的形式好像是在调用 函数). 看下面的实例: #include <iostream> using namespace std; const int CMP_LES = -1; const int CMP_EQU = 0; const int CMP_BIG = 1;

c++仿函数 functor

内容整理自国外C++教材 先考虑一个简单的例子:假设有一个vector<string>,你的任务是统计长度小于5的string的个数,如果使用count_if函数的话,你的代码可能长成这样: 1 bool LengthIsLessThanFive(const string& str) { 2 return str.length()<5; 3 } 4 int res=count_if(vec.begin(), vec.end(), LengthIsLessThanFive); 其中

从for_each开始说起 回调函数与仿函数

#include <iostream> #include <algorithm> using namespace std; //回调函数 void call_back(char elem) {  cout << elem << endl; } //仿函数 struct Functor {  void operator() (char elem)   {   cout << elem << endl;  }  }; int main()