###《Effective STL》--Chapter6
点击查看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()的最后一个实参。
not1和bind2nd只能用于可配接的函数对象,如果函数子类不是从unary_function或binary_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_fun、mem_fun和mem_fun_ref的来由
1. 使用STL算法可以调用函数,但无法使用类成员函数。mem_fun和mem_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的更多相关文章
- 《Effective STL》学习笔记
http://www.cnblogs.com/arthurliu/archive/2011/08/07/2108386.html 作者:咆哮的马甲 出处:http://www.cnblogs.com/ ...
- ###《Effective STL》--Chapter3
点击查看Evernote原文. #@author: gr #@date: 2014-09-13 #@email: forgerui@gmail.com Chapter3 关联容器 Topic 22: ...
- ###《Effective STL》--Chapter5
点击查看Evernote原文. #@author: gr #@date: 2014-09-17 #@email: forgerui@gmail.com Chapter5 算法 Topic 30: 确保 ...
- ###《Effective STL》--Chapter7
点击查看Evernote原文. #@author: gr #@date: 2014-08-31 #@email: forgerui@gmail.com Chapter7 在程序中使用STL Topic ...
- ###《Effective STL》--Chapter1
点击查看Evernote原文. #@author: gr #@date: 2014-09-12 #@email: forgerui@gmail.com Chapter1 容器 Topic 4: 调用e ...
- ###《Effective STL》--Chapter2
点击查看Evernote原文. #@author: gr #@date: 2014-09-15 #@email: forgerui@gmail.com Chapter2 vector和string T ...
- ###《Effective STL》--Chapter4
点击查看Evernote原文. #@author: gr #@date: 2014-09-14 #@email: forgerui@gmail.com Chapter4 迭代器 Topic 26: i ...
- 容器使用的12条军规——《Effective+STL中文版》试读
容器使用的12条军规——<Effective+STL中文版>试读 还 记的自己早年在学校学习c++的时候,老师根本就没有讲STL,导致了自己后来跟人说 起会C++的时候总是被鄙视, ...
- 《Effective STL中文版》前言
<Effective STL中文版>前言 我第一次写关于STL(Standard Template Library,标准模板库)的介绍是在1995 年,当时我在More Effec ...
随机推荐
- RegExp.exec
来自:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec Summ ...
- DTD - XML Building Blocks
The main building blocks of both XML and HTML documents are elements. The Building Blocks of XML Doc ...
- elecworks 图框管理器
图框管理器中存储的是图纸模板(图框),新建图框的步骤如下: 1 数据库---图框管理器----新建 2 打开图框属性设置窗口,设置图框属性,设置好之后点击确定 3 右击图框图标---打开(进入图框绘制 ...
- 转载SSIS中的容器和数据流—数据转换(Transformations)续
数据挖掘请求 数据挖掘任务是SSIS中一个很重要的任务,它的思想来源于一些算法.数据挖掘请求运行数据挖掘请求,并将结果输出到数据流.它还可以添加一些预测新列,一些应用场合如下列举: 根据已知的一些列, ...
- ltt.js
var dailyBox = $('.daily-box-office'), curDate = new Date(), curYear = curDate.getFullYear(), curMon ...
- JavaScript一道面试题求y的值是? z 的值是? s的值是?
原文:http://www.zhufengpeixun.cn/JavaScriptmianshiti/2014-04-01/287.html < script type = "text ...
- 如何获得JVM执行过程中调用的方法名
这应该分成两个问题,1.如何获取参数值. 2.如何获取参数名, 1.如何获取参数值.这个是运行时的数据,你程序处理下获取就好了.比如写一个代理 2.参数名是在编译的时候就写入到class文件的.,而这 ...
- unity编辑器的搜索框好特么坑啊,居然不支持*号通配符
上图 t:Scene或者点搜索框旁边的 分类按钮 用*.unity是什么也搜索不出来的
- C#学习笔记(一):一些零散但重要的知识点汇总
集合类型 数组 数组需要注意的就是多维数组和数组的数组之间的区别,如下: using System; namespace Study { class Program { static void Mai ...
- PHP PDO函数库具体解释
文章来源:PHP开发学习门户 地址:http://www.phpthinking.com/archives/565 PDO是一个"数据库訪问抽象层",作用是统一各种数据库的訪问接口 ...