注册 | 登录读书好,好读书,读好书!
读书网-DuShu.com
当前位置: 首页出版图书科学技术计算机/网络软件与程序设计其他编程语言/工具STL源码剖析

STL源码剖析

STL源码剖析

定 价:¥68.00

作 者: 侯捷著
出版社: 华中科技大学出版社
丛编项: 侯捷译作系列
标 签: STL

ISBN: 9787560926995 出版时间: 2002-06-01 包装: 胶版纸
开本: 23cm 页数: 493 字数:  

内容简介

  身为C++标准库最重要的组成部分,STL(标准模板库)不仅是一个可复用组件库,而且是一个包罗算法与数据结构的软件框架(framework)。“框架”这个词,本身就有庞大、稳定、完整而可扩展的涵义。软件框架,则是用一行行精细准确的源码,构造一个庞大、稳定、完整而可扩展的软件架构,稍有软件开发经验的人都知道,要做到这些,谈何容易! STL在1994年走入C++标准,使得原本即将推出的C++标准延迟4年问世而无怨无悔,并为之对内容做巨幅改进,而今STL不仅为千千万万C++程序员所日常运用,而且获得极高的学术赞誉,成为了一个典范,一种境界。作为一个软件框架,STL所取得的成功,实在可以用“辉煌”来形容,其所内涵的软件思想和技术经验,更是无比的深厚与精致。学习编程的人都知道,阅读剖析名家代码乃是提高水平的捷径。源码之前,了无秘密,大师们的缜密思维,经验结晶,技术思路,独到风格,都原原本本地体现在源码之中。在你仔细推敲之中,迷惑不解之时,恍然大悟之际,你的经验、思维、视野、知识乃至技术品味都会获得快速的成长。特别是面对STL这样优秀而普遍的作品,无论你是为了满足作为程序员第二天性的求知欲,还是在日常工作中解决实际问题,总会有一天,你会打开一个叫做或者的头文件,想把STL背后的秘密看个究竟。英文里有一个常用短语,叫做“under the hood”,钻进魔术师的帐篷,屏住呼吸,瞪大眼睛,把那些奇妙的魔法看个通透,让自己的理解和技艺获得巨幅的提升,这种诱惑,任何一个程序员都无法抵挡!不过,想要研读STL源码,绝对没有那么简单。STL是精致的软件框架,是为优化效率而无所不用其极的艺术品,是数据结构与算法大师经年累月的智慧结晶,是泛型思想的光辉诗篇,是C++高级技术的精彩亮相,这些灿烂的赞誉,体现在数万行源码里,对于一个初涉此道的学习者来说,就是一个感觉:“难!”。无论你是会浅尝辄止地退出这次探险,还是勇敢地向浓雾中前进,当你受困于STL精致的大网之中,为那些迷一般的结构和动作感到茫然无措的时侯,所有人都会冒出一个念头:“如果有这样一本书,既能够提纲挈领,为我理顺思绪,指引方向,同时又能够照顾小节,阐述细微,帮助我更快更好地理解STL源码,那该有多好!”望着长长的STL著作列表,一个“真正”的C++程序员,多少会有一点遗憾。自从STL问世以来,出版了大量的书籍,帮助读者了解它的思想,学习它的用法,掌握它的技巧。其中佼佼者如Matt Austern的《Generic Programming and STL》,Nicolai Josuttis的《The C++ Standard Library》,Scott Meyers的《Effective STL》,已成C++经典名著。然而,定位在引导学习者进行STL源码分析的著作,可以说是凤毛麟角。毕竟,既要能高屋建瓴,剖析大架构,不为纷繁琐碎之细节而迷乱,又能具体而微,体现细致之处的精妙缜密,不因为宏大体系而失之粗略,无论对于专家高手还是技术作者,都是太难达到的目标。读了这本《STL源码剖析》之后,我认为,这个遗憾终于被补足了!本书的作者侯捷先生是蜚声海峡两岸的著名IT技术作家,在C++,Windows系统原理,泛型理论和STL等技术领域有极深的造诣。然而,侯先生最令人称道之处,乃是他剖析大架构的能力。所谓剖析大架构,就是要在洋洋洒洒数以万行计的源码中,精准定位,抽取核心观念,高屋建瓴,纲举目张,将看上去乱麻一般的源码梳理得头绪清晰,条理分明,同时又照顾细节,参透精微,把一个个关键动作阐述得通通透透,这种能力,我以为至少在华人技术作者中,侯先生堪执牛耳。在他的名作《深入浅出MFC》中,侯先生将自己这方面的能力展现得淋漓尽致,而在这本《STL源码剖析》中,我们又看到了一次更加精彩的表现。我有机会作为大陆最早的几个读者之一,详细拜读了侯先生的这本最新STL专著,感到了一种强烈的技术冲动,说得俗一点,就是觉得很过瘾!具体来说,我以为这本书至少有四大特点,使它成为我所见过的最出色的一本STL源码剖析类著作。首先,选材精当,立足高远。STL是一个标准,因而有各种实作版本。本书所剖析的SGI STL,可以说是设计最巧妙,思想最深刻,获得赞誉最盛,认同最广的STL实作。当然,这份出自STL之父Alex Stepanov,以及Matt Austern,David Musser等巨匠之手的经典作品,剖析阐述起来自然也需要花费更大的心力。侯先生籍其扎实的理论与技术素养,毅然选择这份作品来剖析,是需要极大勇气与自信的。同样,本书对读者的预期,也是很高的,不但要有扎实的基本功,更要有掌握STL的兴趣与坚韧意志。读这本书,你可以有充分的信心,学到的是超一流大师的思想和经验,所谓名门正派,高屋建瓴。其次,脉络清晰,组织顺序匠心独具。任何人打算系统阅读STL源码,所必须作出的第一个决定就是,从何处开始?我在初读此书时,一个最疑惑的地方就是候先生居然把allocator放在所有组件之前讲述。要知道,allocator这个东西,对一般的使用者完全透明,根本感觉不到其存在,以至于在名著《The C++ Standard Libaray》中,Nicolai Josuttis将这一部分放在全书最后。既然如此,又何必让这个无名小卒占据头版头条?我一开始还真是不理解。直到后来,我自己有一些扩展STL的实践,才发现,用的时候你固然可以对allocator不闻不问,但一旦要领悟STL的工作原理,或者要自己扩展STL的功能,则对于allocator的掌握几乎是第一先决条件。不了解allocator,则无论剖析也好,扩展也罢,必然处处碰壁。侯先生毫不迟疑,首先帮读者搬开这块绊脚石,理出头绪,实在是匠心独具。紧接着的第三章iterator及traits,直入STL的核心观念与关键技术,剑走中锋,直取要害,高举高打,开诚布公,直接把理解STL的钥匙交道读者手上。此章一过,读者神气完足,就可以大刀阔斧地打通STL的重重关隘。此布局只要稍有变化,读者的学习难度势必猛增。侯先生的此种安排,实在是大家手笔!此外,本书在技术上迎难而上,详略得当,完整而重点突出。了解SGI STL的读者都知道,这份作品对C++标准中的STL做了大量的扩充,增加了专用的高效allocator,用以操作巨型字符串的rope,单链表slist,以及万众企盼的hash容器等等,再加上STL本身就有很多精微之处,技术上的难点不少。此类书籍的作者,但凡稍有一丝懈怠之心,大可以冠冕堂皇地避重就轻。然而侯先生在此书中对重点难点毫不避讳,无论是标准功能还是非标准功能,只要对读者理解STL架构有益,只要有助于提高读者的技术,增长读者的视野与经验,书中必然不畏繁难,将所有技术细节原原本本和盘托出。另一方面,所谓剖析源码,其目的在于明理,解惑,提高自身水平,并不是要穷经皓首,倒背如流。因此,一旦道理讲清楚,书中就将重复与一般性的内容一笔带过,孰轻孰重,一目了然,详略十分得当,这一点对于提高读者的学习效率,有着巨大的意义。最后一点,本书通过大量生动范例和插图讲解基本思想,在同类书籍中堪称典范。虽然我把这一点放在最后,但我相信大部分读者站在书店,随手翻过这本书,得到的第一印象便是这一点。STL之所以为大家所津津乐道,除了其思想深刻之外,最大的因素是它实用。它所包装的,是算法与数据结构的基本功能。作为一个程序员,如果你是做数据库编程的,大可以不懂汇编语言,如果你是写驱动程序的,大可以不必通晓人工智能,写编译器的可以不用懂什么计算机图形学,操作系统内核高手的不用精通网站架设,然而,如果你不懂数据结构与算法的基础知识,不具备数据结构与算法的基本技能,那就完全丧失称为一个程序员的资格!市面上讲述算法与数据结构的专著汗牛充栋,俯拾皆是。相比之下,本书倒并不是以此为核心目标的。但是,可曾有哪位读者看到任何一本书象本书一样,将红黑树用一张张清晰生动的图解释得如此浅显易懂?所谓一图胜千言,在教授基本数据结构与算法方面,我想不出还有任何一种方法,能够比幻灯般的图片更生动更令人印象深刻了。读过此书的每一位读者,我想都会为书中那一副副插图所打动,作者细致严谨的作风,时刻为读者考虑的敬业精神,也许是更值得我们尊敬的东西。

