泛型程序设计与CSTL简介.ppt
《泛型程序设计与CSTL简介.ppt》由会员分享,可在线阅读,更多相关《泛型程序设计与CSTL简介.ppt(77页珍藏版)》请在三一办公上搜索。
1、第十五章 泛型程序设计与C+STL简介,学习目标,掌握泛型程序设计思想以及概念;掌握STL中顺序容器的使用,了解关联容器;掌握迭代器的使用;了解泛型算法和函数对象。,2,目录,15.1 泛型程序设计的概念和术语15.1.1 泛型程序设计15.1.2 STL的相关概念和术语15.2 C+STL中的容器15.2.1 顺序容器15.2.2 关联容器15.2.3 容器适配器,3,目录(续),15.3 迭代器15.3.1 迭代器的分类15.3.2 迭代器适配器15.3.3 迭代器相关的辅助函数15.4 标准C+库中的算法简介15.4.1 非可变序列算法15.4.2 可变序列算法15.4.3 排序及相关算
2、法,4,目录(续),15.4 标准C+库中的算法简介15.4.4 数值算法15.5 函数对象15.5.1 函数对象15.5.2 函数适配器,5,15.1.1 泛型程序设计,泛型程序设计是继面向对象程序设计之后的又一种程序设计方法。泛型程序设计就是让程序写得通用,能够适用于各种数据类型与数据结构,并且并不损失程序效率。面向对象与泛型程序设计这两种程序设计方法并不矛盾,而是相得益彰。标准模板库(Standard Temp late L ibrary,简称STL)是建立在C+中模板机制上的泛型程序设计思想的实现。,6,15.1.2 标准模板库相关概念和术语,容器容器是存放其他对象的对象。比如我们常见
3、的C+内置数组,从广义上讲也属于一种容器。容器可以存放同一种类型的一组元素或对象,称为同类容器类(homogenous constainer);或者存放不同类型的的元素或对象时,称为异类容器类(heterogenous constainer)。对于STL容器库,其包含了两类容器,一种为顺序容器(sequence contsainer),另一种为关联容器(associative container)。迭代器在C+中,我们经常使用指针。而迭代器就是相当于指针,它提供了一种一般化的方法使得C+程序能够访问不同数据类型的顺序或者关联容器中的每一个元素,我们可以称它为“泛型指针”。STL定义了五种迭代器
4、类型,前向迭代器(forward iterator),双向迭代器(bidirectional iterator),输入迭代器(input iterator),输出迭代器(output iterator),随机访问迭代器(random access iterator)。,7,15.1.2 标准模板库相关概念和术语,算法算法是STL中的核心,它它包含了70多个通用算法。可以分为四类:不可变序列算法(non-modifying sequence algorithms)、可变序列算法(mutating sequence algorithms)、排序及相关算法(sorting and related a
5、lgorithms)和算术算法(numeric algorithms)。函数对象函数对象是STL提供的四种组件中的一种,它是定义了操作符【operator()】的对象。在C+中,除了定义了操作符operator()的对象之外,普通函数或者函数指针也满足函数对象的特征。结合函数模板的使用,函数对象使得STL更加灵活和方便,同时也使得代码更为高效。本章在15.5小节将单独介绍函数对象。,8,15.1.2 标准模板库相关概念和术语,适配器(adapter)适配器是一种接口类,可以认为是标准组件的改装。通过修改其它类的接口,使适配器满足一定需求,可分为容器适配器、迭代器适配器和函数对象适配器三种。分配
6、器(allocator)分配器是STL提供的一种内存管理类模块。每种STL容器都是用了一种分配器类,用来封装程序所用的内存分配模式的信息。不同的内存分配模式采用不同的方法从 操作系统中检索内存。分配器类可以封装许多方面的信息,包括指针、常量指针、引用、常量引用、对象大小、不同类型指针之间的差别、分配函数与释放函数、以及一些函数的信息。分配器上的所有操作都具有分摊常量的运行时间。,9,15.1.2 标准模板库相关概念和术语,容器接口STL为容器提供了一些公共接口,这些公共接口是通用的,也可以说是泛型的。这些都是容器设计的规范,对于容器而言,定义的公共接口主要有以下几个部分:,10,15.1.2
7、标准模板库相关概念和术语,容器接口所有容器定义的迭代器访问接口,11,15.1.2 标准模板库相关概念和术语,容器接口其他访问接口,12,15.2.1 顺序容器,顺序容器顺序容器包含Vector,deque和list三种容器,其中vector和deque属于直接访问容器,list属于顺序访问容器。向量(vector)向量相当于一个动态数组,其可以动态存储元素,并提供对容器元素的随机访问。为了提高效率,vector并不是随着每一个元素的插入而增长自己,而是当vector要增长自己的时候,他分配的空间比当前所需的空间要多一些。这多一些的内存空间使需要添加新元素的时候不必再重新分配内存。与C+的内置
8、数组相比较,除了动态之外,向量容器支持向对象。,13,例15-1:建立一个整型向量容器,#include#include/使用向量容器须包含的头文件#include using namespace std;const int n=5;int main()int arrayn=12,4,5,9,1;vector vec1;/构造1:定义一个空的整型向量容器vec1 int i;for(i=0;i vec2(vec1);/构造2:拷贝构造vec2 vector vec3(array,array+3);/构造3:用array到array+3的值初始化 vector vec4(n,3);/构造4:用n
9、个3初始化向量,14,例15-1(续),for(i=0;in;i+)coutsetw(5)vec1i;coutendl;for(i=0;in;i+)coutsetw(5)vec2i;coutendl;for(i=0;i3;i+)coutsetw(5)vec3i;coutendl;for(i=0;in;i+)coutsetw(5)vec4i;coutendl;,15,例15-1(续),运行结果:12 4 5 9 1 12 4 5 9 1 12 4 5 3 3 3 3 3,16,例15-2:向量容器中元素的添加和删除,#include#include#include#include using n
10、amespace std;void display(vector,17,例15-2(续),int main()string str3=Hello,C+,Love;vector vec1;/将str至str+3之间的元素插入vec1,vec1.insert(vec1.begin(),str,str+3);vector vec2;/将vec1.begin()至vec1.end()之间的元素插入到vec2,等效于将vec1复制到vec2中,vec2.insert(vec2.end(),vec1.begin(),vec1.end();vec2.insert(vec2.begin(),1,welcom
11、to C+);/在vec2.begin()前插入字符串display(vec1);display(vec2);vec1.clear();/清除整个vec1display(vec1);vec2.erase(vec2.begin();/删除vec2的首元素display(vec2);vec2.pop_back();/删除vec2的末尾元素display(vec2);,18,例15-2(续),运行结果:there are 3 elements in the vector.Hello C+Lovethere are 4 elements in the vector.welcom to C+Hello
12、C+Lovethere are 0 elements in the vector.there are 3 elements in the vector.Hello C+Lovethere are 2 elements in the vector.Hello C+,例15-3:向量容器中元素的添加和删除,#include#include#include#include using namespace std;int main()int array4=2,3,5,2;vector nval;coutnvals size is:nval.size()and the capacity is:nval.
13、capacity()endl;for(int i=0;i17;i+)nval.push_back(i);if(!(i%4)coutnvals size is:nval.size()and the capacity is:nval.capacity()endl;,20,例15-3(续),运行结果:nvals size is:0 and the capacity is:0nvals size is:1 and the capacity is:1nvals size is:5 and the capacity is:6nvals size is:9 and the capacity is:9nval
14、s size is:13 and the capacity is:13nvals size is:17 and the capacity is:19,例15-4:复杂对象的向量容器,#include#include#include#include using namespace std;const int n=6;struct Evaluate/结构体,string Name;/学生的姓名double Rank;/学生的排名;void display(vector,22,例15-4(续),int main()string namen=John,Lily,David,Jevons,Mike,Ja
15、ne;vector NameSet;vector rank(n,0);/初始化一个大小为n,元素都为0的向量NameSet.insert(NameSet.begin(),name,name+n);int i;for(i=0;iranki;vector Student;,23,例15-4(续),for(i=0;i Student2(Student);/调用向量的拷贝构造函数cout“the partial rank of Student2 set is”endl;display(Student);,24,例15-4(续),vector Student3(Student2.begin(),Stud
16、ent2.end()-3);cout“the size of Student3 is:”Student3.size()endl;/向量所含元素Student3.swap(Student);/交换两个容器coutthe size of Student is:Student.size()endl;/交换后的student的元素个数coutthe size of Student3 is:Student3.size()endl;/交换后的student3的元素个数Student3.pop_back();/删除最后一个元素coutsetw(5)Student3.size();Student3.erase
17、(Student3.begin();/删除最开始的一个元素coutsetw(5)Student3.size()endl;display(Student3);/显示更新后的向量容器,25,例15-4(续),运行结果:Please enter Johns rank(0100):1Please enter Lilys rank(0100):2Please enter Davids rank(0100):3Please enter Jevonss rank(0100):4Please enter Mikes rank(0100):5Please enter Janes rank(0100):6the
18、rank of Student set isJohns rank is 0.01Lilys rank is 0.02Davids rank is 0.03Jevonss rank is 0.04Mikes rank is 0.05,26,Janes rank is 0.06the partial rank of Student2 set isJohns rank is 0.01Lilys rank is 0.02Davids rank is 0.03Jevonss rank is 0.04Mikes rank is 0.05Janes rank is 0.06the size of Stude
19、nt3 is:3the size of Student is:3the size of Student3 is:6 5 4Lilys rank is 0.02Davids rank is 0.03Jevonss rank is 0.04Mikes rank is 0.05,15.2.1 顺序容器(续),双端队列(deque)双端队列是一种增加了访问权限的队列。在队列中,我们只允许从队列的一端添加元素,在队列的另一端提取元素;在双端队列中,其支持两端的出队和入队,这个我们可以通过前面所述的顺序容器接口看出。Vector与deque同属于随机访问容器,vector拥有的成员函数deque也都含有。
20、这个我们在顺序容器一般接口表中可以看出。列表(list)列表如我们在13章学习的链表一样,但是在13章中我们只实现了单链表,也就是只支持从一个方向遍历元素,STL实现的list由节点组成的双向链表,每个结点包含着一个元素,提供从两个方向遍历元素。,27,例15-5:建立一个双端队列容器,#include#include/使用deque需要包含的头文件#include using namespace std;const int n=10;int main()deque de;int arrayn=10,1,3,4,5,7,2,9,8,6;int i;for(i=0;i5;i+)de.push_b
21、ack(arrayi);de.push_front(arrayn-1-i);for(i=0;in;i+)coutsetw(5)dei;coutendl;for(i=0;in;i+)de.pop_front();de.push_back(arrayi);for(i=0;in;i+)coutsetw(5)dei;coutendl;,28,例15-5:建立一个双端队列容器,#include#include/使用deque需要包含的头文件#include using namespace std;const int n=10;int main()deque de;int arrayn=10,1,3,4,
22、5,7,2,9,8,6;int i;for(i=0;i5;i+)de.push_back(arrayi);de.push_front(arrayn-1-i);for(i=0;in;i+)coutsetw(5)dei;coutendl;for(i=0;in;i+)de.pop_front();de.push_back(arrayi);for(i=0;in;i+)coutsetw(5)dei;coutendl;,29,例15-5(续),运行结果:7 2 9 8 6 10 1 3 4 510 1 3 4 5 7 2 9 8 6,30,例15-6:建立一个列表,#include#include/使用l
23、ist需要包含的头文件#include using namespace std;const int n=10;void display(list _list)if(!_list.empty()list:iterator it;for(it=_list.begin();it!=_list.end();it+)coutsetw(5)*it;coutendl;elsecoutNull listendl;,31,例15-6:建立一个列表,int main()int arrayn=2,3,5,7,34,3,4,1,0,10;list list1;list1.insert(list1.begin(),ar
24、ray,array+n);display(list1);list list2=list1;for(int i=0;i7;i+)list2.remove(i);display(list2);list2.splice(list2.end(),list1);display(list2);display(list1);,32,例15-6(续),运行结果:2 3 5 7 34 3 4 1 0 10 7 34 10 7 34 10 2 3 5 7 34 3 4 1 0 10Null list,33,例15-7:列表中的算法,#include#include#include using namespace
25、std;const int n=5;void display(list _list)if(!_list.empty()list:iterator it;for(it=_list.begin();it!=_list.end();it+)coutsetw(5)*it;coutendl;elsecoutNull listendl;,34,例15-7:列表中的算法,int main()int arrayn=2,7,5,3,34;list list1;list1.insert(list1.begin(),array,array+n);display(list1);list1.sort(greater()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 CSTL 简介
链接地址:https://www.31ppt.com/p-6305257.html