条款38:遵循按值传递的原则来设计仿函数

仿函数都是 pass-by-value

Function for_each(InputIterator first, InputIterator last, Function f); //f按值传递, 结果按值返回

函数对象按值传递和按值返回,所以函数对象要尽可能小(对象拷贝开销大)

条款39:确保判别式是"纯函数"
条款40:若一个类是仿函数,则应使它可配接
条款41:理解ptr_fun、mem_fun、mem_fun_ref
template<typename InputIterator, typename Function>
Function for_each(InputIterator first, InputIterator last, Function f) {
while (first != last) f(*begin++);
}

一个函数f和一个对象x,如果在x对象调用f,则:
f(x); //f是一个非成员函数
x.f(); //f是成员函数,且x是一个对象或对象引用
x->f(); //f是成员函数,且x是指向对象x的指针

现在有一个用于测试Widget对象的非成员函数:
bool test(Widget& widget);
和一个存放Widget对象的容器: std::vector<Widget> vec;
我们可以使用: for_each(vec.begin(), vec.end(), test);

现在假设test函数是Widget的成员函数,即Widget支持自测:

class Widget {
public:
void test();
};

如果我们如下调用:

for_each(vec.begin, vec.end(), &Widget::test);    //编译错误!!! 

mem_fun:如果一个存放Widget*的指针容器,需要调用自己定义的成员函数时:

for_each(vecptr.begin(), vecptr.end(), mem_fun(&Widget::test));

mem_fun_ref:如果一个存放Widget的容器,需要调用自己定义的成员函数时:

for_each(vec.begin(), vec.end(), mem_fun_ref(&Widget::test));
条款42:确保less<T>与 operator< 具有相同语义

STL学习笔记(六) 函数对象的更多相关文章

  1. STL学习笔记8 -- 函数对象

    重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.一个类对象,表现出一个函数的特征,就是通过“对象名+(参数列表)”的方式使用一个类对象,如果 ...

  2. webdriver(python)学习笔记六——操作测试对象

    定位到具体对象后,就需要对其进行操作,比如点击.输入内容等. 一般来说,webdriver中比较常用的操作对象的方法有下面几个 click 点击对象 send_keys 在对象上模拟按键输入 clea ...

  3. 【Swift】学习笔记(六)——函数

    函数  懂编程语言的来说这个是最主要的了,不论什么语言都有函数这个概念.函数就是完毕特定任务的独立代码块. 函数怎么创建: 1.创建一个无參无返回值的函数(实际上全部的函数都有返回值,这个函数返回vo ...

  4. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  5. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. Effective STL 学习笔记 39 ~ 41

    Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  7. Effective STL 学习笔记:19 ~ 20

    Effective STL 学习笔记:19 ~ 20 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  8. Matlab学习笔记 figure函数

    Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...

  9. Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value

    Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value */--> div.org-src-container ...

随机推荐

  1. JavaScript -- 条件语句和循环语句

    if语句 在我们开发程序的时候,经常会遇到选择题,例如,年龄大于18,你就可以抽烟喝酒烫头,年龄小于18,你就只能吃饭喝水.在我们的代码中,我们可以用if语句来实现这种判断 语法一: if( cond ...

  2. tomcat - CPU高占用问题记录

    先查询进程 top 再根据进程号,查出进程的线程 ps p 3036 -L -o pcpu,pid,tid,time,tname,cmd 得到最高使用率CPU的线程TID,转换成16进制 printf ...

  3. linux虚拟机配置网络

    第一步.网络模式设置为桥接模式   第二步.设置ip和掩码 vim /etc/sysconfig/network-scripts/ifcfg-ens33 ens33为当前机器的网卡名称  在文件尾部添 ...

  4. 01_9_ServletContext

    01_9_ServletContext 1. 例子 public void doGet(HttpServletRequest request, HttpServletResponse response ...

  5. 三倍经验——bzoj3663、4660、4206 Crazy Rabbit/最大团

    题目描述: 3663 4660 4206 题解: 第一眼:不成立的互相连边,然后用网络流求解无向图最小点覆盖! 好吧我不会. 正解: 每个点对应圆上的一段圆弧,长这样: 设对应圆弧$(l,r)$. 若 ...

  6. Centos7离线部署kubernetes 1.13集群记录

    一.说明 本篇主要参考kubernetes中文社区的一篇部署文章(CentOS 使用二进制部署 Kubernetes 1.13集群),并做了更详细的记录以备用. 二.部署环境 1.kubernetes ...

  7. 01将图片嵌入到Markdown文档中

    将图片内嵌入Markdown文档中 将图片嵌入Markdown文档中一直是一个比较麻烦的事情.通常的做法是将图片存入本地某个路径或者网络存储空间,使用URL链接的形式插入图片: ![image][ur ...

  8. Java-JFrame-swing嵌套浏览器步骤

    Java-JFrame-swing嵌套浏览器步骤 一.使用swing嵌套浏览器要实现的功能: 通过java的swing实现在一个窗体中嵌套一个浏览器,可以在这个浏览器中将另一个项目的内容显示出来,只需 ...

  9. 【android】6大布局

    线性布局 相对布局 绝对布局 网格布局 表格布局 帧布局

  10. Python学习笔记:configparser(INI格式配置文件解析)

    在平时的开发中感觉INI格式的配置文件使用还是挺需要的,有时会使用一个单独的py来存放一些常量或者配置项,大多时候这样倒是挺好用的,但是如果某些配置项需要在运行时由用户来修改指定,比如很多app在关闭 ...