作者简介

  作者:侯捷台湾资深技术作家、译者。闲静少言。不慕荣利。好读书。求甚解。侯捷先生以为“任何书籍如果缺少读者,再怎么优秀都将丧失价值。因此,做为一位书评人,我非常乐见评选风气兴盛。虽然所谓“喜爱”带有很大的主观成份,但这类评选仍然具有十分正面的价值,可以带给读者、作者、译者、出版者很大的参与感,对于读书风气、好书浮现率都有帮助。”深入浅出MFC(第二版)>>更多作品

图书目录

庖丁解牛(侯捷自序)
目录
前言
    本书定位
    合适的读者
    最佳阅读方式
    我所选择的剖析对象
    各章主题
    编译工具
    中英术语的运用风格
    英文术语采用原则
    版面字形风格
    源码形式与下载
    在线服务
    推荐读物
第1章 STL 概论与版本简介
    1.1 STL 概论        
        1.1.1 STL的历史
        1.1.2 STL与C++ 标准程序库
    1.2 STL 六大组件 - 功能与运用
    1.3 GNU源码开放精神
    1.4 HP STL实现版本
    1.5 P.J. Plauger STL实现版本
    1.6 Rouge Wave STL实现版本
    1.7 STLport 实现版本
    1.8 SGI STL实现版本 总览
        1.8.1 GNU C++ header 文件分布
        1.8.2 SGI STL 文件分布与简介
            STL 标准头文件(无扩展名)
            C++ 标准规格定案前,HP规范的STL头文件(扩展名 .h)
            SGI STL 内部文件(SGI STL真正实现于此)
        1.8.3 SGI STL 的组态设定(configuration)    
    1.9可能令你困惑的C++ 语法            
        1.9.1 stl_config.h 中的各种组态
            组态3:static template member
            组态5:class template partial specialization
            组态6:function template partial order
            组态7:explicit function template arguments
            组态8:member templates
            组态10:default template argument depend on previous template parameters
            组态11:non-type template parameters
            组态:bound friend template function    
            组态:class template explicit specialization    
        1.9.2 临时对象的产生与运用    
        1.9.3 静态常数整数成员在class 内部直接初始化
              in-class static const integral data member initialization
        1.9.4 increment/decrement/dereference 运算子
        1.9.5 "前闭后开"区间表示法 [ )
        1.9.6 function call运算子(operator())
