STL源代码剖析 读书总结
<<STL源代码剖析>> 侯捷著
非常早就买了这本书, 一直没看, 如今在实验室师兄代码的时候发现里面使用了大量泛型编程的内容, 让我有了先看看这本书的想法.
看之前我对于泛型编程了解甚少, STL倒使用的比較熟练. 看完这本书之后, 仅仅能表示曾经对于STL的使用真是跟小孩玩似得, 仅仅懂其冰山一角. 在真正的深入到源代码之后, 对于STL中不easy理解的部分如 迭代器(iterator), 仿函数(functor), 配接器(adapter)才有了一个彻彻底底的了解, 这样的东西不看源代码光看使用方法的话仅仅能说是学到皮毛, 会仅仅知其然不知其所以然, 也是在使用STL编程时错误的根源. 迭代器真是一个了不得的想法, 类似指针又不是指针(当然, vector的迭代器就是指针),
迭代器为容器与泛型算法搭了一座桥, 使得容器与算法可以完美的搭配在一起使用. 通过看这本书还攻克了我一个长久以来的困惑, 那就是 STL算法中仿函数的写法, 如排序算法sort的第三个可选參数 comp 的写法, 事实上都是有讲究的, 有的算法须要从comp中得到"等于"的概念, 算法中会这样做 !comp(a, b) && !comp(b, a), 假设 comp写成 a <= b, 那么算法中永远不可能有 a==b 的情况, 应该写成 a < b. 另一些运算类的仿函数如 plus<T>, 假设要自己写这种运算类仿函数也不是随便写的,
要想与STL其它组件完美兼容, 必需要依照一定的规则来写, 当然, C++提供了一个基类来方便这类函数的编写. 这些看似晦涩的内容当你理解了STL的设计思想及源代码之后, 你会发现事实上都非常easy, 正如作者所说, 源代码面前, 了无秘密!
阅读STL源代码除了上述的优点外, 另一个最大的收货就是学习一流的泛型编程技术. STL中利用C++提供的模板推到机制而实现的Traits编程技术, 简直是让人佩服到五体投地, 而利用Traits编程技术来提高泛型算法的效率在STL实现中更是随处可见, 最经典的就是STL算法 copy 的实现, 这个copy可不简单, 可不是像你们想的那样傻瓜式的一个一个拷贝, Traits编程在copy中得到了最好的体现, 详细的实现你们去看书吧, 一定会让你们对大师的智慧佩服到五体投地.
最后, 通过学习各类容器的实现, 能学到不少数据结构的知识, deque的实现可不是简单的数组或者链表, stack和queue底层都是以deque来实现的. RB-Tree的实现相当经典, 作者也花了大量的笔墨进行解说. 另外, STL中关于内存管理的设计也相当有讲究, 务必是要使效率达到最大化, 平时看STL算法原型的时候常常看到一个參数 Alloc , 没错, 这个就是关于内存管理的參数了, 默认提供的alloc对内存的管理很高效, 并非简单的malloc, free. 想要一探到底, 那就去看看这本书吧,
源代码之前, 了无秘密!
STL源代码剖析 读书总结的更多相关文章
- STL源代码剖析(一) - 内存分配
Allocaor allocator 指的是空间配置器,用于分配内存.STL中默认使用SGI STL alloc作为STL的内存分配器,尽管未能符合标准规格,但效率上更好.SGI STL也定义有一个符 ...
- STL源代码剖析——STL算法stl_algo.h
前言 在前面的博文中剖析了STL的数值算法.基本算法和set集合算法.本文剖析STL其它的算法,比如排序算法.合并算法.查找算法等等.在剖析的时候.会针对函数给出一些样例说明函数的使用.源代码出自SG ...
- STL源代码剖析——基本算法stl_algobase.h
前言 在STL中.算法是常常被使用的,算法在整个STL中起到很关键的数据.本节介绍的是一些基本算法,包括equal.fill.fill_n,iter_swap.lexicographical_comp ...
- 《STL源代码剖析》---stl_deque.h阅读笔记(2)
看完,<STL源代码剖析>---stl_deque.h阅读笔记(1)后.再看代码: G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_deque. ...
- STL源代码剖析——STL算法之set集合算法
前言 本节介绍set集合的相关算法,各自是并集set_union,差集set_difference,交集set_intersection 和对称差集set_symmetric_difference.这 ...
- STL源代码剖析(二) - 迭代器与traits技法
提要 先看一段用迭代器的代码: int a[] = {1, 2, 3, 4, 5}; vector<int> v1( a, a+5); vector<int>::iterato ...
- STL源代码剖析 容器 stl_map.h
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie map ------------------------------------------ ...
- STL源代码剖析 容器 stl_list.h
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie list ----------------------------------------- ...
- STL源代码剖析 容器 stl_stack.h
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie stack ---------------------------------------- ...
随机推荐
- 强制IE浏览器或WebBrowser控件使用指定版本显示网页
自从装了IE10之后,就发现好些个网站显示都不是那么的正常,网站上有些功能竟然还会出现一些意想不到的BUG——本来就是针对IE开发的,现在IE下竟然用不起来了,让用户情何以堪?但是就为少量用户使用的系 ...
- servlet基本概念
一.servlet是一个供其它java程序调用的java类,比方tomcatserver,它不能独自执行,它的执行由servlet引擎来控制和调度. 二.servlet是单例,多线程 针对多个clie ...
- JAVA反射机制示例,读取excel数据映射到JAVA对象中
import java.beans.PropertyDescriptor; import java.io.File; import java.io.FileInputStream; import ja ...
- XtraReport改变纸张方向
XtraReport纸张方向改变可以通过修改Landscape属性: Landscape=true 为横向输出 Landscape=false 为纵向输出
- Windows7 无法打开ASA SSL VPN和ASDM首页
原文地址:Windows7 无法打开ASA SSL VPN 首页和无法打开 ASDM GUI 页面作者:futhy windows 7 无法打开ASA SSL VPN 和AS ...
- automaticallyAdjustsScrollViewInsets的作用
简单点说就是automaticallyAdjustsScrollViewInsets根据按所在界面的status bar,navigationbar,与tabbar的高度,自动调整scrollview ...
- 01 日志组件XLog
本文地址为:http://www.cnblogs.com/ADTL/p/5357259.html XLog为XCode的日志组件,为系统基本功能. 使用示例: 1.新建WinForm程序 2.引用Ne ...
- 浏览器的Storage做缓存需要注意的地方
使用浏览器的Storage来做缓存.如: window.sessionStorage.setItem("cache", $(data).stringify()) 需要注意以下几点: ...
- Unix is 命令
输入正整数n以及n个文件名,排序后按列优先的方式左对齐输出.假设最长文件名有M字符,则最右列有M字符,其他列都是M+2字符. 附加条件每行最多输出60个字符,在此条件下要求行最少. Sample in ...
- 创建兼容的XHR对象
function createXHR () {//创建XMLHttpRequest对象 var xhr=null; if(window.XMLHttpRequest){ createXHR=creat ...