本书先在阐述泛型基本概念的基础上,比较详细和全面地介绍C++泛型实现的基本技术和基本机制,然后介绍STL的泛型实现技术及其应用方法。本书在内容选材及编写上注意泛型以及STL初学者的特点,语言通俗易懂,精练而不枯燥;以仿真的方式介绍STL的核心内容,从而达到理论和应用并重的学习效果。
本书是一本理论和应用兼顾,适合泛型设计及STL初学者阅读的读物,鉴于它的特点,也适合作为在校计算机专业、软件工程专业或与之相关专业的教材。
不止一次被问: 什么是泛型?什么是STL?泛型与STL有关系吗?
泛型和STL不仅有关系,而且有很重要的关系: 泛型是一种设计思想,而STL则是泛型思想在C++上所取得的成果。
所谓泛型就是一种更抽象、更宽泛的数据类型,用术语来说就是参数化了的数据类型,通俗点说就是一种“通用”数据类型。泛型就是企图使用这种“通用”类型来摆脱数据类型对代码复用的限制,从而提高软件开发效率。而C++则依靠它的模板技术实现了泛型思想,C++把常用的模板都制作成便于用户应用的例程提供在模板类库中,这个模板类库就叫做STL(Standard Template Library)。所以可以这样说: STL是泛型思想的C++实现。
泛型是不是很难?本科生有必要学习它吗?
泛型并不难,它实质上是人们把计算机语言向人类语言发展的一个重要步骤。也就是说,泛型更接近人类语言,所以从应用的角度来说它一点都不难。但是,要想把泛型(在C++中就是模板及其应用技术)的工作机理弄明白也不是一件简单的事情,因为一般人很少能直接接触到数据类型的推导和处理这些以前全部由编译器做的工作,除非他搞过系统软件的设计。
那么本科生有必要学习它吗?能把STL学明白吗?
作者的回答是: 绝对有必要,因为它很有用,在各方面都很有用。
首先,STL极具应用价值,因为大量的常规数据结构的维护管理工作它都自动完成了,用户可以把自己的精力完全集中于自己的业务逻辑上来,从而极大地提高应用程序的开发效率。
其次,由于STL是泛型设计的一个典型实现,而泛型设计又是软件发展的一个重要方向,因此作为打基础的本科学习阶段,学生必须对泛型设计的相关概念及技术具有一定程度的了解。特别是学习C/C++语言程序设计之后,完全有必要让学生在对面向对象和面向过程程序设计思想混合应用的STL进行一番设计思想的学习和体验,从而从更深层次的角度看待上述两个思想。
另外,从程序设计技术层面上看,STL不仅极具实用性,而其极具观赏性,从而对学生也是一个工程美学的熏陶和训练。
也有很多人问: 作为一个泛型库(这里是STL)的使用者,用得着去学习和理解那些复杂的泛型机制和泛型技术吗?这个问题不太好回答,因为泛型机制的形成以及泛型例程库的建设都是围绕着数据类型的处理展开的,并且数据类型的处理工作都是由编译器完成的,故除非是进行泛型库例程设计,否则作为泛型库例程的使用者确实很少会直接接触本书前两章的内容。这跟开汽车一样: 我只想开车上班,从来没想过修汽车和造汽车,那么我有必要去学习汽车原理和制造技术吗?当然,如果你与汽车这个行业无关,你可以这样做,但如果你和汽车行业有关,而且很紧密,那么这个问题就见仁见智了。如果这个问题非得让我回
答的话,那就是学一些为好,特别是在做学生的学习阶段,因为在泛型技术中体现出了很多程序设计的思想。
总之,积作者数十年的经验,作者认为本科生有必要学习泛型设计和STL。
本书是作者在泛型程序设计和STL教学多年经验总结基础上编撰而成一本教材。本书分为三部分: 第1~3章为第一部分;第4章为第二部分;第4~8章则为第三部分。
第一部分又分为两个部分: 第1章和第2章是一部分;第3章单独为一个部分。在第1章和第2章介绍泛型的概念,C++泛型技术基础以及机制基础,这部分内容大致属于STL库代码设计范畴,是理解及将来进一步研究C++泛型的重要基础。由于这部分比较偏向理论,所以为了便于初学者掌握,采取了用实际代码引领理论的讲解方式,并兼顾与前期学习的C/C++的平滑过渡,特别适合本科生学习。第3章则在前两章的基础上介绍STL及其与C/C++之间的关系,然后重点复习STL所使用的除了模板之外的C++技术,并以此为基础介绍这些技术在STL的应用,从而与第1章与第2章共同形成学习STL的基础。
第4章虽然只是一章,但其地位却非常重要,是本书的“眼”,它实现了从泛型理论到C/C++泛型实现的过渡。第4章从STL的六大基础部件之中,把最重要的容器、迭代器和通用算法提取出来,并将它们作为STL“三大件”进行单独的仿真设计。其目的是使学生通过仿真从代码实现的层次上理解泛型及泛型的意义,同时在学习C/C++程序设计之后在教材和教师的带领之下,进行这种规模比较大的程序设计对学生也是一个极好的训练,特别是迭代器的设计中所遵循的思想及其采用的设计技术,都会使学生受益匪浅。
从第5章开始便进入本书的第三部分,这部分主要就是对STL部件应用的介绍和讲解,操作内容明显变多。但需要注意的是,通用算法、适配器和容器内存空间配置器的介绍还是接触了一些理论性内容的。
本书是一本理论和应用兼顾,为泛型设计及STL初学者阅读的读物,鉴于它的特点,也适合作为在校计算机专业、软件工程专业或与之相关专业的教材。
本书的作者为任哲、房红征和张永忠,任哲负责全书统稿工作。
在本书的编写过程中,作者参阅了大量的参考文献及网上资料,并引用了一些相关文字和例程,在此谨向这些文献与资料的作者表示衷心的谢意。
由于作者水平有限,尽管很努力,但书中一定还会有很多错误和不尽如人意之处,在此敬请各位读者指出并不吝赐教,作者将不尽感谢。
最后,祝各位读者学习进步。
作者2015年12月
第1章C++泛型技术基础——模板/1
1.1泛型与模板/1
1.1.1泛型的基本概念/1
1.1.2C++模板及其定义/3
1.1.3几点说明和小结/7
1.2关于模板参数/10
1.2.1模板参数的种类/10
1.2.2模板形参和实参的结合/14
1.3特化模板和模板具现规则/16
1.3.1特化(特例化)模板/16
1.3.2模板的具现/19
1.4右值引用与模板/22
1.4.1右值引用/22
1.4.2右值引用的应用1——转移
语义/25
1.4.3右值引用应用2——转移函数
move()/30
1.4.4右值引用应用3——参数完美转发
模板/31
第2章C++泛型机制的基石——数据类型表/39
2.1类模板的公有数据类型成员/39
2.1.1类的数据类型成员/39
2.1.2再谈typedef/41
2.2内嵌式数据类型表及数据类型衍生/42
2.3数据类型表/44
2.3.1数据类型表的概念/44
2.3.2数据类型表的应用/47
2.4特化数据类型表/51
2.5STL中的Traits表/54
第3章STL及其使用的其他C++技术/61
3.1初识STL/613.1.1STL是C++标准库中的模板
类库/61
3.1.2STL应用程序示例/61
3.2STL常用的C++技术/65
3.2.1运算符重载/66
3.2.2函数对象(仿函数)/72
3.2.3lambda表达式/74
3.3智能指针/80
3.3.1智能指针的基本原理/81
3.3.2C++11支持的智能指针/86
第4章模拟STL三大件/90
4.1容器/90
4.1.1向量vector的仿真MyVector/90
4.1.2列表list的仿真MyList/95
4.2迭代器/101
4.2.1使用裸指针作为迭代器/102
4.2.2迭代器是指针的类封装/105
4.2.3迭代器的代码隔离作用/112
4.2.4STL迭代器的种类/115
4.2.5迭代器的种类标记/116
4.2.6STL对迭代器的管理/122
4.3通用算法/125
第5章容器及其应用/134
5.1向量vector/134
5.2列表list/141
5.3双向队列deque/144
5.4STL关联式容器/148
5.5map容器/152
5.5.1map容器的定义/152
5.5.2map的数据插入/156
5.5.3map容器的其他常用成员
方法/160
5.5.4multimap容器/164
5.6set容器/165
5.7hash表基础及hash容器/167
5.7.1hash表基础/167
5.7.2hash容器/168
第6章通用算法/171
6.1通用算法的参数/171
6.1.1算法的迭代器参数/171
6.1.2辅助参数/179
6.1.3谓词参数/180
6.2算法时间复杂度/188
6.3常用通用算法/189
6.3.1查找和搜索算法/189
6.3.2变异算法/202
6.3.3排序算法/226
6.3.4算术算法与关系算法/241
6.3.5排列组合与集合算法/252
第7章适配器模式在STL基础部件上的应用/256
7.1适配器/256
7.2STL容器适配器/258
7.2.1stack适配器/259
7.2.2queue适配器/264
7.2.3priority_queue适配器/265
7.3迭代器适配器/275
7.3.1插入迭代器/275
7.3.2反向迭代器/280
7.3.3IO流迭代器/284
7.4函数对象适配器/291
7.4.1函数对象的适配/291
7.4.2函数对象配接器/294
第8章STL容器内存空间配置器/302
8.1内存空间配置器及其设计基础/302
8.1.1什么是内存空间配置器/302
8.1.2内存空间配置器设计基础/303
8.2STL空间配置器接口/307
8.2.1STL空间配置器接口及最简单
的空间配置器/307
8.2.2典型STL容器空间的配置/311
8.3内存池的概念及应用/321
8.3.1内存池的规划/321
8.3.2内存池的设计/323
附录A关于关键字explicit/338