第2章 空间配置器(allocator)
    2.1 空间配置器的标准接口
        2.1.1 设计一个简单的空间配置器,JJ::allocator
    2.2 具备次配置力(sub-allocation)的SGI 空间配置器
        2.2.1 SGI 标准的空间配置器,std::allocator    
        2.2.2 SGI 特殊的空间配置器,std::alloc
        2.2.3 构造和析构基本工具:construct() 和 destroy()
        2.2.4 空间的配置与释放,std::alloc    
        2.2.5 第一级配置器 __malloc_alloc_template 剖析
        2.2.6 第二级配置器 __default_alloc_template剖析
        2.2.7 空间配置函数allocate()
        2.2.8 空间释放函数deallocate()
        2.2.9 重新充填free-lists
        2.2.10 内存池(memory pool)
    2.3 内存基本处理工具
        2.3.1 uninitialized_copy
        2.3.2 uninitialized_fill
        2.3.3 uninitialized_fill_n
第3章 迭代器(iterators)概念与 traits 编程技法                    079
    3.1 迭代器设计思维 - STL关键所在
    3.2 迭代器是一种 smart pointer
    3.3 迭代器相应型别(associated types)
    3.4 Traits 编程技法 - STL源码门钥
             Partial Specialzation(偏特化)的意义
        3.4.1 迭代器相应型别之一value_type
        3.4.2 迭代器相应型别之二difference_type
        3.4.3 迭代器相应型别之三pointer_type
        3.4.4 迭代器相应型别之四reference_type
        3.4.5 迭代器相应型别之五iterator_category
        以advanced() 为例
        消除 "单纯传递调用函数"
        以distance() 为例
    3.5 std::iterator class 的保证
    3.6 iterator相关源码完整重列
    3.7 SGI STL的私房菜:__type_traits
