logo资料库

传智扫地僧王保明stl 文档,个人整理.pdf

第1页 / 共126页
第2页 / 共126页
第3页 / 共126页
第4页 / 共126页
第5页 / 共126页
第6页 / 共126页
第7页 / 共126页
第8页 / 共126页
资料共126页,剩余部分请下载后查看
10、STL实用技术专题
10.1 STL(标准模板库)理论基础
10.1.1基本概念
10.1.2容器
10.1.2.1容器的概念
10.1.2.2容器的分类
10.1.3迭代器
10.1.4算法
10.1.5 C++标准库
10.1.6模板简要回顾
10.2容器
10.2.1 STL的string 是一个char*型的容器
1. String概念
2.string的构造函数
2*.string的遍历
3. string的存取字符操作
4.从string取得const char*的操作
5.把string拷贝到char*指向的内存空间的操作
5*.字符指针和string的转换
6. string的长度
7. string的赋值
8. string字符串连接(将两个字符串连接起来)
9. string的比较
10. string的子串
11. string的查找 和 替换(重点)
12. String的区间删除和插入
13.string算法相关
10.2.2 .vector容器
1.vector容器简介
2.vector对象的默认构造
3.vector对象的带参数构造
4.vector的赋值
4*.vector的遍历
5.vector的大小
6.vector末尾的添加和移除操作
7. vector的数据存取
8.迭代器基本原理
9.双向迭代器与随机访问迭代器
10.vector与迭代器的配合使用
11.vector的插入
12. vector的删除
13.vector小结
10.2.3 Deque容器
1. Deque简介
2.deque对象的默认构造
3. deque对象的带参数构造
4. deque的赋值
5. deque头部和尾部的添加移除操作
6. deque的数据存取
7.deque与迭代器
8. deque的大小
9. deque的插入
10. deque的删除
11. deque中查找某个数在数组下标的值
10.2.4 stack容器
1. stack对象的默认构造
2. stack对象的拷贝构造与赋值
3. stack的push( )与pop( )方法
4. stack的数据存取
5. stack的大小
10.2.5 Queue容器
1. Queue简介
2. queue对象的默认构造
3. queue的push()与pop()方法
4. queue对象的拷贝构造与赋值
5. queue的数据存取
6. queue的大小
10.2.6 List容器
1. List简介
2. list对象的默认构造
3. list对象的带参数构造
4. list的赋值
5. list头尾的添加移除操作
6. list的数据存取
7. list与迭代器
8. list的大小
9. list的插入
10. list的删除
11. list的反序排列
小结:
10.2.7优先级队列priority_queue
10.2.8 Set和multiset容器
1. set/multiset的简介
2. set/multiset对象的默认构造
3. set的插入与迭代器
4. Set集合的元素排序
5. 函数对象functor的用法 (自定义的数据的排序)
6. set对象的拷贝构造与赋值
7. set的大小
8. set的删除
9. set的查找
10. pair的使用
小结
10.2.9 Map和multimap容器
1. map/multimap的简介
2. map/multimap对象的默认构造
3. map对象的拷贝构造与赋值
4.map的插入与迭代器
5. map的大小
5. map的删除
6.map的查找
10.2.10容器共性机制研究
10.2.9.1容器的共通能力
10.2.9.2各个容器的使用时机
10.3算法
10.3.1算法基础
10.3.1.1算法概述
10.3.1.2 STL中算法分类
10.3.1.3查找算法(13个):判断容器中是否包含某个值
10.3.1.4堆算法(4个)
10.3.1.5关系算法(8个)
10.3.1.6集合算法(4个)
10.3.1.6列组合算法(2个)
10.3.1.7排序和通用算法(14个):提供元素排序策略
10.3.1.8删除和替换算法(15个)
10.3.1.9生成和变异算法(6个)
10.3.1.10算数算法(4个)
10.3.1.11常用算法汇总
10.3.2 STL算法中函数对象和谓词
10.3.2.1函数对象和谓词定义
10.3.2.2一元函数对象案例
10.3.2.3一元谓词案例
10.3.2.4二元函数对象案例
10.3.2.5二元谓词案例
10.3.2.6 预定义函数对象和函数适配器
10.3.2.7函数适配器
10.3.2.8 STL的容器算法迭代器的设计理念
10.3.3常用的遍历算法
for_each()
transform( )
for_each ( )和transform ( )算法比较
10.3.4常用的查找算法
adjacent_find ( )
binary_search (二分法查找)
count ( )
count_if ( )
find ( )
find_if ( )
10.3.5常用的排序算法
merge ( )
sort ( )
random_shuffle ( )
reverse ( )
10.3.6常用的拷贝和替换算法
copy ( )
replace()
replace_if()
swap( )
10.3.7常用的算术和生成算法
accumulate ( )
fill ( )
10.3.8常用的集合算法
set_union( ), set_intersection( ), set_differenc
10.4 STL综合案例
10.4.1案例学校演讲比赛
10.4.1.1学校演讲比赛介绍
10.4.1.2需求分析
10.4.1.3实现思路
10.4.1.4实现细节
10.4.2案例:足球比赛
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 个头文 件: 。 STL 详细的说六大组件 – 容器(Container) – 算法(Algorithm) – 迭代器(Iterator) – 仿函数(Function object) – 适配器(Adaptor) – 空间配制器(allocator) //相当于链表 //相当于指针 使用STL 的好处: 1. STL 是 C++的一部分,因此不用额外安装什么,它被内建在你的编译器之 内。 2. STL 的一个重要特点是数据结构和算法的分离。尽管这是个简单的概 念,但是这种分离确实使得 STL 变得非常通用。 例如,在 STL 的 vector 容器中,可以放入元素、基础数据类型变量、元素 的地址; STL 的 sort()函数可以用来操作 vector,list 等容器。 1
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 容器对最常 用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类 型,可以将我们许多重复而乏味的工作简化。 容器部分主要由头文 件,,,,,组成。对于常用的一些容器和容器适配器(可以看作由其它容器实现的 容器),可以通过下表总结一下它们和相应头文件的对应关系。 10.1.2.1 容器的概念 用来管理一组元素 2
C++ STL 10.1.2.2 容器的分类 序列式容器(Sequence containers) 每个元素都有固定位置--取决于插入时机和地点,和元素值无关。 vector、deque、list 关联式容器(Associated containers) 元素位置取决于特定的排序准则,和插入顺序无关 set、multiset、map、multimap 描述 连续存储的元素 由节点组成的双向链表,每个结点包含着 一个元素 连续存储的指向不同元素的指针所组成的 数组 由节点组成的红黑树 允许存在两个次序相等的元素的集合 后进先出的值的排列 先进先出的执的排列 元素的次序是由作用于所存储的值对上的 某种谓词决定的的一种队列 由{键,值}对组成的集合,以某种作用于 键对上的谓词排列 允许键对有相等的次序的映射 实现头文件 数据结构 向量(vector) 列表(list) 双队列(deque) 集合(set) 多重集合 (multiset) 栈(stack) 队列(queue) 优先队列 (priority_queue) 映射(map) 多重映射 (multimap) 10.1.3 迭代器 迭代器从作用上来说是最基本的部分,可是理解起来比前两者都要费力一 些。软件设计有一个基本原则,所有的问题都可以通过引进一个间接层来简化, 3
分享到:
收藏