1、第十章 C+标准模板库,C+语言程序设计,2,主要内容,泛型程序设计与标准模板库有关的概念和术语C+标准模板库中的容器迭代器标准C+库中的算法函数对象,3,泛型程序设计,将程序写得尽可能通用 将算法从特定的数据结构中抽象出来,成为通用的C+的模板为泛型程序设计奠定了关键的基础 STL是泛型程序设计的一个范例 容器(container)迭代器(iterator)算法(algorithms)函数对象(function object),4,命名空间(Namespace),一个命名空间将不同的标识符集合在一个命名作用域(named scope)内为了解决命名冲突例如,声明一个命名空间NS:namspa
2、ce NS class File;void Fun (); 则引用标识符的方式如下,NS: File obj;NS: Fun ();没有声明命名空间的标识符都处于无名的命名空间中,概念和术语,5,命名空间(Namespace),可以用using来指定命名空间例如,经过以下声明:using NS:File;在当前作用域中就可以直接引用Fileusing namespace std;命名空间std中所有标识符都可直接引用在新的C+标准程序库中,所有标识符都声明在命名空间std中,头文件都不使用扩展名,概念和术语,6,容器,容器类是容纳、包含一组元素或元素集合的对象。异类容器类与同类容器类顺序容器与
3、关联容器七种基本容器:向量(vector)、双端队列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap),概念和术语,7,容器的接口,通用容器运算符=,!=,=, n; Aprimecount+ = 2;,14,for(i = 3; i i/2) Aprimecount+ = i; for (i = 0; iprimecount; i+)/输出质数 coutsetw(5)Ai; if (i+1) % 10 = 0) /每输出10个数换行一次 cout endl; coutitem; Link.push_front(item
4、); cout key; Link.remove(key); cout List: ; / 输出链表 p=Link.begin();/ 使P重新指向表头 while(p!=Link.end() cout *p ; p+; / 使P指向下一个节点 cout endl;,19,容器适配器,容器适配器是用来扩展7种基本容器的栈容器使用适配器与一种基础容器相结合来实现例10-4:应用标准库中的deque顺序容器生成一个整数栈stack。队列容器使用适配器与一种基础容器相结合来实现的先进先出数据结构。例10-5:应用标准库中的deque顺序容器生成一个整数标准队列Queue。,容 器,20,什么是迭代器
5、,迭代器是面向对象版本的指针指针可以指向内存中的一个地址迭代器可以指向容器中的一个位置STL的每一个容器类模版中,都定义了一组对应的迭代器类。使用迭代器,算法函数可以访问容器中指定位置的元素,而无需关心元素的具体类型。,迭代器,21,迭代器的类型,输入迭代器可以用来从序列中读取数据输出迭代器允许向序列中写入数据前向迭代器既是输入迭代器又是输出迭代器,并且可以对序列进行单向的遍历双向迭代器与前向迭代器相似,但是在两个方向上都可以对数据遍历随机访问迭代器也是双向迭代器,但能够在序列中的任意两个位置之间进行跳转。,迭代器,22,迭代器适配器,迭代器适配器是用来扩展(或调整)迭代器功能的类。它本身也被
6、称为迭代器,只是这种迭代器是通过改变另一个迭代器而得到的逆向迭代器通过重新定义递增运算和递减运算,使其行为正好倒置插入型迭代器将赋值操作转换为插入操作。通过这种迭代器,算法可以执行插入行为而不是覆盖行为例10-6应用逆向迭代器和后插迭代器来操作向量容器中的元素,迭代器,23,迭代器相关的辅助函数,advance()函数将迭代器的位置增加,增加的幅度由参数决定Distance()函数返回迭代器之间的距离函数iter_swap()交换两个迭代器所指向的元素值例10-7用三个迭代器辅助函数来操作列表容器中的元素。,迭代器,24,标准C+库中的算法,算法本身是一种函数模板不可变序列算法(Non-mut
7、ating algorithms)不直接修改所操作的容器内容的算法可变序列算法(Mutating algorithms)可以修改它们所操作的容器的元素。排序相关算法数值算法,算 法,25,算法应用举例,例10-9应用不可变序列算法对数据序列进行分析例10-10以可变序列算法对数据序列进行复制,生成,删除,替换,倒序,旋转等可变性操作。例10-11 应用排序相关算法对序列进行各项操作例10-12应用数值算法对数据序列进行操作,算 法,26,函数对象,一个行为类似函数的对象,它可以不需参数,也可以带有若干参数,其功能是获取一个值,或者改变操作的状态。任何普通的函数和任何重载了调用运算符operator()的类的对象都满足函数对象的特征STL中也定义了一些标准的函数对象,如果以功能划分,可以分为算术运算、关系运算、逻辑运算三大类。为了调用这些标准函数对象,需要包含头文件。,