定义

  • 仿函数(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

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

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

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

  2. ###STL学习--函数对象

    点击查看Evernote原文. #@author: gr #@date: 2014-08-13 #@email: forgerui@gmail.com 在stl中,函数对象被大量地使用,用以提高代码的 ...

  3. C++ STL 之 函数对象

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

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

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

  5. 条款20 STL函数对象

    继承标准STL的函数对象 1: struct PopLess : public atd::binary_function<state,state,bool> 2: { 3: bool op ...

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

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

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

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

  8. STL算法设计理念 - 函数对象和函数对象当参数和返回值

    函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特征,就是通过"对象名+(参数列表)&qu ...

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

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

随机推荐

  1. Dinic最大流 || Luogu P3376 【模板】网络最大流

    题面:[模板]网络最大流 代码: #include<cstring> #include<cstdio> #include<iostream> #define min ...

  2. openGL坐标系

    从我们构造模型的局部坐标系(Local/Object Space)经过一系列的处理最终渲染到屏幕坐标系(Screen Space)下,这个过程有6种坐标系. 一.世界坐标系(World Coordin ...

  3. 闲着没事写点啥之springmvc梳理

    用户通过浏览器向服务器发送请求,请求被springmvc的前端控制器dispatcherservlet拦截. dispatcherservlet拦截到请求后,会调用handlermapping处理器映 ...

  4. Flask【第4篇】:用Flask的扩展实现的简单的页面登录

    用flask的扩展实现的简单的页面登录 from flask import Flask,render_template,request,redirect,session app = Flask(__n ...

  5. Python---进阶---捕获异常

    一.编写一个计算减法的方法,当第一个数小于第二个数时,抛出“被减数不能小于减数”的异常 ------------------------------------------------- def ji ...

  6. 0-4评价一个语言模型Evaluating Language Models:Perplexity

    有了一个语言模型,就要判断这个模型的好坏. 现在假设: 我们有一些测试数据,test data.测试数据中有m个句子;s1,s2,s3-,sm 我们可以查看在某个模型下面的概率: 我们也知道,如果计算 ...

  7. 面试题常考&必考之--http访问一个页面的全流程(Tcp/IP协议)

    分析:-http访问一个页面的全流程,也就好比我们在地址栏输入地址,然后点击回车进行访问 该面试题的主要考点是:计算机网络的TCP/IP协议栈 描述图片:首先应用层提交http请求,传到传输层后由,T ...

  8. 8,HashMap子类-LinkedHashMap

    在上一篇随笔中,分析了HashMap的源码,里面涉及到了3个钩子函数(afterNodeAccess(e),afterNodeInsertion(evict),afterNodeRemoval(nod ...

  9. asp.net (web)选择文件夹 上传文件

    1 背景 用户本地有一份txt或者csv文件,无论是从业务数据库导出.还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工.挖掘和共创应用的时候,首先要将本地文件上传至ODPS,普通的小文件通 ...

  10. 在 mac 系统上安装 python 的 MySQLdb 模块

    在 mac 系统上安装 python 的 MySQLdb 模块 特别说明:本文主要参考了Mac系统怎么安装MySQLdb(MySQL-Python) 第 1 步:下载 MySQL-python-1.2 ...