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

先看wikipedia定义:

A function object, also called a functor, functional, or functionoid,[1]  is a computer programming construct allowing an object to be invoked or called like it was an ordinary function, usually with the same syntax.

简单来将,仿函数(functor)就是一个重载了”()”运算符的struct或class,利用对象支持operator()的特性,来达到模拟函数调用效果的技术。

我们平时对一个集合类遍历的时候,例如vector,是这样做的:

例如下面的代码:

这里的for循环语句有点冗余,想到了std::for_each ,为了使用for_each,我们需要定义一个函数,如下:

于是就可以简化为下面代码:

上面这段代码有点丑陋,看起来不太爽,主要是函数指针的原因。

在这种应用环境下,C++有仿函数来替代,我们定义一个仿函数,如下:

于是就可以简化为下面代码:

下面,我们初步看下 for_each 的STL源码实现: 

其实for_each就是一个模板函数,将for循环语句封装起来,前面两个参数都是迭代器,第三个参数是使用一个函数指针(或仿函数),

其功能是对每一个迭代器所指向的值调用仿函数。之前觉得for_each挺神秘的,其实看看源码也挺简单的。呵呵。

上面代码还是有点冗余,因为为了使用for_each还要单独定义一个函数(或仿函数),不太清爽,

呵呵,stl早为我们准备好了 mem_fun 模板函数来解决这个一个问题,于是代码再次简化为:

我们一起看看 mem_fun 的STL源码实现:

这样就比较清晰了,定义了仿函数mem_fun_t内部定义了一个类成员函数指针,

仿函数构造的时候将函数指针保存起来,当仿函数operator()被调用的时候,

就通过与一个类的实例关联起来从而实现了类成员函数的调用。

其调用流程是这样的,for_each把vector中的元素传送给mem_fun,

mem_fun自己产生一个仿函数mem_fun_t,然后仿函数调用其重载的()。

上述源码还有最后一个没有说明,就是unary_function,直接上源码:

就一个模板结构体。没有数据成员,非常简单。

最后,定义一个删除指针的仿函数:

然后调用,就一个逐一删除vector里面的所有元素了。

源码:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注