《C++STL基础及应用》全面系统地介绍标准模板库(STL)泛型应用开发技术。基础知识部分包括模板、迭代器、输入输出流、字符串、函数对象、通用容器、非变异算法、变异算法、排序等;集成应用部分包括STL算法的综合应用、在数据结构中的应用、在Visual C++上的应用等。《C++STL基础及应用》从应用出发,每章都包含大量的示例和详细的结果分析,旨在使读者学会STL各个知识体系的应用方法,体会STL思维的巧妙之处。对某些稍难示例的设计思想也做了详细的说明。
《C++STL基础及应用》可作为专业技术人员、大专院校计算机专业的本科生、研究生学习C++泛型编程的教材或参考书。《C++STL基础及应用》对编写Java泛型程序也有一定的指导意义。
STL (Standard Template Library,标准模板库)是C++泛型标准化内容的重要组成部分,主要由容器、迭代器和算法三部分组成,其中封装了数据结构中的绝大部分内容。运用STL开发应用程序可以使我们共享各种容器及算法,避免了低层次的各种容器及常用算法的反复开发。在代码一致性、升级、维护等方面都有很大的优越性。因此,学习STL是进行深层次开发C++应用程序的重要途径。但是,目前市场上关于STL的书籍很多是译著,在思考方法上可能与我们的学生不一致,学习起来很吃力。所以,本书力求把多年的STL编程经验按照学生的思维方式进行编排,希望学生们能很快学会STL泛型编程方法,体会STL泛型编程的乐趣。
全书共分11章,第1~10章侧重于基础知识部分,第11章侧重于综合应用部分,内容如下。
第1章介绍STL历史,研究的主要内容,以及本书示例中用到的开发环境。
第2章通过示例说明STL中的内存管理思想,重要的traits模板技术,模板与操作符重载的关系。
第3章介绍STL中引入迭代器的原因,并通过自定义迭代器示例加深理解迭代器的内涵。
第4章介绍标准输入输出流、文件输入输出流、字符串输入输出流。
第5章介绍字符串创建方式及增、删、改、查等常用功能应用方法。
第6章介绍引入函数对象的原因,系统函数对象有哪些,自定义函数对象应用方法。
第7章介绍vector、deque、list、queue、stack、priority_queue、bitset、set和map等通用容器的用法,并强调了容器适配器的作用。
第8~10章主要是讲算法。第8章介绍非变异算法,包括循环、查询、计数、比较等功能;第9章介绍变异算法,包含复制、交换、变换、替换、填充、生成、删除、唯一、反转、环移、随机、划分等功能;第10章介绍排序及相关操作的算法。
第11章侧重于集成应用,包括算法综合应用、在数据结构中应用、在Visual C++中应用三部分。算法综合应用主要介绍在多态、文件解析、综合查询中的STL应用方法;在数据结构中应用介绍全排列、频度、最长公共子序列、大整型数加法、乘法、矩阵、回溯、字符串表达式、图中的STL应用方法。在Visual C++中应用介绍用STL容器存储绘图信息,容器+算法实现数据保存与查询问题,并介绍STL与动态链接库的接口问题等。 C++ STL基础及应用 本书第2、3、6、7、10、11章由金百东编写,第1、4、5、8、9章由刘德山编写。因本书程序较多,全书变量均用正体。
本书内容循序渐进,示例丰富,第1~10章的所有示例复制下来编译后就可以运行。第11章某些程序由于较大,做了简化处理。示例结果都做了必要的说明,对一些稍难的题目,对其设计思想也做了相应的论述,帮助读者加深对STL的理解。
由于作者水平有限,时间紧迫,书中难免有疏漏之处,恳请广大读者批评指正,不胜感激。
编 者2010年6月
第1章 STL概述
1.1 STL历史1
1.2 STL内容2
1.3 建立STL程序的方法3
1.4 命名空间5
第2章 模板
2.1 通过模板初识STL思维7
2.2 traits技术10
2.3 模板与操作符重载14
第3章 迭代器
3.1 什么是迭代器19
3.2 迭代器类位置24
3.3 进一步理解迭代器27
3.4 STL迭代器28
第4章 输入输出流
4.1 标准输入输出流33
4.1.1 插入符与提取符33
4.1.2 get系列函数35
4.1.3 处理流错误36
4.2 文件输入输出流38
4.2.1 文件打开38
4.2.2 文件关闭38
4.2.3 文件读写38
4.3 字符串输入输出流43
4.4 综合示例44
第5章 字符串
5.1 字符串创建及初始化49
5.1.1 基本创建方式49
5.1.2 迭代器创建方式50
5.2 字符串操作50
5.2.1 插入操作50
5.2.2 替换操作51
5.3 字符串查询52
5.4 字符串中删除字符54
5.5 字符串比较54
5.6 综合示例55
第6章 函数对象
6.1 简介61
6.1.1 为何引入函数对象61
6.1.2 函数对象分类62
6.1.3 简单示例63
6.2 一元函数64
6.3 二元函数66
6.4 系统函数对象68
6.4.1 算术类函数对象69
6.4.2 关系运算类函数对象72
6.4.3 逻辑运算类函数对象74
6.4.4 函数适配器74
6.5 综合示例79
第7章 通用容器
7.1 概述83
7.1.1 容器分类83
7.1.2 容器共性84
7.1.3 容器比较85
7.2 vector容器85
7.2.1 概述85
7.2.2 初始化示例86
7.2.3 增加及获得元素示例88
7.2.4 修改元素示例92
7.2.5 删除元素示例93
7.2.6 进一步理解vector94
7.2.7 综合操作示例95
7.3 deque容器99
7.3.1 常用函数99
7.3.2 基本操作示例100
7.3.3 综合操作示例102
7.4 list容器104
7.4.1 常用函数105
7.4.2 基本操作示例106
7.4.3 综合操作示例109
7.5 队列和堆栈115
7.5.1 常用函数115
7.5.2 容器配接器116
7.5.3 基本操作示例117
7.5.4 综合操作示例120
7.6 优先队列123
7.6.1 常用函数123
7.6.2 基本操作示例124
7.6.3 综合操作示例125
7.7 bitset容器128
7.7.1 常用函数:128
7.7.2 基本操作示例129
7.7.3 综合操作示例132
7.8 集合135
7.8.1 常用函数135
7.8.2 基本操作示例136
7.8.3 综合操作示例139
7.9 映射142
7.9.1 常用函数142
7.9.2 基本操作示例143
7.9.3 综合操作示例145
7.10 再论迭代器150
第8章 非变异算法
8.1 循环155
8.1.1 主要函数155
8.1.2 示例分析156
8.2 查询160
8.2.1 主要函数160
8.2.2 示例分析163
8.3 计数171
8.3.1 主要函数171
8.3.2 示例分析172
8.4 比较174
8.4.1 主要函数174
8.4.2 示例分析175
第9章 变异算法
9.1 复制180
9.1.1 主要函数180
9.1.2 示例分析181
9.2 交换182
9.2.1 主要函数182
9.2.2 示例分析183
9.3 变换184
9.3.1 主要函数184
9.3.2 示例分析185
9.4 替换188
9.4.1 主要函数188
9.4.2 示例分析190
9.5 填充191
9.5.1 主要函数191
9.5.2 示例分析192
9.6 生成193
9.6.1 主要函数193
9.6.2 示例分析194
9.7 删除199
9.7.1 主要函数199
9.7.2 示例分析200
9.8 唯一204
9.8.1 主要函数204
9.8.2 示例分析205
9.9 反转207
9.9.1 主要函数207
……
第10章 排序及相关操作
第11章 STL应用
参考文献
(1)序列性容器:按照线性排列来存储某类型值的集合,每个元素都有自己特定的位置,顺序容器主要有vector、deque和list。
vector:就是动态数组。它是在堆中分配内存,元素连续存放,有保留内存,如果减少大小后内存也不会释放。新值大于当前大小时才会再分配内存。对最后元素操作最快(在后面添加删除最快),此时一般不需要移动内存。只有保留内存不够时,才需要对中间和开始处进行添加删除元素操作,这时需要移动内存,如果你的元素是结构或是类,那么移动的同时还会进行构造和析构操作。vector的一大特点是可直接访问任何元素。
deque:与vector类似,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间。与vector不同的是,deque还支持从开始端插入、删除数据。由于它主要对前端、后端进行操作,因此也叫做双端队列。
list:又叫链表,是一种双线性列表,只能顺序访问(从前向后或者从后向前),与前面两种容器类有一个明显的区别就是它不支持随机访问。要访问表中某个下标处的项需要从表头或表尾处(接近该下标的一端)开始循环。