资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,C+语言程序设计,软件学院 李建东,C+语言程序设计,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,*,第十章,C+标准模板库,C+语言程序设计,第十章 C+标准模板库C+语言程序设计,主要内容,泛型程序设计,与标准模板库有关的概念和术语,C+标准模板库中的容器,迭代器,标准C+库中的算法,函数对象,主要内容泛型程序设计,泛型程序设计,将程序写得尽可能通用,将算法从特定的数据结构中抽象出来,成为通用的,C+,的模板为泛型程序设计奠定了关键的基础,STL,是泛型程序设计的一个范例,容器(container),迭代器(iterator),算法(algorithms),函数对象(function object),泛型程序设计将程序写得尽可能通用,命名空间(namespace),一个命名空间将不同的标识符集合在一个命名作用域(named scope)内,为了解决命名冲突,例如,声明一个命名空间NS:,namspace NS,class File;,void Fun();,则引用标识符的方式如下,,NS:File obj;,NS:Fun();,没有声明命名空间的标识符都处于无名的命名空间中,概念和术语,命名空间(namespace)一个命名空间将不同的标识符集合,命名空间(续),可以用using来指定命名空间,例如,经过以下声明:using NS:File;在当前作用域中就可以直接引用File,using namespace std;命名空间std中所有标识符都可直接引用,在新的C+标准程序库中,所有标识符都声明在命名空间std中,头文件都不使用扩展名,概念和术语,命名空间(续)可以用using来指定命名空间概念和术语,容器,容器类是容纳、包含一组元素或元素集合的对象。,异类容器类与同类容器类,顺序容器与关联容器,七种基本容器:,向量(vector)、双端队列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap),概念和术语,容器容器类是容纳、包含一组元素或元素集合的对象。概念和术语,容器的接口,通用容器运算符,=,!=,=,n;,Aprimecount+=2;,13,/10_1.cpp13,for(i=3;i n;i+),if(primecount=A.size(),A.resize(primecount+10);,if(i%2=0),continue;,j=3;,while(j i/2)Aprimecount+=i;,for(i=0;iprimecount;i+)/输出质数,coutsetw(5)Ai;,if(i+1)%10=0)/每输出10个数换行一次,cout endl;,coutendl;,14,for(i=3;i n;i+)14,顺序容器双端队列,双端队列是一种放松了访问权限的队列。元素可以从队列的两端入队和出队,也支持通过下标操作符“”进行直接访问。,例10-2,使用双端队列容器保存double数值序列,容 器,顺序容器双端队列双端队列是一种放松了访问权限的队列。元素,顺序容器列表,列表主要用于存放双向链表,可以从任意一端开始遍历。列表还提供了拼接(splicing)操作,将一个序列中的元素从插入到另一个序列中。,例10-3 改写例9-7,从键盘输入10个整数,用这些整数值作为结点数据,生成一个链表,按顺序输出链表中结点的数值。然后从键盘输入一个待查找整数,在链表中查找该整数,若找到则删除该整数所在的结点(如果出现多次,全部删除),然后输出删除结点以后的链表。在程序结束之前清空链表。,容 器,顺序容器列表列表主要用于存放双向链表,可以从任意一端开始,/10_3.cpp,#include,#include,using namespace std;,int main(),list Link;/构造一个列表用于存放整数链表,int i,key,item;,for(i=0;i item;,Link.push_front(item);,coutList:;/输出链表,17,/10_3.cpp17,list:iterator p=Link.begin();,while(p!=Link.end()/输出各节点数据,直到链表尾,cout*p ;,p+;/使P指向下一个节点,cout endl;,cout key;,Link.remove(key);,cout List:;/输出链表,p=Link.begin();/使P重新指向表头,while(p!=Link.end(),cout*p ;,p+;/使P指向下一个节点,cout endl;,18,list:iterator p=Link.be,容器适配器,容器适配器是用来扩展7种基本容器的,栈容器,使用适配器与一种基础容器相结合来实现,例10-4:应用标准库中的deque顺序容器生成一个整数栈stack。,队列容器,使用适配器与一种基础容器相结合来实现的先进先出数据结构。,例10-5:应用标准库中的deque顺序容器生成一个整数标准队列queue。,容 器,容器适配器容器适配器是用来扩展7种基本容器的容 器,什么是迭代器,迭代器是面向对象版本的指针,指针可以指向内存中的一个地址,迭代器可以指向容器中的一个位置,STL的每一个容器类模版中,都定义了一组对应的迭代器类。使用迭代器,算法函数可以访问容器中指定位置的元素,而无需关心元素的具体类型。,迭代器,什么是迭代器迭代器是面向对象版本的指针迭代器,迭代器的类型,输入迭代器,可以用来从序列中读取数据,输出迭代器,允许向序列中写入数据,前向迭代器,既是输入迭代器又是输出迭代器,并且可以对序列进行单向的遍历,双向迭代器,与前向迭代器相似,但是在两个方向上都可以对数据遍历,随机访问迭代器,也是双向迭代器,但能够在序列中的任意两个位置之间进行跳转。,迭代器,迭代器的类型输入迭代器迭代器,迭代器适配器,迭代器适配器是用来扩展(或调整)迭代器功能的类。它本身也被称为迭代器,只是这种迭代器是通过改变另一个迭代器而得到的,逆向迭代器,通过重新定义递增运算和递减运算,使其行为正好倒置,插入型迭代器,将赋值操作转换为插入操作。通过这种迭代器,算法可以执行插入行为而不是覆盖行为,例10-6,应用逆向迭代器和后插迭代器来操作向量容器中的元素,迭代器,迭代器适配器迭代器适配器是用来扩展(或调整)迭代器功能的类。,迭代器相关的辅助函数,advance()函数,将迭代器的位置增加,增加的幅度由参数决定,distance()函数,返回迭代器之间的距离,函数iter_swap(),交换两个迭代器所指向的元素值,例10-7,用三个迭代器辅助函数来操作列表容器中的元素。,迭代器,迭代器相关的辅助函数advance()函数迭代器,标准C+库中的算法,算法本身是一种函数模板,不可变序列算法,(non-mutating algorithms),不直接修改所操作的容器内容的算法,可变序列算法,(mutating algorithms),可以修改它们所操作的容器的元素。,排序相关算法,数值算法,算 法,标准C+库中的算法算法本身是一种函数模板算 法,算法应用举例,例10-9,应用不可变序列算法对数据序列进行分析,例10-10,以可变序列算法对数据序列进行复制,生成,删除,替换,倒序,旋转等可变性操作。,例10-11,应用排序相关算法对序列进行各项操作,例10-12,应用数值算法对数据序列进行操作,算 法,算法应用举例例10-9算 法,函数对象,一个行为类似函数的对象,它可以没有参数,也可以带有若干参数,其功能是获取一个值,或者改变操作的状态。,任何普通的函数和任何重载了调用运算符operator()的类的对象都满足函数对象的特征,STL中也定义了一些标准的函数对象,如果以功能划分,可以分为算术运算、关系运算、逻辑运算三大类。为了调用这些标准函数对象,需要包含头文件。,函数对象一个行为类似函数的对象,它可以没有参数,也可以带有若,小结与复习建议,主要内容,泛型程序设计、与标准模板库有关的概念和术语、C+标准模板库中的容器、迭代器、标准C+库中的算法、函数对象,达到的目标,初步了解泛型程序设计的概念,学会C+标准模板库(STL)的使用方法,实验任务,实验十,小结与复习建议主要内容,
展开阅读全文