第4章 序列式容器(sequence containers)
    4.1 容器概观与分类
        4.1.1 序列式容器(sequence containers)
    4.2 vector
        4.2.1 vector 概述
        4.2.2 vector 定义摘要
        4.2.3 vector 的迭代器
        4.2.4 vector 的数据结构
        4.2.5 vector 的构造与内存管理:constructor, push_back
        4.2.6 vector 的元素操作:pop_back, erase, clear, insert
    4.3 list
        4.3.1 list 概述
        4.3.2 list 的节点(node)
        4.3.3 list 的迭代器
        4.3.4 list 的数据结构
        4.3.5 list 的构造与内存管理:constructor, push_back, insert
        4.3.6 list 的元素操作:push_front, push_back, erase, pop_front,
             pop_back, clear, remove, unique, splice, merge, reverse, sort
    4.4 deque
        4.4.1 deque 概述
        4.4.2 deque 的中控器
        4.4.3 deque 的迭代器
        4.4.4 deque 的数据结构
        4.4.5 deque 的构造与内存管理 :ctor, push_back, push_front
        4.4.6 deque 的元素操作:pop_back, pop_front, clear, erase, insert
    4.5 stack                                
        4.5.1 stack 概述
        4.5.2 stack 定义式完整列表
        4.5.3 stack 没有迭代器
        4.5.4 以list 做为stack 的底层容器
    4.6 queue
        4.6.1 queue 概述
        4.6.2 queue 定义式完整列表
        4.6.3 queue 没有迭代器
        4.6.4 以list 做为queue 的底层容器
    4.7 heap(隐式表述,implicit representation)
        4.7.1 heap 概述
        4.7.2 heap 算法
             push_heap
             pop_heap
             sort_heap
             make_heap
        4.7.3 heap 没有迭代器
        4.7.4 heap 测试实例
    4.8 priority-queue
        4.8.1 priority-queue 概述
        4.8.2 priority-queue 定义式完整列表
        4.8.3 priority-queue 没有迭代器    
        4.8.4 priority-queue 测试实例    
    4.9 slist                
        4.9.1 slist 概述            
        4.9.2 slist 的节点        
        4.9.3 slist 的迭代器        
        4.9.4 slist 的数据结构        
        4.9.5 slist 的元素操作    
第5章 关联式容器(associated containers)
    5.1 树的导览
        5.1.1 二元搜寻树(binary search tree)
        5.1.2 平衡二元搜寻树(balanced binary search tree)
        5.1.3 AVL tree(Adelson-Velskii-Landis tree)    
        5.1.4 单旋转(Single Rotation)            
        5.1.5 双旋转(Double Rotation)
    5.2 RB-tree(红黑树)            
        5.2.1 插入节点            
        5.2.2 一个由上而下的程序        
        5.2.3 RB-tree 的节点设计        
        5.2.4 RB-tree 的迭代器        
        5.2.5 RB-tree 的数据结构        
        5.2.6 RB-tree 的构造与内存管理    
        5.2.7 RB-tree 的元素操作        
             元素插入动作 insert_equal    
             元素插入动作 insert_unique    
             真正的插入执行程序 __insert    
             调整RB-tree(旋转及改变颜色)    
              元素的搜寻 find        
    5.3 set                
    5.4 map                
    5.5 multiset            
    5.6 multimap            
    5.7 hashtable        
        5.7.1 hashtable 概述    
             线性探测(linear probing)
             二次探测(quadratic probing)
             分离链(separate chaining)    
        5.7.2 hashtable 的桶子(buckets)与节点(nodes)
        5.7.3 hashtable 的迭代器                
        5.7.4 hashtable 的数据结构            
        5.7.5 hashtable 的构造与内存管理            
            插入动作(insert)与表格重整(resize)        
            判知元素的落脚处(bkt_num)    
            复制(copy_from)和整体删除(clear)
        5.7.6 hashtable 运用实例(find, count)
        5.7.7 hash functions            
    5.8 hash_set
    5.9 hash_map
    5.10 hash_multiset    
    5.11 hash_multimap    
