第十部分C标准模板库本部分以自学为主教学课件

上传人:仙*** 文档编号:71316585 上传时间:2022-04-06 格式:PPT 页数:28 大小:471KB
收藏 版权申诉 举报 下载
第十部分C标准模板库本部分以自学为主教学课件_第1页
第1页 / 共28页
第十部分C标准模板库本部分以自学为主教学课件_第2页
第2页 / 共28页
第十部分C标准模板库本部分以自学为主教学课件_第3页
第3页 / 共28页
资源描述:

《第十部分C标准模板库本部分以自学为主教学课件》由会员分享,可在线阅读,更多相关《第十部分C标准模板库本部分以自学为主教学课件(28页珍藏版)》请在装配图网上搜索。

1、第十章第十章 C+C+标准模板库标准模板库本章以自学为主本章以自学为主仲恺农业技术学院仲恺农业技术学院 计算科学系计算科学系 胡小健胡小健高级语言程序设计(C+)STL与泛型算法与泛型算法2主要内容主要内容l泛型程序设计泛型程序设计l与标准模板库有关的概念和术语与标准模板库有关的概念和术语lC+C+标准模板库中的容器标准模板库中的容器l迭代器迭代器l标准标准C+C+库中的算法库中的算法l函数对象函数对象 STL与泛型算法与泛型算法3泛型程序设计泛型程序设计l将程序写得尽可能通用将程序写得尽可能通用 ,即:将算法从特定,即:将算法从特定的数据结构中抽象出来,成为通用的(可针的数据结构中抽象出来,

2、成为通用的(可针对各种数据类型)对各种数据类型)lC+C+的模板为泛型程序设计奠定了关键的基础的模板为泛型程序设计奠定了关键的基础 lSTLSTL是泛型程序设计的一个范例是泛型程序设计的一个范例 容器容器(container)(container) 迭代器迭代器(iterator)(iterator) 算法(算法(algorithmsalgorithms) 函数对象(函数对象(function objectfunction object)四个最关键的组件四个最关键的组件STL与泛型算法与泛型算法4本章重点本章重点l群体数据的类型多且处理复杂。不过,不是群体数据的类型多且处理复杂。不过,不是所有

3、的程序员都要从头开始自行设计所需要所有的程序员都要从头开始自行设计所需要的类型及算法。的类型及算法。lStandard Template LibraryStandard Template Library是已有的是已有的经典优秀的模板,本章的重点是如何使经典优秀的模板,本章的重点是如何使用现有的用现有的STLSTL。重点理解本章例重点理解本章例10-110-1至例至例10-1510-15的所有例题,的所有例题,请自行学习,请自行学习,不明白的,要求查找不明白的,要求查找MSDNMSDN(考试重点)(考试重点):ReferenceReferenceC CC+Language and C+Libra

4、ries C+Language and C+Libraries Standard C+Library ReferenceStandard C+Library Reference或或上网查找上网查找。试卷中本章内容均是本章的例题及布置的练习(两道试卷中本章内容均是本章的例题及布置的练习(两道大题),大题),STL与泛型算法与泛型算法5命名空间(命名空间(NamespaceNamespace)的引入)的引入l在缺省情况下,在全局域中声明的每个对象、函数、类型或在缺省情况下,在全局域中声明的每个对象、函数、类型或模板都引入了一个全局实体模板都引入了一个全局实体(global entity).(glo

5、bal entity).在全局名字空在全局名字空间域引入的全局实体必须有唯一的名字。间域引入的全局实体必须有唯一的名字。l例如:函数和对象不能有相同的名字,无论它们是否在同一例如:函数和对象不能有相同的名字,无论它们是否在同一程序文本文件中被声明。程序文本文件中被声明。l如果程序中使用一个库,必须保证程序中的全局实体的名字如果程序中使用一个库,必须保证程序中的全局实体的名字不能与库中的全局实体名字冲突。如果程序是由许多厂商提不能与库中的全局实体名字冲突。如果程序是由许多厂商提供的库构成,则很难保证各种库会将许多名字引入到全局字供的库构成,则很难保证各种库会将许多名字引入到全局字空间域中。在组合

6、不同厂商的库时,就怎样才能确保程序中空间域中。在组合不同厂商的库时,就怎样才能确保程序中的全局实体不会与这些库中声明的全局实体名冲突?名字冲的全局实体不会与这些库中声明的全局实体名冲突?名字冲突问题也被称为:全局名字空间污染突问题也被称为:全局名字空间污染(global namespace pollution)l程序员可以通过使用全局实体名字很长或在名字前加特殊的程序员可以通过使用全局实体名字很长或在名字前加特殊的字符序列前缀,从而避免这些问题,但这样是个累赘。字符序列前缀,从而避免这些问题,但这样是个累赘。l而名字空间正是解决此类问题而引入的一种机制。而名字空间正是解决此类问题而引入的一种机

7、制。STL与泛型算法与泛型算法6命名空间(命名空间(NamespaceNamespace)的引入)的引入l库的作者可定义一个名字空间,从而库中的所有引入的实体库的作者可定义一个名字空间,从而库中的所有引入的实体都隐藏在该名字空间之中。如:都隐藏在该名字空间之中。如:lnamespace cplusplus_primer class matrix void inverse (matrix &) . l在一个名字空间中声明的实体如:函数,对象、类、类模板在一个名字空间中声明的实体如:函数,对象、类、类模板和类型声明等都被称为名字空间的成员(和类型声明等都被称为名字空间的成员(namespace m

8、ember)。用户声明的名字空间中的每个名字必须是名)。用户声明的名字空间中的每个名字必须是名字空间内的唯一实体。但不同用户声明的名字空间引入了不字空间内的唯一实体。但不同用户声明的名字空间引入了不同的域,所以两个不同的名字空间可以有相同的名字成员。同的域,所以两个不同的名字空间可以有相同的名字成员。如:如:namespace DisneyFeatureAnimation class matrix . void inverse (matrix &).l在程序中我们可以用既定修饰名来使用名字空间的成员。在程序中我们可以用既定修饰名来使用名字空间的成员。STL与泛型算法与泛型算法7命名空间(命名空

9、间(NamespaceNamespace)的引入)的引入void func (DisneyFeatureAnimation:Matrix &m)void func (DisneyFeatureAnimation:Matrix &m) DisneyFeatrueAnimation:inverse(m); DisneyFeatrueAnimation:inverse(m); void main ()void main () cplusplus:Matrix m1; cplusplus:Matrix m1; . . 如果:如果:using namespace DisneyFeatureAnimati

10、onusing namespace DisneyFeatureAnimationvoid main () void main () Matrix m1; Matrix m1; cplusplus:Matrix m2; . cplusplus:Matrix m2; . STL与泛型算法与泛型算法8命名空间(命名空间(NamespaceNamespace)l一个命名空间将不同的标识符集合在一个命名作用一个命名空间将不同的标识符集合在一个命名作用域(域(named scopenamed scope)内)内 为了解决命名冲突为了解决命名冲突 例如,声明一个命名空间例如,声明一个命名空间NSNS:nam

11、spacenamspace NS NS class File; class File; void Fun (); . . . . . . void Fun (); . . . . . . 则引用标识符的方式如下,则引用标识符的方式如下,NS: File obj;NS: File obj;NS: Fun ();NS: Fun ();l没有声明命名空间的标识符都处于无名的命名空间没有声明命名空间的标识符都处于无名的命名空间中中STL与泛型算法与泛型算法9l可以用可以用usingusing来指定命名空间来指定命名空间 例如,经过以下声明:例如,经过以下声明:using NS:File; /using

12、 NS:File; /或或 using NS;using NS;/ /在当前作用域中就可以直接引用在当前作用域中就可以直接引用FileFile using namespace std;using namespace std;命名空间命名空间stdstd中所有标识符都可直接引用中所有标识符都可直接引用l在新的在新的C+C+标准程序库中,所有标识符都标准程序库中,所有标识符都声明在命名空间声明在命名空间stdstd中,头文件都不使用扩中,头文件都不使用扩展名展名命名空间(命名空间(NamespaceNamespace)有关命名空间(有关命名空间(NamespaceNamespace) 详见详见C+

13、 PrimerC+ PrimerSTL与泛型算法与泛型算法10容器容器l容器类是容纳、包含一组元素或元素集合的对容器类是容纳、包含一组元素或元素集合的对象。象。l异类容器类与同类容器类异类容器类与同类容器类l顺序容器与关联容器顺序容器与关联容器l七种基本容器:七种基本容器: 向量(向量(vectorvector) 双端队列(双端队列(dequedeque) 列表(列表(listlist) 集合(集合(setset) 多重集合(多重集合(multisetmultiset) 映射(映射(mapmap) 多重映射(多重映射(multimapmultimap)STL与泛型算法与泛型算法11容器的接口容

14、器的接口l通用容器运算符通用容器运算符 =,!=!=, ,=, ,=,= =l方法(函数)方法(函数) 迭代方法迭代方法lbegin()begin(),end()end(),rbegin()rbegin(),rend()rend() 访问方法访问方法size()size(),max_size()max_size(),swap()swap(),empty()empty()STL与泛型算法与泛型算法12适配器适配器l适配器是一种适配器是一种接口类接口类为已有的类提供新的接口为已有的类提供新的接口。 目的是简化、约束、使之安全、隐藏或者改变目的是简化、约束、使之安全、隐藏或者改变被修改类提供的服务集

15、合。被修改类提供的服务集合。l三种类型的适配器:三种类型的适配器:容器适配器容器适配器l用来扩展用来扩展7种基本容器,它们和顺序容器相结种基本容器,它们和顺序容器相结合构成栈、队列和优先队列容器合构成栈、队列和优先队列容器迭代器适配器迭代器适配器函数对象适配器函数对象适配器。STL与泛型算法与泛型算法13迭代器迭代器迭代器是面向对象版本的指针,它们提迭代器是面向对象版本的指针,它们提供了访问容器、序列中每个元素的方法。供了访问容器、序列中每个元素的方法。STL与泛型算法与泛型算法14算法算法lC+标准模板库标准模板库中包括中包括70多个算法多个算法 其中包括查找算法,排序算法,消除算法,其中包

16、括查找算法,排序算法,消除算法,记数算法,比较算法,变换算法,置换算法记数算法,比较算法,变换算法,置换算法和容器管理等等。和容器管理等等。l这些算法的一个最重要的特性就是它们这些算法的一个最重要的特性就是它们的的统一性统一性,并且可以广泛用于不同的并且可以广泛用于不同的对象和内置的数据类型对象和内置的数据类型。l使用时必须指名模板参数。使用时必须指名模板参数。STL与泛型算法与泛型算法15顺序容器顺序容器顺序容器的接口顺序容器的接口: : 插入方法插入方法 push_front(), push_back(), push_front(), push_back(), insert(), “=”i

17、nsert(), “=” 删除方法删除方法lpop() pop() ,erase()erase(),clear()clear() 迭代访问方法迭代访问方法l使用迭代器使用迭代器 其它顺序容器访问方法(不修改访问方法)其它顺序容器访问方法(不修改访问方法)lfront()front(),back()back(),下标,下标 运算符运算符STL与泛型算法与泛型算法16顺序容器顺序容器向量向量l向量属于顺序容器,用于容纳不定长向量属于顺序容器,用于容纳不定长线性序列(即线性群体),提供对序线性序列(即线性群体),提供对序列的快速随机访问(也称直接访问)列的快速随机访问(也称直接访问)l向量是动态结构

18、,它的大小不固定,向量是动态结构,它的大小不固定,可以在程序运行时增加或减少。可以在程序运行时增加或减少。17#include /10_1.cpp#include #include using namespace std ;void main(void) vector A(10); int n; int primecount = 0, i, j; cout=2 as upper limit: ; cin n; A primecount+ = 2;17 for(i = 3; i n; i+) if (primecount = A.size() ) A.resize ( primecount +

19、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) cout endl; coutendl;STL与泛型算法与泛型算法18#include #includeusing namespace std;void main() typedef vector IntArray; IntArray array; array.push_back( 1 ); array.push_back

20、( 2 ); array.push_back( 2 ); array.push_back( 3 ); array.push_back( 2 ); array.push_back( 2 ); array.push_back( 2 ); array.push_back( 5 ); for( IntArray:iterator itor=array.begin(); itor!=array.end(); +itor ) cout*itor ; coutendl; for(itor=array.begin(); itor!=array.end(); +itor ) if( 2 = *itor ) /

21、删除array数组中所有值为2的元素 array.erase( itor ); coutendlarray.size()endl; for( itor=array.begin(); itor!=array.end(); +itor ) cout*itor ; coutendl; STL与泛型算法与泛型算法19顺序容器顺序容器双端队列双端队列l双端队列是一种放松了访问权限的队列。双端队列是一种放松了访问权限的队列。元素可以从队列的两端入队和出队,也元素可以从队列的两端入队和出队,也支持通过下标操作符支持通过下标操作符“ ”进行直接访问。进行直接访问。重点掌握(要求同前):重点掌握(要求同前):

22、P338 P338 例例10-210-2STL与泛型算法与泛型算法20顺序容器顺序容器列表列表l列表主要用于存放双向链表,可以从任意一列表主要用于存放双向链表,可以从任意一端开始遍历。列表还提供了拼接(端开始遍历。列表还提供了拼接(splicingsplicing)操作,将一个序列中的元素从插入到另一个操作,将一个序列中的元素从插入到另一个序列中。序列中。21#include /10_3.cpp#include using namespace std ;void main(void) list Link;/构造一个用于存放整数链表 int i, key, item; for(i=0;i ite

23、m; Link.push_front(item); coutList: ; / 输出链表21 list:iterator p=Link.begin(); while(p!= Link.end( ) ) /输出各节点数据直到链表尾 cout *p ; p+; /使P指向下一个节点 cout endl key; Link.remove(key); cout List: ; / 输出链表 p=Link.begin();/ 使P重新指向表头 while( p!=Link.end() ) cout *p ; p+; / 使P指向下一个节点 STL与泛型算法与泛型算法22容器适配器容器适配器l容器适配器是

24、用来扩展容器适配器是用来扩展7 7种基本容器的种基本容器的l栈容器栈容器 使用适配器与一种基础容器相结合来实现使用适配器与一种基础容器相结合来实现l队列容器队列容器 使用适配器与一种基础容器相结合来实现的先使用适配器与一种基础容器相结合来实现的先进先出数据结构。进先出数据结构。重点掌握(要求同前):重点掌握(要求同前): P341 P341 例例10-410-4P342P342例例10-510-5STL与泛型算法与泛型算法23什么是迭代器什么是迭代器l迭代器是面向对象版本的指针迭代器是面向对象版本的指针 指针可以指向内存中的一个地址指针可以指向内存中的一个地址 迭代器可以指向容器中的一个位置迭

25、代器可以指向容器中的一个位置lSTLSTL的的每一个容器类模版中,都每一个容器类模版中,都定义了一组对应的迭代器类定义了一组对应的迭代器类l使用迭代器,算法函数可以访问使用迭代器,算法函数可以访问容器中指定位置的元素,而无需容器中指定位置的元素,而无需关心元素的具体类型。关心元素的具体类型。24迭代器的类型迭代器的类型l输入迭代器输入迭代器 可以用来从序列中读取数据可以用来从序列中读取数据l输出迭代器输出迭代器 允许向序列中写入数据允许向序列中写入数据l前向迭代器前向迭代器 既是输入迭代器又是输出迭代器,并且可以对序既是输入迭代器又是输出迭代器,并且可以对序列进行单向的遍历列进行单向的遍历l双

26、向迭代器双向迭代器 与前向迭代器相似,但是在两个方向上都可以对与前向迭代器相似,但是在两个方向上都可以对数据遍历数据遍历l随机访问迭代器随机访问迭代器 也是双向迭代器,但能够在序列中的任意两个位也是双向迭代器,但能够在序列中的任意两个位置之间进行跳转。置之间进行跳转。STL与泛型算法与泛型算法25迭代器适配器迭代器适配器l迭代器适配器是用来扩展(或调整)迭代器迭代器适配器是用来扩展(或调整)迭代器功能的类。它本身也被称为迭代器,只是这功能的类。它本身也被称为迭代器,只是这种迭代器是通过改变另一个迭代器而得到的种迭代器是通过改变另一个迭代器而得到的l逆向迭代器逆向迭代器 通过重新定义递增运算和递

27、减运算,使其行为正通过重新定义递增运算和递减运算,使其行为正好倒置好倒置l插入型迭代器插入型迭代器 将赋值操作转换为插入操作。通过这种迭代器,将赋值操作转换为插入操作。通过这种迭代器,算法可以执行插入行为而不是覆盖行为算法可以执行插入行为而不是覆盖行为STL与泛型算法与泛型算法26迭代器相关的辅助函数迭代器相关的辅助函数ladvance()advance()函数函数 将迭代器的位置增加,增加的幅度由参数将迭代器的位置增加,增加的幅度由参数决定决定lDistance()Distance()函数函数 返回迭代器之间的距离返回迭代器之间的距离l函数函数iter_swap()iter_swap() 交

28、换两个迭代器所指向的元素值交换两个迭代器所指向的元素值重点掌握(要求同前):重点掌握(要求同前): P344 P344 例例10-610-6P346P346例例10-710-7STL与泛型算法与泛型算法27标准标准C+C+库中的算法库中的算法l算法本身是一种函数模板算法本身是一种函数模板l不可变序列算法(不可变序列算法(Non-mutating algorithmsNon-mutating algorithms) 不直接修改所操作的容器内容的算法不直接修改所操作的容器内容的算法l可变序列算法(可变序列算法(Mutating algorithmsMutating algorithms) 可以修改

29、它们所操作的容器的元素。可以修改它们所操作的容器的元素。l排序相关算法排序相关算法l数值算法数值算法重点掌握(要求同前):重点掌握(要求同前): P349 P349 例例10-810-8P353P353例例10-910-9 P357 P357例例10-10 P36010-10 P360例例10-11 10-11 P360 P360例例10-1210-12STL与泛型算法与泛型算法28函数对象函数对象l一个行为类似函数的对象,它可以不需参数,也一个行为类似函数的对象,它可以不需参数,也可以带有若干参数,其功能是获取一个值,或者可以带有若干参数,其功能是获取一个值,或者改变操作的状态。改变操作的状

30、态。l任何普通的函数和任何重载了调用运算符任何普通的函数和任何重载了调用运算符operator()的类的对象都满足函数对象的特征的类的对象都满足函数对象的特征lSTL中也定义了一些标准的函数对象,如果以功中也定义了一些标准的函数对象,如果以功能划分,可以分为算术运算、关系运算、逻辑运能划分,可以分为算术运算、关系运算、逻辑运算三大类。为了调用这些标准函数对象,需要包算三大类。为了调用这些标准函数对象,需要包含头文件含头文件。重点掌握(要求同前):重点掌握(要求同前): P361 P361 例例10-1310-13P362P362例例10-1410-14 P363 P363例例10-1510-15

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!