第12章 模板与STL

来源:互联网 发布:知乎 电钢琴 编辑:程序博客网 时间:2024/06/09 17:29

1、  STL standard template library即标准模板库,是C++中的标准库。STL主要目的是提供通用的代码,包括:容器、迭代器和算法。

 

函数模板技术定义了参数化的非成员函数,使得程序能够使用不同的参数类型调用相同的函数。编译器确定了模板函数的实际类型参数,称之为模板的实例化。

类模板在调用时需要明确指出使用何种数据类型,而不能有编译器自行指定。实际使用类模板之前,编译器不会为该模板生成任何代码。而是在又被调用时再由编译器为不同的数据类型根据类模板生成不同的代码。

 

类模板的模板参数调用除了class进行定义以为,可以使用其他数据类型,但是至少需要有一个模拟形参是使用class定义的。

类模板是使用模板技术的类,描述了能够管理其他数据类型的通用的数据类型。类模板技术通常用于建立包含其他类型的容器类,例如队列、链表和堆栈。(该容器类为其他数据类型提供通用的行为,该行为与具体的数据类型细节不相关。)

 

2、 容器是容纳特定类型对象的集合,因此容器中的对象必须是同一类型,而且该类型必须是可拷贝构造和可赋值的。STL容器可以包括的类型有内置的基本数据类型、带有公用拷贝构造函数、赋值操作符)

STL中提供容器有vector/list/deque/set/multiset/map/multimap

容器可以视为数组的扩展,即对象的数组(广义数组),其中元素(对象)提供容器对“[]“的重载,可以和数组一样利用下标(索引)来访问。

 

STL中提供2种类型容器

1顺序容器vector/list/deque:将一组具体相同类型T的对象,以线性形式组织在一起,可以视为数组和链表的推广。

2关联容器set/multiset/map/multimap:提供一个key(键)实现对元素的随机访问,其特点是key是有序的,即元素是按预定义的键顺序插入的。关联容器具有从基于键的集合中快速提取对象的能力,其中集合的大小在运行时是可变的。关联容器可以视为关联数组、映射或字典的推广。

 

容器适配器,不是独立的容器,只是某种容器的变种,提供原容器的一个专用的受限接口。不提供迭代器。STL中有3种容器适配器:stack/queue/priority_queue(优先队列)

注意:优先队列,并不要求其全部元素都是有序的而只要求其第一个元素最大的。

 

3、 vector多用于不需要对数据进行随机增删的场合。

访问vector的数据有如下两种方法:

vector::at();//首选at(),因为at()进行边界检查,若访问超过vector范围,将抛出一个异常,而operator[]不会;

vector::operator[];//operator[]是为了与C语言进行兼容;

 

deque是一个双端队列,存放的数据不是以连续的形式存放的。

list是一种链表的实现,存储的元素是通过使用双向链表实现。(对于list中的内容只能通过连续的方式对元素进行存储。)


4、迭代器是STL提供的对一个容器中的对象的访问方法,并且定义了容器中对象的范围。迭代器不仅仅是指针,因此不能认为迭代器一定具有地址值。

 

注意begin指向容器中第一个元素,end指向的是容器中的最后一个元素的下一个位置,也就是说end所指向的并不是容器的元素。通常beginend之间的范围就是迭代器的范围

 

使用迭代器之前,不应该存储操作end()的返回值。如果保持了end()的返回之后,又对容器的元素进行插入和删除,将会导致end()迭代器失效。

 

5、 STL中两个基本的关联容器,分别是mapset

Map的元素是“键-值“对的二元组形式即键用作元素在map中的索引,而值则表示所存储和读取的数据。Set仅包含一个键,并有效地支持关于某个键是否存在的查询。Setmap类型的对象所包含的元素都具有不同的键。若需要一个键对应对应多个实例,则需要使用multimapmultiset类型。这两种类型允许多个元素拥有相同的键。

 

Set中所包含的元素的值是唯一的,集合中的元素按一定的顺序排列,并被作为集合中的实例。

Map:经过了排序的二元组的集合,map中的每个元素都是由两个值组成,其中的key(键值,一个map中的键值必须是唯一的)是在排序或搜索时使用,它的值可以在容器中重新获取;而另一个值是该key关联的数值。

关联容器能够通过键值(关键字)来查找和读取元素的容器。

 

6、 泛型编程,以独立于任何特定类实现的方式编写代码。使用泛型程序时,需要用户具体程序实例所操作的类型或值。

 

泛型编程,其多态性指所编写的类和函数能在编译时确定使用何种类型。通过使用泛型编程,一个类或函数可以操作多个类型的对象,而这些对象之间并不存在任何的关系。

 

泛型编程使用了模板技术,而使用模板技术时编译器会为不同的参数类型生成不同的目标代码、如果在程序中大量使用泛型,而且各自参数类型不一样时会显著增大程序的大小。

 

C++中的标准库STL的容器、迭代器、算法就是泛型编程的实现。