<<STL源码剖析>> 侯捷著
很早就买了这本书, 一直没看, 现在在实验室师兄代码的时候发现里面使用了大量泛型编程的内容, 让我有了先看看这本书的想法.
看之前我对于泛型编程了解甚少, STL倒使用的比较熟练. 看完这本书之后, 只能表示以前对于STL的使用真是跟小孩玩似得, 只懂其冰山一角. 在真正的深入到源码之后, 对于STL中不容易理解的部分如 迭代器(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的设计思想及源代码之后, 你会发现其实都很简单, 正如作者所说, 源码面前, 了无秘密!
阅读STL源码除了上述的好处外, 还有一个最大的收货就是学习一流的泛型编程技术. STL中利用C++提供的模板推到机制而实现的Traits编程技术, 简直是让人佩服到五体投地, 而利用Traits编程技术来提高泛型算法的效率在STL实现中更是随处可见, 最经典的就是STL算法 copy 的实现, 这个copy可不简单, 可不是像你们想的那样傻瓜式的一个一个拷贝, Traits编程在copy中得到了最好的体现, 具体的实现你们去看书吧, 一定会让你们对大师的智慧佩服到五体投地.
最后, 通过学习各类容器的实现, 能学到不少数据结构的知识, deque的实现可不是简单的数组或者链表, stack和queue底层都是以deque来实现的. RB-Tree的实现相当经典, 作者也花了大量的笔墨进行讲解. 另外, STL中关于内存管理的设计也相当有讲究, 务必是要使效率达到最大化, 平时看STL算法原型的时候经常看到一个参数 Alloc , 没错, 这个就是关于内存管理的参数了, 默认提供的alloc对内存的管理非常高效, 并不是简单的malloc, free. 想要一探究竟, 那就去看看这本书吧,
源码之前, 了无秘密!