第6章 算法(algorithms)    
    6.1 算法概观        
        6.1.1 算法分析与复杂度表示 O( )
        6.1.2 STL算法总览            
        6.1.3 mutating algorithms - 会改变操作对象之值
        6.1.4 nonmutating algorithms - 不改变操作对象之值    
        6.1.5 STL算法的一般形式
    6.2 算法的泛化过程
    6.3 数值算法 <stl_numeric.h>
        6.3.1 运用实例    
        6.3.2 accumulate
        6.3.3 adjacent_difference
        6.3.4 inner_product    
        6.3.5 partial_sum
        6.3.6 power    
        6.3.7 itoa    
    6.4 基本算法 <stl_algobase.h>
        6.4.1 运用实例        
        6.4.2 equal        
              fill        
              fill_n        
              iter_swap        
              lexicographical_compare
              max, min            
              mismatch            
              swap        
        6.4.3 copy,强化效率无所不用其极
        6.4.4 copy_backward         
    6.5  Set 相关算法(应用于有序区间)    
        6.5.1 set_union            
        6.5.2 set_intersection        
        6.5.3 set_difference        
        6.5.4 set_symmetric_difference    
    6.6 heap算法:make_heap, pop_heap, push_heap, sort_heap
    6.7 其它算法                        
        6.7.1 单纯的数据处理                
            adjacent_find
            count     
            count_if     
              find     
              find_if     
              find_end  
              find_first_of
              for_each     
              generate     
              generate_n
              includes (应用于有序区间)    
              max_element        
              merge (应用于有序区间)    
              min_element        
              partition         
              remove
              remove_copy    
              remove_if        
              remove_copy_if    
              replace        
              replace_copy    
              replace_if    
              replace_copy_if
              reverse        
              reverse_copy    
              rotate        
              rotate_copy    
              search        
              search_n        
              swap_ranges    
              transform        
              unique        
              unique_copy    
        6.7.2 lower_bound (应用于有序区间)    
        6.7.3 upper_bound (应用于有序区间)    
        6.7.4 binary_search (应用于有序区间)    
        6.7.5 next_permutation            
        6.7.6 prev_permutation            
        6.7.7 random_shuffle            
        6.7.8 partial_sort / partial_sort_copy    
        6.7.9 sort                
        6.7.10 equal_range(应用于有序区间)    
        6.7.11 inplace_merge(应用于有序区间)    
        6.7.12 nth_element            
        6.7.13 merge sort            
第7章 仿函数(functor,另名 函数对象function objects)
    7.1 仿函数(functor)概观            
    7.2 可配接(adaptable)的关键            
        7.2.1 unary_function            
        7.2.2 binary_function            
    7.3 算术类(Arithmetic)仿函数          
        plus, minus, multiplies, divides, modulus, negate, identity_element
    7.4 关系类(Relational)仿函数            
        equal_to, not_equal_to, greater, greater_equal, less, less_equal
    7.5 逻辑运算类(Logical)仿函数            
        logical_and, logical_or, logical_not
    7.6 证同(identity)、选择(select)、投射(project)    
        identity, select1st, select2nd, project1st, project2nd
第8章 配接器(adapter)                    
    8.1 配接器之概观与分类                    
        8.1.1 应用于容器,container adapters
        8.1.2 应用于迭代器,iterator adapters
             运用实例            
        8.1.3 应用于仿函数,functor adapters
             运用实例            
    8.2 container adapters        
        8.2.1 stack            
        8.2.2 queue        
    8.3 iterator adapters     
        8.3.1 insert iterators    
        8.3.2 reverse iterators
        8.3.3 stream iterators (istream_iterator, ostream_iterator)
    8.4 function adapters                    
        8.4.1 对传回值进行逻辑否定:not1, not2            
        8.4.2 对参数进行系结(绑定):bind1st, bind2nd
        8.4.3 用于函数合成:compose1, compose2(未纳入标准)
        8.4.4 用于函数指针:ptr_fun        
        8.4.5 用于成员函数指针:mem_fun, mem_fun_ref
附录A  参考资料与推荐读物(Bibliography)        
附录B  侯捷网站简介                
附录C  STLport 的移植经验(by 孟岩)    
        Borland C++Builder 5            
        Microsoft Visual C++ 6.0        
索引

本目录推荐