C++ STL
C++ STL
C++ STL
10、STL 实用技术专题................................................................................................. 1
10.1 STL(标准模板库)理论基础............................................................................. 1
10.1.1 基本概念...............................................................................................1
10.1.2 容器.......................................................................................................2
10.1.2.1 容器的概念.................................................................................2
10.1.2.2 容器的分类.................................................................................3
10.1.3 迭代器...................................................................................................3
10.1.4 算法.......................................................................................................4
10.1.5 C++标准库.............................................................................................4
10.1.6 模板简要回顾.......................................................................................8
10.2 容器.................................................................................................................8
10.2.1 STL 的 string 是一个 char*型的容器................................................ 8
1. String 概念.............................................................................................8
2. string 的构造函数.................................................................................9
2*.string 的遍历........................................................................................9
3. string 的存取字符操作.......................................................................10
4.从 string 取得 const char*的操作.......................................................11
5.把 string 拷贝到 char*指向的内存空间的操作.................................11
5*.字符指针和 string 的转换.................................................................11
6.string 的长度........................................................................................12
7.string 的赋值........................................................................................12
8.string 字符串连接(将两个字符串连接起来)................................12
9.string 的比较........................................................................................13
10.string 的子串......................................................................................13
11.string 的查找 和 替换(重点)......................................................14
12.String 的区间删除和插入................................................................. 16
13.string 算法相关..................................................................................17
10.2.2 .Vector 容器.........................................................................................17
1.Vector 容器简介...................................................................................17
2.vector 对象的默认构造.......................................................................18
3.vector 对象的带参数构造...................................................................19
4.vector 的赋值.......................................................................................20
4*.vector 的遍历.....................................................................................20
5.vector 的大小.......................................................................................21
6.vector 末尾的添加和移除操作...........................................................22
7.vector 的数据存取...............................................................................22
8.迭代器基本原理..................................................................................23
9.双向迭代器与随机访问迭代器..........................................................23
10.vector 与迭代器的配合使用.............................................................24
11.vector 的插入.....................................................................................25
C++ STL
12.vector 的删除.....................................................................................26
13.vector 小结.........................................................................................27
10.2.3Deque 容器.......................................................................................... 27
1. Deque 简介......................................................................................... 27
2.deque 对象的默认构造.......................................................................27
3. deque 对象的带参数构造..................................................................28
4. deque 的赋值......................................................................................28
5. deque 头部和尾部的添加移除操作..................................................29
6. deque 的数据存取..............................................................................30
7.deque 与迭代器...................................................................................30
8. deque 的大小......................................................................................31
9. deque 的插入......................................................................................32
10. deque 的删除....................................................................................33
11. deque 中查找某个数在数组下标的值............................................34
10.2.4 stack 容器............................................................................................34
1. stack 对象的默认构造........................................................................34
2. stack 对象的拷贝构造与赋值............................................................35
3. stack 的 push()与 pop()方法...............................................................35
4. stack 的数据存取................................................................................35
5. stack 的大小........................................................................................37
10.2.5 Queue 容器.........................................................................................38
1. Queue 简介......................................................................................... 38
2. queue 对象的默认构造......................................................................38
3. queue 的 push()与 pop()方法.............................................................38
4. queue 对象的拷贝构造与赋值..........................................................38
5. queue 的数据存取..............................................................................39
6. queue 的大小......................................................................................39
10.2.6 List 容器.............................................................................................. 40
1. List 简介.............................................................................................. 40
2. list 对象的默认构造........................................................................... 40
3.list 对象的带参数构造........................................................................ 40
4. list 的赋值........................................................................................... 41
5. list 头尾的添加移除操作................................................................... 41
6. list 的数据存取................................................................................... 42
7. list 与迭代器....................................................................................... 42
8. list 的大小........................................................................................... 43
9. list 的插入........................................................................................... 44
10. list 的删除......................................................................................... 45
11. list 的反序排列................................................................................. 46
小结:........................................................................................................47
C++ STL
10.2.7 优先级队列 priority_queue................................................................47
10.2.8 Set 和 multiset 容器........................................................................... 48
1. set/multiset 的简介............................................................................ 48
2. set/multiset 对象的默认构造............................................................ 50
3. set 的插入与迭代器........................................................................... 50
4. Set 集合的元素排序...........................................................................50
5. 函数对象 functor 的用法 (自定义的数据的排序)................51
6. set 对象的拷贝构造与赋值............................................................... 54
7. set 的大小........................................................................................... 55
8. set 的删除........................................................................................... 55
9. set 的查找........................................................................................... 56
10. pair 的使用........................................................................................57
小结.........................................................................................................57
10.2.9 Map 和 multimap 容器.......................................................................58
1. map/multimap 的简介........................................................................58
2.map/multimap 对象的默认构造........................................................ 58
3. map 对象的拷贝构造与赋值.............................................................59
4.map 的插入与迭代器..........................................................................59
5. map 的大小.........................................................................................62
5. map 的删除.........................................................................................62
6.map 的查找..........................................................................................63
10.2.10 容器共性机制研究...........................................................................68
1 容器的共通能力..................................................................................68
2 各个容器的使用时机..........................................................................69
10.3 算法...............................................................................................................70
10.3.1 算法基础.............................................................................................70
10.3.1.1 算法概述...................................................................................70
10.3.1.2 STL 中算法分类........................................................................ 70
10.3.1.3 查找算法(13 个):判断容器中是否包含某个值................... 71
10.3.1.4 堆算法(4 个)............................................................................. 73
10.3.1.5 关系算法(8 个)......................................................................... 74
10.3.1.6 集合算法(4 个)......................................................................... 75
10.3.1.6 列组合算法(2 个)..................................................................... 76
10.3.1.7 排序和通用算法(14 个):提供元素排序策略....................... 76
10.3.1.8 删除和替换算法(15 个)........................................................... 78
10.3.1.9 生成和变异算法(6 个)............................................................. 80
10.3.1.10 算数算法(4 个)....................................................................... 81
10.3.1.11 常用算法汇总.........................................................................82
10.3.2 STL 算法中函数对象和谓词.............................................................. 82
10.3.2.1 函数对象和谓词定义...............................................................82
C++ STL
10.3.2.2 一元函数对象案例...................................................................83
10.3.2.3 一元谓词案例...........................................................................86
10.3.2.4 二元函数对象案例...................................................................87
10.3.2.5 二元谓词案例...........................................................................88
10.3.2.6 预定义函数对象和函数适配器..............................................91
10.3.2.7 函数适配器...............................................................................93
10.3.2.8 STL 的容器算法迭代器的设计理念........................................ 97
10.3.3 常用的遍历算法.................................................................................97
for_each()................................................................................................ 97
transform().............................................................................................. 99
for_each ( )和 transform ( )算法比较...................................................100
10.3.4 常用的查找算法...............................................................................102
adjacent_find ( ).................................................................................... 102
binary_search (二分法查找)..........................................................102
count ( )................................................................................................. 103
count_if ( )............................................................................................. 103
find ( ).................................................................................................... 104
find_if ( )................................................................................................ 104
10.3.5 常用的排序算法...............................................................................104
merge ( )................................................................................................ 104
sort ( ).................................................................................................... 105
random_shuffle ( ).................................................................................106
reverse ( )...............................................................................................107
10.3.6 常用的拷贝和替换算法...................................................................107
copy ( )...................................................................................................107
replace()................................................................................................ 108
replace_if()............................................................................................ 108
swap( )................................................................................................... 108
10.3.7 常用的算术和生成算法...................................................................109
accumulate ( )........................................................................................109
fill ( ).......................................................................................................110
10.3.8 常用的集合算法...............................................................................110
set_union( ),set_intersection( ),set_difference( )................................. 110
10.4 STL 综合案例.............................................................................................. 111
10.4.1 案例学校演讲比赛...........................................................................111
10.4.1.1 学校演讲比赛介绍.................................................................111
10.4.1.2 需求分析.................................................................................112
10.4.1.3 实现思路.................................................................................113
10.4.1.4 实现细节.................................................................................113
10.4.2 案例:足球比赛...............................................................................121
C++ STL
10、STL 实用技术专题
10.1 STL(标准模板库)理论基础
10.1.1 基本概念
STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件
的统称。现然主要出现在 C++中,但在被引入 C++之前该技术就已经存在了很长
的一段时间。
STL 的从广义上讲分为三类:algorithm(算法)、container(容器)和 iterator
(迭代器),容器和算法通过迭代器可以进行无缝地连接。几乎所有的代码都采
用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了
更好的代码重用机会。在 C++标准中,STL 被组织为下面的 13 个头文 件:
、、、、、、
C++ STL
3. 程序员可以不用思考 STL 具体的实现过程,只要能够熟练使用 STL 就 OK
了。这样他们就可以把精力放在程序开发的别的方面。
4. STL 具有高可重用性,高性能,高移植性,跨平台的优点。
5.高可重用性:STL 中几乎所有的代码都采用了模板类和模版函数的方式实
现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。关于
模板的知识,已经给大家介绍了。
6.高性能:如 map 可以高效地从十万条记录里面查找出指定的记录,因为 map
是采用红黑树的变体实现的。(红黑树是平横二叉树的一种)
7.高移植性:如在项目 A 上用 STL 编写的模块,可以直接移植到项目 B 上。
8.跨平台:如用 windows 的 Visual Studio 编写的代码可以在 Mac OS 的 XCode
上直接编译。
9.程序员可以不用思考 STL 具体的实现过程,只要能够熟练使用 STL 就 OK
了。这样他们就可以把精力放在程序开发的别的方面。
总之:招聘工作中,经常遇到 C++程序员对 STL 不是非常了解。大多是有一
个大致的映像,而对于在什么情况下应该使用哪个容器和算法都感到比较茫然。
STL 是 C++程序员的一项不可或缺的基本技能,掌握它对提升 C++编程大有裨益。
10.1.2 容器
在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算
法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得
更加重要。
经典的数据结构数量有限,但是我们常常重复着一些为了实现向量、链表等
结构而编写的代码,这些代码都十分相似,只是为了适应不同数据的变化而在 细
节上有所出入。STL 容器就为我们提供了这样的方便,它允许我们重复利用已有
的实现构造自己的特定类型下的数据结构,通过设置一些模板,STL 容器对最常
用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类
型,可以将我们许多重复而乏味的工作简化。
容器部分主要由头文 件,,,,
C++ STL
10.1.2.2 容器的分类
序列式容器(Sequence containers)
每个元素都有固定位置--取决于插入时机和地点,和元素值无关。
vector、deque、list
关联式容器(Associated containers)
元素位置取决于特定的排序准则,和插入顺序无关
set、multiset、map、multimap
描述
连续存储的元素
由节点组成的双向链表,每个结点包含着
一个元素
连续存储的指向不同元素的指针所组成的
数组
由节点组成的红黑树
允许存在两个次序相等的元素的集合
后进先出的值的排列
先进先出的执的排列
元素的次序是由作用于所存储的值对上的
某种谓词决定的的一种队列
由{键,值}对组成的集合,以某种作用于
键对上的谓词排列
允许键对有相等的次序的映射
实现头文件