定义

  • 仿函数(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. Python学习笔记-列表的增删改查

  2. 用户在浏览器输入URL或者跳转到一个URL后发生了什么

    一.从URL到页面渲染的整个过程1)处理用户输入2)开始导航3)读取响应4)查找渲染进程5)确认导航6)渲染页面 二.每一步做了哪些事情 1)处理用户的输入 浏览器的UI 线程处理用户的输入,判断是跳 ...

  3. Python3找出List中最大_最小的N个数及索引

    # -*- coding: utf-8 -*- import heapq nums = [1, 8, 2, 23, 7, -4, 18, 23, 24, 37, 2] # 最大的3个数的索引 max_ ...

  4. 计蒜客 蓝桥模拟 H. 封印之门

    Floyd算法,最短路,判断a,b是否相等. 代码: #include <cstdio> #include <cstdlib> #include <cstring> ...

  5. eclipse多个项目提交到同一个仓库(码云)

    参考博客:Eclipse提交多个项目到同一个仓库 https://blog.csdn.net/qq_30764991/article/details/80379365 步骤一:码云建立个远程仓库 步骤 ...

  6. python模块与包的详解

    一模块 1.什么是模块? 常见场景:一个模块包含python定义和声明的文件,文件名就是模块名字加上.py的后缀 2.为何要是用模块 如果你退出python解释器然后重新进入,那么你之前定义的函数或者 ...

  7. jvm 堆

    1.堆内存线程共享,在虚拟机启动时创建. 2.几乎所有的对象实例都在堆上分配:栈中存放基本数据类型和堆中对象的引用. GC回收 程序计数器.虚拟机栈.本地方法栈随线程而生,随线程而灭.栈中的栈帧随着方 ...

  8. Spring Boot 之Profile

    Profile Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活.指定参数等方式快速切换环境. 1)多Profile文件 我们在主配置文件编写的时候,文件名可以是:appli ...

  9. php----等比缩放图片

    <?php /** * Created by PhpStorm. * User: admin * Date: 2019/11/19 * Time: 8:54 */ $filename = 'lo ...

  10. 【leetcode】1138. Alphabet Board Path

    题目如下: On an alphabet board, we start at position (0, 0), corresponding to character board[0][0]. Her ...