- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
标准模板库(STL)演示文件修改版
第13章 标准模板库(STL) STL,即Standard Template Library,不是面向对象的编程,而是一种新的编程模式:泛型编程(Generic Programming)。STL是C++标准库的组成部分,STL是很庞大复杂的系统,单单就STL就可写出厚达千页的技术书籍,所以,本章不可能做到面面俱到,重点在于介绍泛型编程的思想和本质,介绍一些常用的方法,为初学者学习STL提供一些感性认识,起到抛砖引玉的作用。 STL是一项比较新的技术,VC6是微软公司比较老的一款编译器,其对STL的支持并不是太好,因此,在本章学习时,推荐采用较新的VC2005甚至是VC2008编译器。 13.1 理解STL STL库是用摸板(template)写出来的,在第12章中也已经提及:模板是STL库的基础所在,大致来说,STL是由三部分组成的: 容器(container) 迭代器(iterator) 容器适配器(Adapter) 算法(algorithm) 容器、容器适配器和迭代器都是用类摸板实现的,迭代器用于遍历容器中的每一个元素,算法用于操作数据。 13.1.1 容器 如果没有STL的支持,在处理一些复杂问题时,要自行设计存储模式,如数组管理,插入删除操作等,这不但很繁琐,而且bug频出,是程序出问题最多的地方。STL运用模板类库机制,为数据存储,查找和其他操作提供了一整套方案,大大提高了程序的正确性,不仅如此,类库对常用的很多操作进行了优化处理,大大提高了程序的效率。 容器即是可容纳一些数据的模板类,STL中有vector,list,deque,set,map,multimap和multiset等容器。 13.1.2 适配器 适配器就是Interface(接口),对容器、迭代器和算法进行包装,但其实质还是容器、迭代器和算法,只是不依赖于具体的标准容器、迭代器和算法类型,容器适配器可以理解为容器的模板,迭代器适配器可理解为迭代器的模板,算法适配器可理解为算法的模板。 常见的容器适配器有stack、queue和priority_queue。 13.1.3 迭代器 在有的专业书籍中,迭代器也称游标,可以将迭代器初步理解为广义指针,迭代器和指针功能很像,迭代器是通过重载一元的”*”和”-”来从容器中间接地返回一个值。 迭代器有5种,依次为:随机访问迭代器(Random Access Iterator)、双向迭代器(Bidirectional Iterator)、前向迭代器(Forward Iterator)、输入迭代器(Input Iterator)和输出迭代器(Output Iterator),稍后会有详细的介绍。 13.1.4 算法 STL包含了很多对容器进行处理的函数,它们的处理思路大体相同:使用迭代器来标识要处理的数据或数据段、以及结果的存放位置,有的函数还作为对象参数传递给另一个函数,实现数据的处理。 13.2 使用序列式容器 容器是STL的基础,容器有序列式容器(sequential container)和关联式容器(associative container)之分。总体来说,序列式容器会强调元素的次序,依次维护第一个元素、第二个元素……,直到最后一个元素,面向序列式容器的操作主要是迭代操作,本节来讨论下序列式容器vector、list和deque的用法,以及序列式容器的共同操作。 13.2.1 序列式容器的创建和元素的访问 要使用序列式容器,必须包含相关的头文件,vector、list以及deque分别对应于: #include vector #include list #include deque 首先看一下如何创建序列式容器的对象,大体有以下几种方式: (1)创建空的容器,此时容器中的元素个数为0。 (2)产生特定大小的容器,,此时容器中的元素被创建,但未被显式初始化,编译器使用默认值为元素隐式初始化,像int、float和double等内建的数据类型会被初始化为0,对于类对象元素,将调用其无参构造函数(用户定义的或编译器缺省提供的)或每个参数都有默认值的构造函数。 (3)在(2)的基础上更进一步,创建特定大小的容器,并且为其中的每个元素指定初始值,此时在元素多少的参数后增加一个参数。 (4)根据已有同类型的容器创建新容器,并将其中的元素完全复制过来,设obV1、obL1和obD1都是现成的容器,里面存储的数据均为int型,则可用下述命令创建新容器。 (5)通过一对迭代器(可暂时理解为指针),以使编译器决定元素的个数和出值,这对迭代器用以标识一组元素区间。 13.2.2 所有容器都支持的特征 中,“obL.begin()”返回的是指向容器第一个元素的迭代器,这是所有容器(容器和容器适配器
文档评论(0)