1.mem_fun和mem_fun_ref

1.用来适配对象的成员函数

2.对于函数f以及对象obj,在obj上调用f的形式有3种:

(1)f(obj);  //f是全局函数(非obj成员函数)

(2)obj.f();  //f是obj的成员函数,obj是非指针

(3)obj->f();  f是obj的成员函数,obj是指针

3.然而,在for_each的定义中,只接受形如(1)的调用

template<class _It, class _Fn1>

inline void for_each(_It _First, _It _Last, _Fn1& _Func) {

for(; _First != _Last; _First++)

_Func(*First);

}

4.如果容器中存放的是对象,可以使用mem_fun_ref适配

2.G2.9源代码

template <class _Ret, class _Tp>
class mem_fun_t : public unary_function<_Tp*,_Ret> {
public:
  explicit mem_fun_t(_Ret (_Tp::*__pf)()) : _M_f(__pf) {}
  _Ret operator()(_Tp* __p) const { return (__p->*_M_f)(); }
private:
  _Ret (_Tp::*_M_f)();
};

template <class _Ret, class _Tp>
class mem_fun_ref_t : public unary_function<_Tp,_Ret> {
public:
  explicit mem_fun_ref_t(_Ret (_Tp::*__pf)()) : _M_f(__pf) {}
  _Ret operator()(_Tp& __r) const { return (__r.*_M_f)(); }
private:
  _Ret (_Tp::*_M_f)();
};

template <class _Ret, class _Tp>
inline mem_fun_t<_Ret,_Tp> mem_fun(_Ret (_Tp::*__f)())
  { return mem_fun_t<_Ret,_Tp>(__f); }

template <class _Ret, class _Tp>
inline mem_fun_ref_t<_Ret,_Tp> mem_fun_ref(_Ret (_Tp::*__f)())
  { return mem_fun_ref_t<_Ret,_Tp>(__f); }

3.示例

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;class Shape {public: virtual void display() = 0;
};class Rect : public Shape {public: virtual void display() {cout << "Rect ";}
};class Circle : public Shape {public: virtual void display() {cout << "Circle ";}
};class Square : public Rect {public: virtual void display() {cout << "Square ";}
};void display(Shape* sha) {sha->display();
}struct DeleteElement {template<typename TElement>void operator() (const TElement* p)const {delete p;}
};int main() {vector<Shape*> v;v.push_back(new Rect);v.push_back(new Circle);v.push_back(new Square);v.push_back(new Circle);v.push_back(new Rect);for(int i=0; i<v.size(); i++) {(v[i])->display();}cout << endl;for_each(v.begin(), v.end(), display);cout << endl;for_each(v.begin(), v.end(), mem_fun(&Shape::display));cout << endl;/*for(vector<Shape*>::iterator it=v.begin(); it!=v.end(); it++) {delete (*it);}*/for_each(v.begin(), v.end(), DeleteElement());}

执行结果:

4.注意

1.当new出对象并放入容器时,要在销毁容器前delete那些对象。

2.在有对象继承情况下,建立指针的容器而不是对象的容器

(1)STL容器装入的对象是原始对象的一个拷贝

(2)如果对象很大,拷贝需要大量性能开销

(3)由于继承存在,拷贝会发生slicing

仿函数适配器(mem_fun/mem_fun_ref)相关推荐

  1. STL17-函数对象

    仿函数: #include<iostream> #include<vector> #include<algorithm> using namespace std; ...

  2. 可调用对象、std::function、std::bind

    可调用对象.std::function.std::bind 仿函数functors function adapter bind(C++11) 函数适配器:bind2nd 仿函数适配器(mem_fun/ ...

  3. c++实现STL标准库

    本次课程主要面对有一定 c++ 基础(了解基本语法,熟悉常用特性)的 ,想要学习 c++ 更深入特性 ,掌握 c++ 强大标准库的同学 .通过本次课程,你将学习到 c++ template ,异常处理 ...

  4. 仿函数 ( 函数对象 ) 详解

    在C语言中我们是如何实现函数的传递呢? 没错就是函数指针! template<class T> void Say(T a) {cout << a << endl; ...

  5. C++ 标准模板库(STL)——适配器(Adaptor)

    适配器Adaptor 适配器 1.背景 2.定义 3.类型 3.1.容器适配器(container adaptor) 3.1.1.stack 3.1.2.queue 3.2.仿函数适配器(functi ...

  6. 《Effective STL》学习笔记(第四部分)

    6.仿函数.仿函数类.函数等 函数和类似函数的对象--仿函数--遍布STL.关联容器使用它们来使元素保持有 序:find_if使用它们来控制它们的行为:如果缺少它们,那么比如for_each和tran ...

  7. 极客班C++ STL(容器)第二周笔记

    为什么80%的码农都做不了架构师?>>>    极客班 C++ STL (容器算法)第二周笔记 标签(空格分隔): C++ 1. 容器(下) 1.1 Stack a. 概述 Stac ...

  8. 《EffcativeSTL》

    定义.使用和扩展STL 没有"STL"的官方定义,在本书中,"STL"的意思是与迭代器合作的C++标准库的一部 分.那包括标准容器(包括string),iost ...

  9. 《EfficativeSTL》

    定义.使用和扩展STL 没有"STL"的官方定义,在本书中,"STL"的意思是与迭代器合作的C++标准库的一部 分.那包括标准容器(包括string),iost ...

最新文章

  1. springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序
  2. 2021年需要学习Python的自动化测试框架有哪些?你知道吗?
  3. python序列化和反序列化
  4. linux下实现作业调度程序,Linux后台作业
  5. 不为人知的心理学效应
  6. php ajax loading图片居中显示,PHP语言入门之PHP+ajax实现登录按钮加载loading效果
  7. python静态递归函数_Python递归函数
  8. mysql日期相关的函数
  9. 群晖3617可以有几个网卡_Synology 群晖 DS1621+ 六盘位NAS 开箱拆解评测
  10. python对文件操作采用的统一步骤是_python之文件操作总结
  11. 原版98启动盘镜像.img_【教程】利用Windows 10 官方下载工具下载最新系统镜像、制作启动盘...
  12. Oracle DBA遇到频次最高的五十多个问题
  13. Java基础 实验二:类和对象
  14. 渠道分销管理系统解决方案
  15. FRM-18108和FRM-10102解决方法
  16. JavaScript浮动广告
  17. Cesium渐变色3dtiles白模(视频)
  18. C语言常用算法题 (嵌入式算法题) 28道
  19. 用python-sklearn做广州房价预测——以此为例说明如何使用python做简单的数据分析
  20. pstools工具使用

热门文章

  1. CodeVS 1031 质数环(DP)
  2. mysql主从配置,innobackup备份
  3. LINUX的文件链接,管道和用户组
  4. C语言学习之 数组,指针,字符串. (一)
  5. 一个具有对象计数功能的基类
  6. DedeCMS V5.7模块MVC框架基本说明
  7. 关于”误人子弟!垃圾培训该当何罪“一文
  8. PHP常见概念混淆(五)之PHP类常量、静态属性和属性的区别
  9. Bzoj 3932: [CQOI2015]任务查询系统(主席树)
  10. 【java】Java泛型