STL程序设计实践七:尽量定义class形式的Function Object

原创 2002年01月14日 09:12:00

STL程序设计实践七:尽量定义class形式的Function Object<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

袁小凯

华南理工大学计算机研究所北区研发二部

Email – ccplusplus@21cn.com

 

前言  

在使用STL进行程序设计时,你会经常用到Function Object,尤其是在写一个泛型算法并充许把行为参数化时。Function Object简单点讲分两种:1.函数指针(最简单的Function Object)。2.class形式的Function Object。

1. 函数指针(最简单的Function Object)

函数指针指向一个函数,指向的函数一般为全局函数。通过函指针可以使行为参数化。

int a[5]={1,2,3,4,5};

vector<int> obj(a,a+5);

find_if(a,a+5,equalcmp);   //找出第一个等于5的元素

这里的equalcmp是一个函数指针,它指向一个全局函数equalcmp

bool equalcmp (int x){return x==5;}

这里通过传入函数指针使得我们可以使算法find_if按照我们定义的行为进行查找。

2. class 形式的Function Object

简单点说就是定义了operator () 成员函数的类。这样的类可以像函数一样进行调用,如果说 equalcmp 就是这样一个类,ecfo是其一个对象,则可进行如下函数呼叫动作:

ecfo();           //类似无参的函式呼叫,当然也以有参数。

还拿前面的例子来说,把equal_5定义成class形式的Funtion Object,如下:

struct equalcmp

{

      equalcmp(int x=5):data(x){}

bool operator () (int x){return data==x;}

      int data;

};

定义了equalcmp后我们可以利用它来进行find_if查询。

find_if(a,a+5,equalcmp(5));  //找出第一个等于5的元素

它的行为个前面的一样,注意equalcmp(5)的形式,它是用于产生一个临时的equalcmp对象,得以调用operator ()成员函数。

3.两者的比较

函数指针形式的functor(Function Object的另一种叫法)好像不够灵活,因为如果equalcmp不找等于5的元素了,换找4,它不能用了。你是改那,还是重写一个。哈哈!但class形式的functor(写起来方便多了^_^)可以减少这种无聊的重复劳动。换找4!,不就是找4吗,没问题。

find_if(a,a+5,equalcmp(4));

搞定!简单,方便,好用。如果用函数指标来实现这种功能可有些困难,因为无法存储局部状态,如果要实现可能需要全局变量。如果需要多个这样的functor会需要多个全局变量,不是尽量不要用全局变量吗?一些专家的忠告。但是还是有些人会固执认为类functor会效率的问题,因为要构造和析构。它们在寻求一种解决方法,他们可能找到了一种如下的方法:

      template<int N>

bool equalcmp(int x)

{    return x==N; }

find_if(a,a+5,equalcmp<4>(4));//4,VC(X),G++2.91.57(X),CB(O)

请问这种方法能行吗?你试过吗?如果没试试吧!这在某些编译器上可以,有些不行。但绝对可以这样调用equalcmp<4>(4);如果曾经这样调用过再这样使用find_if(a,a+5,equalcmp<4>(4))是可以的。可能是编译器产生Function Template实体时机的问题。

假设这样做可以,但是这不够一般化。你可使用类的形式写出更一般化的functor,可以满足所有的数据类型。

template <class T>

struct equalcmp

{

equalcmp(T x=5):data(x){}

bool operator () (T x){return data==x;}

T data;

};

  find_if(a,a+5,equalcmp<int>(4));

现在equalcmp可以使用任意数据类型,这一下使用函数指针可没法完成了吧!因为你写不出这样的函数来让它指。哈哈!松口气先,再喝口水。还有函数指针没法用Adaptable Function Object,因为它无进行嵌套定义数据类型。太多函数指针无法完成动作了。那是不是函数指针就没有用了呢?不是,当你已经有了一个函数可用,那你就可以用函数指针,而不用重写一个class形式的functor。还有函数指针也可通过Function Object Adaptor转换成Adaptable Function Object。就说这么多吧!

总之!如果你没有现成的函数可用,请定义class形式的Function Object

后语:

   该文是我个人的学习总结,如果有什么错误请大家指正。

 

算术表达式的语法分析及语义分析程序设计 —— LR分析法、输出三元式

通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。...
  • SkullSky
  • SkullSky
  • 2016年08月17日 20:22
  • 3036

C++项目参考解答:三角形类

【项目 - 三角形类雏形】(1)下面设计一个三角形类,请给出各成员函数的定义 class Triangle { public: void setABC(double x, double y, ...
  • sxhelijian
  • sxhelijian
  • 2016年03月27日 20:19
  • 2263

Java经典编程300例之实例061 计算几何图形的面积(抽象类)

实例说明 对于每个几何图形而言,都有一些共同的属性,如名字和面积等,而其计算面积的方法却各不相同。为了简化开发,本实例将定义一个超类来实现输出名字的方法,并使用抽象方法来计算面积。   实现过程...
  • HanTangSongMing
  • HanTangSongMing
  • 2014年07月29日 09:56
  • 7874

程序设计基石与实践之定义具有成员函数的类

现在从一个由GradeBook类和main函数组成的例子说起,此例是一系例循序渐进例子中的第一个,这些例子通过后续博文讲解,最终是一个功能众多的GradeBook类.这里,GradeBook类表示可供...
  • utimes
  • utimes
  • 2015年01月03日 16:51
  • 1271

编译原理程序设计实践(二) 全局变量定义

以下各节的代码根据教材P288的附录A中的pascal代码改写而来。改写时的要求是 1、尽量使用原有的变量名和类型名、函数名和参数名 2、对c++中未提供的运算符或者函数,则额外实现 3、尽量不...
  • laomai
  • laomai
  • 2013年03月13日 21:25
  • 1504

程序设计基石与实践系列之C语言未定义行为一览

英文出处:Christopher Cole: a glimpse of undefined behavior in c几周前,我的一位同事带着一个编程问题来到我桌前。最近我们一直在互相考问C语言的知识...
  • utimes
  • utimes
  • 2015年10月13日 09:12
  • 1230

编译原理程序设计实践(七)解释器的相关代码

/* 目标代码生成过程gen */ /* 参数:x:要生成的一行代码的助记符 */ /* y, z:代码的两个操作数 */ /* 本过程用于把生成的目标代码写入目标代码数组,供后面的...
  • laomai
  • laomai
  • 2013年03月13日 21:54
  • 1549

<JavaScript高级程序设计>笔记一: 函数function

研究了一下,书不赖 挺合适有其他的语言基础的人来学. 感觉JS里不光有OO的思想,感觉更像是C++:除了对象也需要main这类东西做过程控制. 特别是学到函数这块,有点儿当年拿C写嵌入式程序时候的感觉...
  • ruantao1989
  • ruantao1989
  • 2013年07月18日 17:38
  • 869

javascript函数function学习【javascript高级程序设计】

function语法: /* ECMAScript 使用function关键字来声明,后跟一组参数及函数体。基本语法如下: function functionName(arg0,arg1,a...
  • hu_shengyang
  • hu_shengyang
  • 2011年10月23日 09:31
  • 691

JavaScript高级程序设计之引用类型之Function 类型第5.5讲笔记

说起来 ECMAScript 中什么最有意思,我想那莫过于函数了——而有意思的根源,则在于函数实际 上是对象。每个函数都是 Function 类型的实例,而且都与其他引用类型一样具有属性和方法。由于...
  • Jane617_min
  • Jane617_min
  • 2015年09月26日 23:33
  • 421
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STL程序设计实践七:尽量定义class形式的Function Object
举报原因:
原因补充:

(最多只允许输入30个字)