zoukankan      html  css  js  c++  java
  • STL 仿函数(函数对象)

    定义

    • 仿函数(functor):一种具有函数性质的对象。
    • 仿函数在C++中的新名称为函数对象(function object)。
      仿函数类对象像函数一样被调用,调用仿函数类对象时,实际调用的是仿函数类中重载的operator()函数。
      仿函数的主要用途是搭配STL算法。

    应用

    STL的算法通常定义两个版本:
    一种实现常用的功能,采用默认的处理方法。
    另一种提供泛化能力,允许用户指定算法的比较准则,或者指定算法对容器中元素施加的“操作“等。这里的比较准则是算法中的一个模板参数。
    如STL中的search算法提供的两个版本:
    默认版本:

    template <class _ForwardIter1, class _ForwardIter2>
    _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
                         _ForwardIter2 __first2, _ForwardIter2 __last2) 
    

    指定比较方法的版本:

    template <class _ForwardIter1, class _ForwardIter2, class _BinaryPred>
    _ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
                         _ForwardIter2 __first2, _ForwardIter2 __last2,
                         _BinaryPred  __predicate) 
    

    可以看到,指定比较方法版本的模板参数中多了一个谓词模板_BinaryPred,用于指定元素比较的准则。而默认版本采用=操作符判断是否相等。

    指定操作有多种方法:

    • 通常可以通过定义函数,并将函数指针作为参数传递给算法。
    • 也可以定义类,并在类中重载operator()函数,使得该类成为一个仿函数类。
    • 使用Lambda匿名函数(C++11起)。
    • 通用多态函数封装器std::function(C++11起)。
      仿函数的两种用法:
    #include<iostream>
    #include<functional>
    
    using namespace std;
    
    int main(){
        greater<int> ig;
        cout<<boolalpha<<ig(3,5)<<endl;                //a
        cout<<boolalpha<<greater<int>()(5,3)<<endl;    //b
    
    	return 0;
    }
    

    a行是通过Functor对象后加()与参数,调用Functor中重载的operator()函数中定义的功能。
    b行通过在Functor类后接(),调用Functor类的构造函数,生成一个临时的function object,并对这个临时对象调用operator().

    编译运行程序,得到的结果是:

    false
    true
    

    STL内键的仿函数定义于functional头文件中,主要分为以下几类:

    graph LR functor --- 操作数 functor --- 功能 操作数 --- 一元 操作数 --- 二元 一元 --- negate 二元 --- Arithmetic... 功能 --- 算术Arithmetic 功能 --- 关系Relation 功能 --- 逻辑Logical 算术Arithmetic --- plus 算术Arithmetic --- minus 算术Arithmetic --- multiplies 算术Arithmetic --- divides 算术Arithmetic --- modulus 算术Arithmetic --- negate 关系Relation --- equal_to 关系Relation --- not_equal_to 关系Relation --- greater 关系Relation --- greater_equal 关系Relation --- less 关系Relation --- less_equal 逻辑Logical --- logical_and 逻辑Logical --- logical_or 逻辑Logical --- logical_not
  • 相关阅读:
    Java+Spring Boot+Shiro前后端分离权限基础框架
    201809~201810 期推荐文章
    Spring Boot 2.0.2 教程
    201808 期推荐文章
    201807 期推荐文章
    Simple-Mult-SSM 基于Simple-SSM扩展Hessian注解的javaweb前后端分离SSM基础框架
    hexo + github 搭建博客系列教程汇总
    DockPanel与GeckoFX、ChrominumFX、CefSharp结合使用问题
    APP并非一个人在战斗,还有API—Xamarin.Android回忆录
    我正在使用Xamarin的跨平台框架—Xamarin.Android回忆录
  • 原文地址:https://www.cnblogs.com/SupremeGIS-Developer/p/11962537.html
Copyright © 2011-2022 走看看