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 ---------------------------------------- ...
随机推荐
- JSTL解析——003——core标签库02
上一节主要讲解了<c:if/><c:choose/><c:when/><c:otherwise><c:out/>标签的使用,下面继续讲解其它 ...
- [Immutable.js] Converting Immutable.js Structures to Javascript and other Immutable Types
Immutable.js provides several conversion methods to migrate one structure to another. Each Immutable ...
- ACdream 1083 有向无环图dp
题目链接:点击打开链接 人民城管爱人民 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 128000/64000 KB (Java/Othe ...
- jsp当参数为空的时候默认显示值
当${business.branchName }为空或者不存在的时候显示“请选择门店” <c:out value="${business.branchName }" defa ...
- html进阶css(1)
<!doctype html> <html> <head> <meta http-equiv="content-type" content ...
- SQL Server 存储过程之基础知识(转)
什么是存储过程呢?存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令. 通俗来讲:存储过程其实就是能完成一定操作的一组SQL语句. 那为什么要用存储过程呢?1.存储过程只在创造时进行编译, ...
- android 中使用缓存加载数据
最近app快完工了,但是很多列表加载,新闻咨询等数据一直从网络请求,速度很慢,影响用户体验,所以寻思用缓存来加载一些更新要求不太高的数据 废话不多说,上代码 欢迎转载,但请保留文章原始出处:) 博客 ...
- NOT 运算符
NOT运算符不是独立的,它是一个可以放在任何逻辑表达式前面的修饰符,能得到与结果相反的结果.所以,如果一个表达式是真,就会得到假:如果是假,就会得到真.有时测试查找条件的反面更容易.不过,NOT运算符 ...
- mac 更改word的默认显示比例为125
1.打开或新建一个word文档 2.按 fn + option + F11 键,会弹出一个[项目]窗口,选中Normal, 双击[模块], 修改为125 Sub AutoOpen() ActiveWi ...
- WordPress主题制作全过程
前言: 我想大多数使用WordPress的朋友都喜欢去尝试新的主题,但是换来换去,总是找不到那么一款适合自己的,让人很郁闷.于是很多人萌生了修改现有主题或自己动手从头制作一个主题的想法,但是问题又来了 ...