一,概述
        仿函数(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内建的仿函数,必须包含<functional>头文件。而头文件中包含的仿函数分类包括

1)算术类仿函数

加:plus<T>

减:minus<T>

乘:multiplies<T>

除:divides<T>

模取:modulus<T>

否定:negate<T>

例子:

#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<T>

不等于:not_equal_to<T>

大于:greater<T>

大于等于:greater_equal<T>

小于:less<T>

小于等于:less_equal<T>

从大到小排序:

#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<T>

逻辑或:logical_or<T>

逻辑否:logical_no<T>

转载于:https://www.cnblogs.com/secbook/archive/2012/06/24/2654987.html

【C++ STL】深入解析神秘的 --- 仿函数相关推荐

  1. STL算法——函数对象(仿函数)

    全部案例链接 https://download.csdn.net/download/weixin_45525272/12536637 1 函数对象 重载函数调用操作符的类,其对象常称为函数对象(fun ...

  2. STL sort解析

    从上学接触到编程开始,到工作了几年.有关排序算法的内容反反复复有接触,但是要说每一种排序算法的细节都能说清,那就有难度了. 一来算法难度有深有浅.有比较简单的冒泡,插入,也有复杂的堆排序,快排这些. ...

  3. C++ STL源码剖析 笔记

    写在前面 记录一下<C++ STL源码剖析>中的要点. 一.STL六大组件 容器(container): 各种数据结构,用于存放数据: class template 类泛型: 如vecto ...

  4. java合并果子_C++(STL)树-堆结构练习——合并果子之哈夫曼树

    priority_queue 对于基本类型的使用方法相对简单. 他的模板声明带有三个参数,priority_queue Type 为数据类型, Container 为保存数据的容器,Functiona ...

  5. STL Priority_Queue

    priority_queue 调用 STL里面的 make_heap(), pop_heap(), push_heap() 算法 实现,也算是堆的另外一种形式. 先写一个用 STL 里面堆算法实现的与 ...

  6. 《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法2

    上一篇请见可能令你困惑的C++语法1 现在继续, 2.临时对象的产生和运用 临时对象,是一种无名对象.制造临时对象的方法是,在型别之后加一对小括号,并可以给定初值,这样就会调用响应的construct ...

  7. C++之STL之priority_queue

    1.priority_queue介绍 priority_queue 是优先队列 模板声明带有三个参数,priority_queue<Type, Container, Functional> ...

  8. STL源码剖析 内存基本处理工具 初始化空间的五个函数

    初始化空间的五个函数 构造函数 construct() 析构函数 destroy() 剩余三个底层函数 和 高层函数之间的对应关系如下 uninitialized_copy()  对应 copy() ...

  9. STL源码剖析 空间配置器 查漏补缺

    ptrdiff_t含义 减去两个指针的结果的带符号整数类型 ptrdiff_t (Type support) - C 中文开发手册 - 开发者手册 - 云+社区 - 腾讯云 std::set_new_ ...

最新文章

  1. 2022秋招算法岗卷成人间地狱!高薪惹眼,招录比100:1
  2. Linux系统下的数据镜像备份工具——Rsync
  3. 【采用】信用评分卡模型-数据缺失值处理
  4. 有用的Ant构建标签
  5. 【youcans 的 OpenCV 例程200篇】147. 图像分割之孤立点检测
  6. 解决linux yum无法安装mysql
  7. 002Linux应用领域
  8. 【408考研笔记】操作系统完整知识点
  9. 【极乐净土mmd】动作+镜头数据下载
  10. python实现英雄联盟信息获取
  11. Angular学习总结-入门篇
  12. Win10 chm文件无法打开解决方案
  13. Xcelsius 的苦难日子
  14. C语言sizeof与strlen详解(附大量笔试题题解过程)
  15. Jenkins集成GitHub
  16. CTF训练营学习笔记1(web)
  17. amazon alexa simple demo code for libcurl
  18. mysql 设置 utc_关于时间:MySQL应该将其时区设置为UTC吗?
  19. Win10亮度调节无效
  20. 在emacs中使用百度翻译

热门文章

  1. php最复杂,php – 什么方法最好构建这个复杂的图
  2. larvel 中的api.php_laravel route api.php 与 web.php 的区别
  3. 润乾单元格加html点击事件_报表输入页码翻页(润乾 V2018)
  4. 爱克发胶片_GE AGFA 胶片
  5. android百分比布局失效,Android 百分比布局库【原创】
  6. Hibernate框架ORM的实现原理-不是技术的技术
  7. 安卓案例:View动画 - 弹球碰壁
  8. Java Web应用小案例:查询城市天气信息
  9. 【codevs1867】【Tyvj3508】【BZOJ1041】圆上的整点,数学乱搞
  10. 【HDU1166】敌兵布阵,线段树练习