点击查看Evernote原文

#@author:       gr
#@date: 2014-09-27
#@email: forgerui@gmail.com

Chapter6 函数子、函数子类、函数及其他

Topic 38: 遵循按值传递的原则来设计函数子类

函数作为参数传递的是函数指针,所以尽量使函数子是单态的,可以使用这个函数去调用其它多态函数实现多态。这样也可以保证函数子的小巧

Topic 39: 确保判别式是“纯函数”

  一个判别式是一个返回为bool类型的函数,包括判别子类和判别函数。纯函数所能访问的数据应该仅局限于参数的函数,不可修改状态。否则,在多次调用判别式时,可能改变状态而得到不同的结果。比如:在一个循环中多次调用一个判别式,可能得到不同的结果。

  所以将函数声明为const形式:

class BadPredicate: public unary_function<Widget, bool>{
pulbic:
bool operator()(const Widget&)const{
//不允许修改状态
//...
return ...;
}
}

  

Topic 40: 若一个类是函数子,则应使它可配接

  如果一个函数子类的operator()只有一个实参,那么它应该从std::unary_function继承;如果函数子类的operator()有两个实参,那么它应该从std::binary_function继承。返回类型是operator()的最后一个实参。

  

  not1bind2nd只能用于可配接的函数对象,如果函数子类不是从unary_functionbinary_function继承而来,则无法配接。

template<typename T>
class MeetsThreashold: public std::unary_function<Widget, bool>{
private:
const T threshold;
public:
MeetsThreshold(const T& threshold);
bool operator() (const Widget&) const;
}

Topic 41: 理解ptr_funmem_funmem_fun_ref的来由

  1. 使用STL算法可以调用函数,但无法使用类成员函数。mem_funmem_fun_ref被用来高速成员函数,使之可以像函数一样被接受。

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

  2. ptr_fun将函数传给STL组件时使用,可以不用,等编译器提醒时再加上。

for_each(vw.begin(), vw.end(), ptr_fun(test));

Topic 42: 确保less<T>operator<具有相同的语义

  less<T>默认调用operator<,如果修改less<T>,会使operator>less<T>意义不一致。

  当你需要另外一个less<T>版本实现时,尽量不要修改原less<T>,而是用其它名称进行命名,确保operator<less<T>有相同的意义。

struct selfLess: public binary_function<Widget, Widget, bool>{
bool operator()(const Widget& lhs, const Widget& rhs) const{
return lhs.maxSpeed() < rhs.maxSpeed();
}
};

###《Effective STL》--Chapter6的更多相关文章

  1. 《Effective STL》学习笔记

    http://www.cnblogs.com/arthurliu/archive/2011/08/07/2108386.html 作者:咆哮的马甲 出处:http://www.cnblogs.com/ ...

  2. ###《Effective STL》--Chapter3

    点击查看Evernote原文. #@author: gr #@date: 2014-09-13 #@email: forgerui@gmail.com Chapter3 关联容器 Topic 22: ...

  3. ###《Effective STL》--Chapter5

    点击查看Evernote原文. #@author: gr #@date: 2014-09-17 #@email: forgerui@gmail.com Chapter5 算法 Topic 30: 确保 ...

  4. ###《Effective STL》--Chapter7

    点击查看Evernote原文. #@author: gr #@date: 2014-08-31 #@email: forgerui@gmail.com Chapter7 在程序中使用STL Topic ...

  5. ###《Effective STL》--Chapter1

    点击查看Evernote原文. #@author: gr #@date: 2014-09-12 #@email: forgerui@gmail.com Chapter1 容器 Topic 4: 调用e ...

  6. ###《Effective STL》--Chapter2

    点击查看Evernote原文. #@author: gr #@date: 2014-09-15 #@email: forgerui@gmail.com Chapter2 vector和string T ...

  7. ###《Effective STL》--Chapter4

    点击查看Evernote原文. #@author: gr #@date: 2014-09-14 #@email: forgerui@gmail.com Chapter4 迭代器 Topic 26: i ...

  8. 容器使用的12条军规——《Effective+STL中文版》试读

    容器使用的12条军规——<Effective+STL中文版>试读     还 记的自己早年在学校学习c++的时候,老师根本就没有讲STL,导致了自己后来跟人说 起会C++的时候总是被鄙视, ...

  9. 《Effective STL中文版》前言

    <Effective STL中文版>前言     我第一次写关于STL(Standard Template Library,标准模板库)的介绍是在1995 年,当时我在More Effec ...

随机推荐

  1. 在多线程中进行UI操作

    那么在子线程中的UI操作如何处理呢?有两种方法: 一:在子线程,你需要进行的UI操作前添加dispatch_async函数,即可将代码块中的工作转回到主线程 dispatch_async(dispat ...

  2. C语言/C++中怎样产生随机数

    C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,和time()函数. 需要说明的是,iostream头文件中就有srand函数的定义,不需要再额外引入stdlib. ...

  3. c# sql连接数据库

    using System.Data.SqlClient; private static string connectionString ="Data Source=.\\HS;Initial ...

  4. angular-tour 用户新手引导

    下载安装 bower install angular-tour 建立依赖,引入文件 <script src="bower_components/jquery/jquery.js&quo ...

  5. Oracle- UPDATE FROM讲解

    在表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据.像sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来.虽然只能对一个表进行更新,但是通 ...

  6. JavaScript要点 (一) 变量-作用域

    JavaScript 作用域 作用域—可访问变量的集合. 全局变量或者函数可以覆盖window对象的变量或者函数: 局部变量和window对象可以覆盖全局变量和函数. JavaScript 作用域 在 ...

  7. linux集群时间同步

    说明:由于hadoop集群对时间要求很高,所以集群内主机要经常同步.本文档适合ubuntu.redhat系列. 注:很多内容是在网上摘录,然后试验后总结,如有疑问可留言探讨. 1.设置主机时间准确(任 ...

  8. MySQL Cluster初步测试结果汇总图示报告 --> 用mysqlslap与sysbench进行测试

    Cluster结构图                                       测试环境简介 Mysql cluster集群测试环境 4 data node,32G 8核cpu 4 ...

  9. android判断当前应用程序处于前台还是后台

    /**     *判断当前应用程序处于前台还是后台     *      * @param context * @return         */    public static boolean ...

  10. curl常用的5个例子(转)

    我用php ,curl主要是抓取数据,当然我们可以用其他的方法来抓取,比如fsockopen,file_get_contents等.但是只能抓那些能直接访问的页面,如果要抓取有页面访问控制的页面,或者 ...