STL实用教程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

STL(StandardTemplateLibrary,标准模板库)实例教程|观心大师传智播客--C++学院STL(StandardTemplateLibrary)标准模板库实例教程观心大师基本概念STL(StandardTemplateLibrary,标准模板库)是惠普实验室开发的一系列软件的统称。现在是一个C++软件库,也是C++标准程序库的一部分,但在被引入C++之前该技术就已经存在了很长的一段时间。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面的13个头文件:algorithm、deque、functional、iterator、vector、list、map、memory、numeric、queue、set、stack和utility。STL详细的说六大组件–容器(Container)–算法(Algorithm)–迭代器(Iterator)–仿函数(Functionobject)(就是使一个类的使用看上去象一个函数。其实现就是在类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)–适配器(Adaptor)(适配器是使一事物的行为类似于另一事物的行为的一种机制)(包括容器适配器、迭代器适配器和函数适配器)–空间配制器(allocator)STL(StandardTemplateLibrary,标准模板库)实例教程|观心大师面试过程中会遇到一些有关STL方面的面试题,而且STL在企业开发中应用也很广泛。所以STL是C++程序员的一项不可或缺的基本技能,掌握它对提升C++编程大有裨益。容器在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要。经典的数据结构数量有限,但是我们常常重复着一些为了实现向量、链表等结构而编写的代码,这些代码都十分相似,只是为了适应不同数据的变化而在细节上有所出入。STL容器就为我们提供了这样的方便,它允许我们重复利用已有的实现构造自己的特定类型下的数据结构,通过设置一些模版类,STL容器对最常用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化。容器部分主要由头文件vector,list,deque,set,map,stack和queue组成。对于常用的一些容器和容器适配器(可以看作由其它容器实现的容器),可以通过下表总结一下它们和相应头文件的对应关系。容器的概念管理一组指定类型的元素。容器的分类序列式容器是一种线性结构,然后根据位置来存储和访问这些元素,这就是序列式容器。Vector(向量)、deque(双端队列)、list(列表)STL(StandardTemplateLibrary,标准模板库)实例教程|观心大师关联式容器是一种非线性的树结构,和插入顺序无关通过键(key)来高效地查找和读取元素Set(集合)、multiset(多重结合)、map(映射)、multimap(多重映射)容器适配器容器适配器让一种已存在的容器类型采用另一种不同的抽象类型的工作方式实现。例如:stack(栈)适配器可使任何一种顺序容器以栈的方式工作。系统提供了三种序列式容器适配器:stack(栈)、queue(队列)以及priority_queue(优先级队列)。所有的适配器都会在其基础顺序容器上定义一个新接口。使用STL的好处STL是C++的一部分,因此不用额外安装什麽,它被内建在你的编译器之内。STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但是这种分离确实使得STL变得非常通用。例如,STL的sort()函数可以用来操作vector,list等容器。STL具有高可重用性,高性能,高移植性,跨平台的优点。高可重用性:STL中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。高性能:如map可以高效地从十万条记录里面查找出指定的记录,因为map是采用红黑树的变体实现的。(红黑树是平横二叉树的一种)高移植性:如在项目A上用STL编写的模块,可以直接移植到项目B上。跨平台:如用windows的VisualStudio编写的代码可以在MacOS的XCode上直接编译。程序员可以不用思考STL具体的实现过程,只要能够熟练使用STL就OK了。了解到STL的这些好处,我们知道STL无疑是最值得C++程序员骄傲的一部分。每一个C++程序员都应该好好学习STL。只有能够熟练使用STL的程序员,才是好的C++程序员。标准容器类特点顺序性容器Vector(向量)动态数组,从后面快速的插入与删除,快速直接访问任何元素STL(StandardTemplateLibrary,标准模板库)实例教程|观心大师List(列表)双链表,从任何地方快速插入与删除Deque(双端队列)从前面或后面快速的插入与删除,快速直接访问任何元素关联容器Set(集合)快速查找,不允许重复值Multiset(多重集合)快速查找,允许重复值Map(映射)(key,value)基于关键字快速查找,不允许重复值Multimap(多重映射)(key,value)基于关键字快速查找,允许重复值容器适配器Stack(栈)后进先出Queue(队列)先进先出priority_queue(优先队列)最高优先级元素总是第一个出列Vector容器模型(动态数组)Vector容器简介vector是将元素置于一个动态数组中加以管理的容器。vector可以随机存取元素(支持索引值直接存取,用[]操作符或at()方法,这个等下STL(StandardTemplateLibrary,标准模板库)实例教程|观心大师会详讲)。vector尾部添加或移除元素非常快速。但是在中部或头部插入元素或移除元素比较费时头文件:#includevectorvector对象的默认构造vector采用模板类实现,vector对象的默认构造形式:vectorTvecT;示例:容器中可以添加常规数据类型:vectorintvecInt;//一个存放int的vector容器。vectorfloatvecFloat;//一个存放float的vector容器。vectorstringvecString;//一个存放string的vector容器。尖括号内还可以设置指针类型或自定义类型:ClassCA{};vectorCA*vecpCA;//用于存放CA对象的指针的vector容器。vectorCAvecCA;用于存放CA对象的vector容器。由于容器元素的存放是按值复制的方式进行的,所以此时CA必须提供CA的拷贝构造函数,以保证CA对象间拷贝正常。vector末尾的添加移除操作理论知识:在末尾添加元素:push_back(element)在末尾移除元素:pop_back()示例:vectorintvecInt;//在容器尾部加入一个元素STL(StandardTemplateLibrary,标准模板库)实例教程|观心大师vecInt.push_back(1);vecInt.push_back(3);vecInt.push_back(5);vecInt.push_back(7);vecInt.push_back(9);//移除容器中最后一个元素vecInt.pop_back();vecInt.pop_back();//打印结果135vector的数据存取理论知识vec.at(idx);返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。vec[idx];返回索引idx所指的数据,越界时,运行直接报错vec.front();返回第一个元素的引用vec.back();返回最后一个元素的引用示例:vectorintvecInt;//假设包含1,3,5,7,9vecInt.at(2)==vecInt[2];//5vecInt.at(2)=8;或vecInt[2]=8;vecInt就包含1,3,8,7,9值intiF=vector.front();//iF==1intiB=vector.back();//iB==9vector.front()=11;//vecInt包含{11,3,8,7,9}vector.back()=19;//vecInt包含{11,3,8,7,19}STL(StandardTemplateLibrary,标准模板库)实例教程|观心大师vector的大小理论知识:vec.size()返回容器中元素的个数vec.empty()判断容器是否为空vec.resize(num)重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。vec.resize(num,elem)重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。示例:例如vecInt是vectorint声明的容器,现已包含1,2,3元素。intiSize=vecInt.size();//iSize==3;boolbEmpty=vecInt.empty();//bEmpty==false;执行vecInt.resize(5);//此时里面包含1,2,3,0,0元素。再执行vecInt.resize(8,3);//此时里面包含1,2,3,0,0,3,3,3元素。再执行vecInt.resize(2);//此时里面包含1,2元素。迭代器概念迭代器是一种检查容器内元素并遍历元素的数据类型。标准库为每一种标准容器(包括vector)定义了一种迭代器类型。迭代器类型提供了比下标操作更通用化的方法:所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。因为迭代器对所有的容器都适用,现代C++程序更倾向于使用迭代器而不是下标操作访问容器元素,即使对支持下标操作的vector类型也是这样。每种容器类型都定义了自己的迭代器类型,如vector:STL(StandardTemplateLibrary,标准模板库)实例教程|观心大师vector数据类型::iterator变量名;//正向迭代器Vector数据类型::const_iterator变量名;//只读正向迭代器vector数据类型::reverse_iterator变量名;//逆向迭代器Vector数据类型::const_reverse_iterator变量名;//只读逆向迭代器迭代器可以看做是一个指针迭代器的分类输入迭代器:也有叫法称之为“只读迭代器”,它从容器中读取元素,只能一次读入一个元素向前移动,只支持一遍算法,同一个输入迭代器不能两遍遍历一个序列。(了解)输出迭代器:也有叫法称之为“只写迭代器”,它往容器中写入元素,只能一次写入一个元素向前移动,只支持一遍算法,同一个输出迭代器不能两遍遍历一个序列。(了解)正向迭代器:组合输入迭代器和输出迭代器的功能,还可以多次解析一个迭代器指定的位置,可以对一个值进行多次读/写。(了解)双向迭代器:双向迭代器具有正向迭代器的全部功能。另外它还可以利用自减操作符operator--向后一次移动一个位置。由list容器中返回的迭代器都是双向的。(重点)随机访问迭代器:具有双向迭代器的所有功能,还可以向前向后跳过任意个位置,可以直接访问容器中任何位置的元素。(重点)目前本系列教程所用到的容器,都支持双向迭代器或随机访问迭代器,下面将会详细介绍这两个类别的迭代器。双向迭代器与随机访问迭代器双向迭代器支持的操作:

1 / 86
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功