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 ---------------------------------------- ...
随机推荐
- Android——编译odex保护
编译过android源代码的可能试验过改动编译类型.android的初始化编译配置可參考Android--编译系统初始化设置 一.TARGET_BUILD_VARIANT=user 当选择的编译类型为 ...
- POJ 3114 Countries in War(强连通+最短路)
POJ 3114 Countries in War 题目链接 题意:给定一个有向图.强连通分支内传送不须要花费,其它有一定花费.每次询问两点的最小花费 思路:强连通缩点后求最短路就可以 代码: #in ...
- CGContextRef CIImageRef详解
第一种 先用UIImage对象加载一张图片 然后转化成CGImageRef放到CGContext中去编辑 第二种 用CGImageCreate函数创建CGImageRef 然后把CGImageRef放 ...
- BOOST::Signals2
/* Andy is going to hold a concert while the time is not decided. Eric is a fans of Andy who doesn't ...
- POJ 3694 LCA
题意:有N台电脑,他们之间有M条无向边. 然后询问,每次在他们之间加一条边,剩余的桥有多少. 思路:其实这题都不需要缩点了.. 直接记录每条桥的位置,然后每次询问进行一次LCA,当询问到桥时,桥数减1 ...
- 涂抹Oracle笔记2:数据库的连接-启动-关闭
一.数据库的连接sqlplus <username>[/<password>][@<connect_idertifier>]|/[as sysdba| as sys ...
- C#控制条码打印机 纸张大小,间距,绘制内容(所有条码打印机通用)
其他条码知识 请访问:http://www.ybtiaoma.com ,本文仅供参考,请勿转载,谢谢 using System; using System.Drawing; using System. ...
- 7、Khala设备资源的申请和释放
在实际业务中,我们每次登录后,可能需要在服务端维护一些设备相关的资源信息,而不同设备所需维护的资源信息又不尽相同.Khala提供了设备资源的维护储存功能,在此我们通过一个具体的业务中对其进行展示. 一 ...
- n个数的最大公约、最小公倍数
#include <cstdio> #include <cstring> using namespace std; #define N 1010 //两个数的最大公约数和最小公 ...
- JDK动态代理例子
JDK动态代理的代理类必须实现于接口.如果要代理类,则使用CGLIB代理. 先定义一个接口: public interface Character { public void show(); } 接着 ...