【转】【C++ STL】深入解析神秘的 --- 仿函数

原文:http://blog.csdn.net/tianshuai1111/article/details/7687983

一,概述
        仿函数(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>

【转】【C++ STL】深入解析神秘的 --- 仿函数

时间: 2024-11-05 12:54:56

【转】【C++ STL】深入解析神秘的 --- 仿函数的相关文章

C++ STL 学习 :for_each与仿函数(functor)

简单来将,仿函数(functor)就是一个重载了"()"运算符的struct或class,利用对象支持operator()的特性,来达到模拟函数调用效果的技术. 我们平时对一个集合类遍历的时候,例如vector,是这样做的: for(vector<int>::const_iterator iter = ivec.begin(); iter != ivec.end(); ++iter) { //do your whatever you want here } 例如下面的代码:

STL学习之路之仿函数

STL中的仿函数(或者叫做函数对象):可以实现类似于函数一样的类型,函数最直接的调用形式就是:返回值 函数名(参数列表),仿函数实现了operator()操作符,使用类似于函数. 同时,STL还为仿函数提供了强大的配接器,也就是适配器Adapters,这些适配器本身也属于仿函数,调用方式同样类似于函数.更进一步,这些适配器可以和仿函数.函数.适配器再进行绑定.组合.适配,完成更加复杂的功能. 这部分应该是STL中最简单的部分,实现也比较简单.另外C++11标准对这部分调整比较大,我们先不考虑.暂

stl文件格式解析代码--java版

代码是参考three.js中的stlLoader.js写的. 需要注意的地方,java中byte取值-128~127 package test_stl.test_entry; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.util.regex.Matcher; import java.util.regex.Pattern;

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

C++ 学习笔记之 STL 队列

一.  引言 在算法以及数据结构的实现中,很多地方我们都需要队列(遵循FIFO,先进先出原则). 为了使用队列,我们可以自己用数组来实现队列,但自己写太麻烦不说,并且还很容易出错. 好在C++的STL(标准模板库)为我们实现了一个强大的队列,它包含在头文件<queue>中. 二.    queue a)     构造函数 下面用例子来展示queue的构造函数 deque<int> deck(3,100); list<int> mylist(2,100); queue&l

STL标准库-仿函数

摘要: 摘要: 摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 仿函数的实现:声明一个类,重载它的operator call ("()"操作符) template<typename T> class lineFeed { public: void operator()(const T &x) { cout<<x<<endl; } }; 仿函数只为算法服务,但是像上面这种声明方式,虽然在有些时候可以使用,但是却不

SGI STL functors(仿函数) 12

函数对象,即"行为类似函数"的对象,重载function call运算子(operator ()).STL仿函数根据操作数个数划分,可分为一元和二元仿函数,按功能划分可分为算数运算.关系运算.逻辑运算三大类.使用内建仿函数需包含<functional>头文件. 仿函数可配接的关键 为了拥有配接能力,需要依照规定定义自己的5个相应型别.仿函数的相应型别主要用来表现函数参数型别和传回值型别.为了方便期间,<stl_function.h>定义了两个class,分别表示

STL学习第一章 了解STL

知识内容: 1.STL介绍 2.C++基础知识复习 3.C++中的模板简单介绍 4.STL组成部分 一.STL介绍 1.什么是STL? 学过C++的应该都听说过STL,那么什么是STL呢?STL是Standard Template Library的简称,翻译为标准模板库,是惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Meng Lee和David R Musser在惠普实验室工作时所开发出来的.从根本上说,STL是一些"容器"的集合,这些"容器

自己动手实现STL 01:内存配置器的实现(stl_alloc.h)

一.前言 在STL中,容器是其中的重中之重,基本的STL中的算法,仿函数等都是围绕着容器实现的功能.而,内存配置器,是容器的实现的基础.所以,我第一次要去编写便是内存配置器的实现.在STL中,内存配置器的实现是在stl_alloc.h中. 二.配置器原理简要介绍 在SGI STL中配置分为两级,第一级配置器和第二级配置器.两者关系如下: 图1:第一级配置器和第二级配置器 在SGI STL中内存的配置器分为两级,第一级配置器和第二级配置器.第一级配置器就是,直接调用系统的malloc分配内存.对于