<<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源代码剖析 读书总结的更多相关文章

  1. STL源代码剖析(一) - 内存分配

    Allocaor allocator 指的是空间配置器,用于分配内存.STL中默认使用SGI STL alloc作为STL的内存分配器,尽管未能符合标准规格,但效率上更好.SGI STL也定义有一个符 ...

  2. STL源代码剖析——STL算法stl_algo.h

    前言 在前面的博文中剖析了STL的数值算法.基本算法和set集合算法.本文剖析STL其它的算法,比如排序算法.合并算法.查找算法等等.在剖析的时候.会针对函数给出一些样例说明函数的使用.源代码出自SG ...

  3. STL源代码剖析——基本算法stl_algobase.h

    前言 在STL中.算法是常常被使用的,算法在整个STL中起到很关键的数据.本节介绍的是一些基本算法,包括equal.fill.fill_n,iter_swap.lexicographical_comp ...

  4. 《STL源代码剖析》---stl_deque.h阅读笔记(2)

    看完,<STL源代码剖析>---stl_deque.h阅读笔记(1)后.再看代码: G++ 2.91.57,cygnus\cygwin-b20\include\g++\stl_deque. ...

  5. STL源代码剖析——STL算法之set集合算法

    前言 本节介绍set集合的相关算法,各自是并集set_union,差集set_difference,交集set_intersection 和对称差集set_symmetric_difference.这 ...

  6. STL源代码剖析(二) - 迭代器与traits技法

    提要 先看一段用迭代器的代码: int a[] = {1, 2, 3, 4, 5}; vector<int> v1( a, a+5); vector<int>::iterato ...

  7. STL源代码剖析 容器 stl_map.h

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie map ------------------------------------------ ...

  8. STL源代码剖析 容器 stl_list.h

    本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie list ----------------------------------------- ...

  9. STL源代码剖析 容器 stl_stack.h

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie stack ---------------------------------------- ...

随机推荐

  1. php 依据字符串生成相应数组方法

    php 依据字符串生成相应数组方法 比如: <?php $config = array( 'project|page|index' => 'content', 'project|page| ...

  2. go中string和slice no-copy转换

    在go里面,string和slice的互换是需要进行内存拷贝的,虽然在底层,它们都只是用 pointer + len来表示的一段内存. 通常,我们不会在意string和slice的转换带来的内存拷贝性 ...

  3. hadoop多文件输出

    现实环境中,经常遇到一个问题就是想使用多个Reduce,可是迫于setup和cleanup在每个Reduce中会调用一次,仅仅能设置一个Reduce,无法是实现负载均衡. 问题,假设要在reduce中 ...

  4. 概率dp ZOJ 3640

    Help Me Escape Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit ...

  5. File类的使用

    java.io.File 类用于表示文件(目录) File类只用于表示文件(目录)的信息(名称.大小等),不能用于文件内容的访问 file类常用的api package com.zhb.java; i ...

  6. 【问题备注】VS2012不能输入代码,文字…

    第一次遇到,非常奇怪,一个项目,VS2012能正常打开,但是不能输入代码. 对比分析发现,其他项目能正常work.在于一个问题就是,VS2012 右下角有个INS一直在转一直analyzing,而正常 ...

  7. 前端--关于css选择器

    css选择器就好像表达式一样,返回一组或者一个html元素,后面的样式声明块应用到返回的元素上.所以可以把css选择器理解为某个或者某一类html元素的抽象的写法. 在讲具体的各种选择器之前要提一下选 ...

  8. Android零碎知识点总结

    1 简单的跨进程通信可以用Messenger类,不用AIDL. 2 当一个Service没有action时,它默认是exported="false"的,其它进程用它的包名和类名构造 ...

  9. OpenCV——使用ROI进行图像切割

    ROI(region of interest)——感兴趣区域. 1.用途 这个区域是图像分析所关注的重点.圈定这个区域,以便进行进一步的处理.而且,使用ROI指定 想读入的目标,可以减少处理时间,增加 ...

  10. HttpURLConnection详解

    HttpURLConnection详解 07. 五 / J2EE / 没有评论   HttpURLConnection类的作用是通过HTTP协议向服务器发送请求,并可以获取服务器发回的数据. Http ...