博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C++ STL】深入解析神秘的 --- 仿函数
阅读量:7051 次
发布时间:2019-06-28

本文共 2201 字,大约阅读时间需要 7 分钟。

一,概述

        仿函数(functor),就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。
  有些功能的的代码,会在不同的成员函数中用到,想复用这些代码。

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

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

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

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

#include 
#include
//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 
#include
using namespace std;template
class display{public: void operator()(const T &x) { cout<
<<" "; } }; int main(){ int ia[]={1,2,3,4,5}; for_each(ia,ia+5,display
()); return 0; }

三,仿函数在STL中的定义

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

         1)算术类仿函数

               加:plus<T>

               减:minus<T>

               乘:multiplies<T>

               除:divides<T>

               模取:modulus<T>

               否定:negate<T>

例子:

#include 
#include
#include
#include
using namespace std;int main(){ int ia[]={1,2,3,4,5}; vector
iv(ia,ia+5); cout<
())<
()(3,5)<
modulusObj; cout<
<

         2)关系运算类仿函数

               等于:equal_to<T>

               不等于:not_equal_to<T>

               大于:greater<T>

               大于等于:greater_equal<T>

               小于:less<T>

               小于等于:less_equal<T>

              从大到小排序:

#include 
#include
#include
using namespace std;template
class display{public: void operator()(const T &x) { cout<
<<" "; } };int main(){ int ia[]={1,5,4,3,2}; vector
iv(ia,ia+5); sort(iv.begin(),iv.end(),greater
()); for_each(iv.begin(),iv.end(),display
()); return 0; }
            3)逻辑运算仿函数

                 逻辑与:logical_and<T>

                 逻辑或:logical_or<T>

                 逻辑否:logical_no<T>

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

你可能感兴趣的文章
request_mem_region 与 ioremap【转】
查看>>
指令级, ns级优化实例, 怎么做到调无可调
查看>>
Autodesk 2011系列新产品DevDay将于12月在北京/上海举行
查看>>
创建Visual studio项目模板 vstemplate关键点纪要
查看>>
SQL Server连接中三个常见的错误分析
查看>>
socket通信,server与多客户端通信
查看>>
[ACM_动态规划] ZOJ 1425 Crossed Matchings(交叉最大匹配 动态规划)
查看>>
LeetCode总结【转】
查看>>
枚举类型
查看>>
什么是 A 轮融资?有 B轮 C轮么?
查看>>
[CareerCup] 10.4 Find All Duplicates Elements 寻找所有的重复项
查看>>
jquery validationEngine的使用
查看>>
Symbian学习之路
查看>>
使用6to5,让今天就来写ES6的模块化开发!
查看>>
Windows 7 应用程序崩溃恢复
查看>>
(转载)iPhone开发视频教程 Objective-C部分 (51课时)
查看>>
Unity 5.1+ Assertion Library (断言库)
查看>>
OracleLinux上安装数据库(DBCA)
查看>>
[LeetCode] Happy Number 快乐数
查看>>
12306-票
查看>>