今天,是学习侯捷《STL剖析》的最后一天, 把剩下的两个部分都看完了。 前前后后, 总共花了8天的时间, 今天, 看完的是第五章的hash table, 和第6章算法的剩余部分。
对于hash table, 所要注意的就是如何维护一个vector和相应的lists, 不难看明白。
对于第6章的算法, 大部分都很简单, 不过对于排列, 还是要想一想的, 否则一下子还真看不懂。 在书中,侯捷也只是描述了一下排列的过程, 没有给出一个简单的证明, 来说明为什么STL 的算法会得到相应的结果, 这里我把自己的证明记录一下, 很简单。
假设输入为x = ***abcdef, 这里要注意, a,b, c, d, e, f都是未知变量, 可以为字符如'a', 'b', 'c', ... 或数字如0,1,2,.... 现在所需得到的结果是x的一下个排列y, 这里 y 需要大于x, 即 y > x, 并且 y 相邻与 x . 如何能得到 y 呢? 根据 STL next_permutation()的算法:
第一步,从 x 的尾端开始找一对(i, ii), i < ii, 这里我们假设只有 a, b满足 上诉条件, 同时, 我们也有一个很有用的结果 b > c > d > e > f;
第二步, 从 x 的尾端开始找 j, j 需满足 j > i, 这里假设 j = d, 注意的是 j 后面的 e, f 都小于 i, 我们有 b > c > j=d > a > e > f;
第三步, 交换 j 和 i, 我们可以得到 ***dbcaef ;
第四步, reverse bcaef , 我们可以得到 ***dfeacb, 这就是结果了。
简单的验证一下, 就知道 ***dfeacb是所要的结果: d > a, feacb 是 bcaef 排列中最小的一个, 那么***dfeacb当然是相邻与***abcdef, 并且大于***abcdef, 唯一的一个排列了。
总结一下自己学习的情况:
通观侯捷这本书, 难度不是很大, 否则自己也不可能在9天内看完。
不过, 比较需要花时间看的就是前面2,3章了。这两章所包含的内容贯穿了整本书, 也是STL设计的关键, 毕竟书中的算法, 结构并不是什么新的东西。仔细的看完这两章, 对后面的阅读, 绝对是事半功倍的。 同时, 就我个人而言, 对于学习STL, 这本书最有价值的地方也就是这2, 3章了, 其他的章节, 在需要的时候, 再仔细阅读就即可, 不过前提是对算法和基本的结构有一定的了解。
对于第4,5章, 就内容上来讲, 并没有很多的新意, 相对来说, 有太多的书和文章, 来讨论同样的问题, 但是, 要看懂4,5章, 必要的算法知识还是要准备好, 否则真是一头雾水。 侯捷这本书的最大的好处, 是引导我们阅读SGI STL的源码。 对于算法背后的理论, 这本书都是匆匆而过, 所以并不适合作为算法的学习主要书籍。 如果要学习算法, 还是以CLRS为主, 这本书为辅。 话说回来, 就这两章来说, 一个最大优点就是展现的结构和算法的实现具体细节, 这很好, 也很重要。
对于第6章, 虽然内容都很简单, 但是所列的函数都是很有帮助的, 需要把它们填充进自己的代码库, 以备以后查询。
对于7,8章, 只是知识性的介绍, 看看就可以了。
还是挺感谢侯捷的, 毕竟有一本书来指导自己阅读一份高质量的代码, 比自己埋头苦读, 效率要不知道高多少倍。
看完了这本书, 反而心里好像一下子有点空, 搞不懂。
继续努力学习吧。
1:11:29 PM Wednesday, May 20, 2009