数据结构与算法一直是计算机科学与技术专业的核心课程,数据结构描述数据的组织方式,算法则在此基础上搭建高效的求解方法。STL(Standard Template Library,标准模板库)是运用泛型编程思想实现的C++?模板库,提供了包括容器、算法、迭代器等在内的丰富组件,涵盖和实现了大多数的数据结构以及诸多通用泛型算法。本书共10章,全面系统地介绍了C++?的模板技术、输入/输出流、字符串、容器以及各类通用算法、函数对象、数值数组等内容,并通过大量的示例及分析使读者理解并应用数据结构与算法的STL实现,体会STL的精妙设计。
本书配套提供了课件、示例程序、习题解答等教辅材料,精心设计了许多教学提示和知识总结。对于学习数据结构与算法和C++?泛型编程的大专院校计算机专业本科生及研究生来说,本书非常适合作为他们的数据结构教材或教学参考书;对于相关的专业技术人员而言,本书也是一本很好的参考读物。
C++ STL(标准模板库)是C++?标准库的重要组成部分,应用非常广泛,集中体现了C++?泛型编程的思想,以模板的形式提供了对数据结构的封装以及对常用算法的实现。在STL提供的组件中,容器、迭代器和算法被认为是STL的三大件。正所谓“不要重复发明轮子”,运用这些组件进行程序开发可以避免重复实现简单的容器与常用算法,使得代码的执行效率、可维护性大大提高。但是一方面,许多人只关心如何使用STL标准模板库,而不理解其背后的设计方法和理论基础;另一方面,在大学的数据结构和算法课程中,学生听懂了理论知识但在实践中却难以入手。因此,本书力求从应用的角度去讲STL的用法,再从基础的角度去探讨STL的设计,说明数据结构与算法知识的实现;使读者不仅要会使用轮子,也要能一窥轮子的究竟。
本书是作者在长期从事C++?泛型程序设计和数据结构与算法课程的教学过程中,总结教学经验,充分结合课程需要与学生实际学习效果编撰而成的一本教材。全书分为十章:
第一章介绍STL的背景知识与组件构成。
第二章介绍泛型编程的思想以及C++?模板技术、模板特化与操作符重载。
第三章介绍STL的输入/输出流,包括标准输入/输出流、文件输入/输出流与字符串输入/输出流。
第四章介绍字符串类的创建、迭代器、元素访问、修改及查找等常用功能。
第五章是全书的一个重要章节,介绍了STL的重要组件——容器,从底层数据结构的角度出发,通过大量示例与代码分析及实验验证等环节,引领读者逐步掌握并灵活运用STL的各类通用容器,包括顺序容器(vector、deque、list)、关联容器(set、map、unordered_set等)及容器适配器(stack、 priority_queue)。
第六章是全书后半部分关于STL泛型算法知识的总概性章节,介绍了迭代器、谓词与算法分类。
第七章介绍了非可变序列算法,包括用于循环、查询、计数与比较的泛型算法。
第八章介绍了可变序列算法,包括但不限于写入类的copy、transform、swap、fill、generate、replace算法以及重排类的move、unique、reverse、rotate、partition、random_shuffle等算法。
第九章单独介绍了排序类的相关算法以及在有序集基础上的操作算法。
第十章介绍了用于数值计算的数值算法以及预定义函数对象和数值数组类。
应该说,最好的学习方法就是实践和练习,因此本书采取了代码引领理论的讲述方式。全书提供了大量的例程,这些例程代码在编译后都可以运行,每个例程的输出结果都做了说明,对例程的关键代码还进行了重点分析与阐述。围绕典型数据结构的STL实现,本书从多角度去分析不同容器的实现方式和底层数据的组织方式,适时地给出一些图表和数据结构基础知识的回顾并加以综合理解;围绕典型算法实现,本书在介绍算法功能及调用形式的基础上,尝试对部分算法进行分析与拆解,跟读者一道去领会算法的设计思想、代码逻辑和算法效率,从而获得程序设计能力的提升。
在本书的编写过程中,作者参阅了相关参考文献及网络资料,并引用了一些相关文字和例程,在此谨向这些文献资料的作者表示衷心的感谢。
由于作者水平有限,时间紧迫,书中难免存在疏漏,在此恳请各位读者指出并不吝赐教,不胜感激。
如需查看本书配套资源,可扫描封底二维码,上网获取。
第一章 C++?STL概述 1
1.1 C++?STL导言 1
1.2 STL组件 2
1.2.1 标准模板库的三大件 2
1.2.2 STL的其他组件 3
1.3 泛型编程与STL 4
1.4 STL的头文件 4
1.5 STL的命名空间 5
本章小结 6
课后习题 6
第二章 C++?STL技术基础 8
2.1 泛型与模板 8
2.2 函数模板 9
2.3 类模板 13
2.3.1 类模板的定义 13
2.3.2 类模板实例化 15
2.3.3 类模板的其他语法规则 16
2.3.4 类模板派生 17
2.4 模板特化 18
2.4.1 函数模板特化 19
2.4.2 类模板特化 20
2.5 操作符重载 22
本章小结 25
课后习题 26
第三章 C++?STL输入/输出流 28
3.1 STL中的I/O流类 28
3.2 标准输入/输出流类 29
3.3 文件I/O流 32
3.4 字符串I/O流类 38
本章小结 41
课后习题 41
第四章 C++?STL String 44
4.1 字符串的创建 44
4.2 字符串迭代器 45
4.2.1 字符串迭代器的定义 45
4.2.2 字符串迭代器的赋值 45
4.2.3 字符串迭代器的运算 46
4.3 字符串容量 47
4.4 访问字符串的元素 49
4.5 修改字符串 49
4.5.1 用于修改字符串的相关成员函数 49
4.5.2 修改字符串——assign赋值 50
4.5.3 修改字符串——追加 51
4.5.4 修改字符串——插入与删除 52
4.5.5 修改字符串——替换与交换 53
4.6 字符串对象上的操作 54
4.6.1 字符串对象上的操作函数 54
4.6.2 字符串操作——Cstring 55
4.6.3 字符串操作——查找 56
4.6.4 字符串操作——取子串substr() 58
4.7 字符串综合举例 59
本章小结 61
课后习题 61
第五章 C++?STL容器 64
5.1 STL容器概述 64
5.2 顺序容器 65
5.2.1 vector向量容器 66
5.2.2 deque双端队列容器 75
5.2.3 list链表容器 78
5.3 关联容器 82
5.3.1 集合set与多重集合multiset 83
5.3.2 映射map与多重映射multimap 86
5.3.3 unordered_set容器与unordered_multiset容器 92
5.3.4 unordered_map容器与unordered_multimap容器 96
5.4 容器适配器 98
5.4.1 栈适配器 99
5.4.2 队列queue 101
5.4.3 优先队列(priority_queue) 104
5.5 似容器 110
本章小结 114
课后习题 114
第六章 C++?STL通用算法与迭代器 117
6.1 通用算法概述 117
6.2 迭代器的分类 118
6.3 预定义迭代器 119
6.3.1 插入迭代器 119
6.3.2 流迭代器 121
6.3.3 反向迭代器 122
6.3.4 移动迭代器 122
6.4 算法形参与谓词 123
6.5 通用算法分类 126
本章小结 127
课后习题 127
第七章 C++?STL非可变序列算法 131
7.1 非可变序列算法概述 131
7.2 循环算法 132
7.3 查询算法 135
7.4 计数算法 144
7.5 比较算法 146
本章小结 156
课后习题 156
第八章 C++?STL可变序列算法 159
8.1 可变序列算法概述 159
8.2 写入算法 161
8.3 重排算法 172
本章小结 186
课后习题 186
第九章 C++?STL排序相关算法 189
9.1 排序算法sort 189
9.2 第n位的元素算法nth_element 192
9.3 二分搜索算法binary_search 194
9.4 有序集操作算法 197
本章小结 202
课后习题 203
第十章 STL数值算法相关 206
10.1 数值算法 206
10.2 预定义函数对象 210
10.3 数值数组类valarray 213
本章小结 228
课后习题 228
参考文献 231