仿函数

一,概述

仿函数(functor),就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。

有些功能的的代码,会在不同的成员函数中用到,想复用这些代码。

1)公共的函数,可以,这是一个解决方法,不过函数用到的一些变量,就可能成为公共的全局变量,再说为了复用这么一片代码,就要单立出一个函数,也不是很好维护。

2)仿函数,写一个简单类,除了那些维护一个类的成员函数外,就只是实现一个operator(),在类实例化时,就将要用的,非参数的元素传入类中。





二,仿函数(functor)在各编程语言中的应用



1)C语言使用函数指针回调函数来实现仿函数,例如一个用来排序的函数可以这样使用仿函数

#include <stdio.h>
#include <stdlib.h>
//int sort_function( const void *a, const void *b);
int sort_function( const void *a, const void *b)
{   
    return *(int*)a-*(int*)b;
}

int main()
{
   int list[5] = { 54, 21, 11, 67, 22 };
   qsort((void *)list, 5, sizeof(list[0]), sort_function);//起始地址,个数,元素大小,回调函数 
   int  x;
   for (x = 0; x < 5; x++)
          printf("%i\n", list[x]);

   return 0;
}

2)在C++里,我们通过在一个类中重载括号运算符的方法使用一个函数对象而不是一个普通函数。

#include <iostream>
#include <algorithm>

using namespace std;
template<typename T>
class display
{
public:
    void operator()(const T &x)
    {
        cout<<x<<" "; 
    } 
}; 

int main()
{
    int ia[]={1,2,3,4,5};
    for_each(ia,ia+5,display<int>()); 

    return 0; 
}

三,仿函数在STL中的定义

要使用STL内建的仿函数,必须包含头文件。而头文件中包含的仿函数分类包括

1)算术类仿函数

加:plus

减:minus

乘:multiplies

除:divides

模取:modulus

否定:negate

例子:

#include <iostream>
#include <numeric>
#include <vector> 
#include <functional> 
using namespace std;

int main()
{
    int ia[]={1,2,3,4,5};
    vector<int> iv(ia,ia+5);
    cout<<accumulate(iv.begin(),iv.end(),1,multiplies<int>())<<endl; 

    cout<<multiplies<int>()(3,5)<<endl;

    modulus<int>  modulusObj;
    cout<<modulusObj(3,5)<<endl; // 3 
    return 0; 
}

2)关系运算类仿函数

等于:equal_to

不等于:not_equal_to

大于:greater

大于等于:greater_equal

小于:less

小于等于:less_equal

从大到小排序:

#include <iostream>
#include <algorithm>
#include <vector> 

using namespace std;

template <class T> 
class display
{
public:
    void operator()(const T &x)
    {
        cout<<x<<" "; 
    } 
};

int main()
{
    int ia[]={1,5,4,3,2};
    vector<int> iv(ia,ia+5);
    sort(iv.begin(),iv.end(),greater<int>());
    for_each(iv.begin(),iv.end(),display<int>()); 
    return 0; 
}

3)逻辑运算仿函数

逻辑与:logical_and

逻辑或:logical_or

逻辑否:logical_no

from:http://blog.csdn.net/tianshuai1111/article/details/7687983
原文链接: https://www.cnblogs.com/jiu0821/p/5850294.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/240137

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午8:30
下一篇 2023年2月13日 下午8:31

相关推荐