STL(“容器”集合)讲解
STL(模板库)
【题外话】:心血来潮,忽然想深入研究一下关于Map[]数组,就去上百度,上博客忽然发现Map[]数组类属于STL。相信提到Map[]数组大家想必不会陌生,但是这个STL是个什么鬼,想必大家和我一样,一脸懵逼。莫慌,接下来让我带着你们一起剥光她,看个清楚、看个透彻。。。。
一、STL概念(来源于度大婶)
STL是Standard Template Library的简称,中文名标准模板库,是由惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用安装额外的库文件。
二、STL组成部分
2.1容器
STL容器就为我们提供了很多方便,它允许我们重复利用已有的实现构造自己的特定类型下的数据结构,通过设置一些模板类,STL容器对最常用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化。
容器部分主要由头文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>组成。对于常用的一些容器和容器适配器(可以看作由其它容器实现的容器),可以通过下表总结一下它们和相应头文件的对应关系。
2.2迭代器
迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。
说到迭代器,咋们再往深研究一下,迭代器从作用上来说是最基本的部分。不过,在研究迭代器之前,我们得先搞清楚软件设计的一个最基本的原则。软件设计有一个基本原则,所有的问题都可以通过引进一个间接层来简化,这种简化在STL中就是用迭代器来完成的。概括来说,迭代器在STL中用来将算法和容器联系起来,起着一种黏和剂的作用。几乎STL提供的所有算法都是通过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。
迭代器部分主要由头文件<utility>,<iterator>和<memory>组成。<utility>是一个很小的头文件,它包括了贯穿使用在STL中的几个模板的声明,<iterator>中提供了迭代器使用的许多方法,而对于<memory>的描述则十分的困难,它以不同寻常的方式为容器中的元素分配存储空间,同时也为某些算法执行期间产生的临时对象提供机制,<memory>中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。
2.3算法
三、STL之顺序容器vector、deque、list、forward_list、array、string
一个容器就是一些特定类型对象的集合。顺序容器(sequential Container)为程序员提供了控制元素存储和访问顺序的能力,这种访问顺序是不依赖元素的值,而是与元素假如容器时的位置相对应。
标准库中提供了以下顺序容器,所有顺序容器都提供了快速顺序访问元素的能力,如下。
vector |
可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢。 |
deque | 双端队列。支持快速快速访问。在头尾位置插入/删除速度很快。 |
list | 双向链表。只支持双向顺序访问。在list中任何位置进行插入/删除操作速度都很快。 |
forward_list | 单向链表。只支持单向顺序访问。在链表任何位置进行插入/删除操作速度都很快。 |
array | 固定大小数组。支持快速随机访问,不能添加或删除元素。 |
string | 与vector相似的容器,但专门用于保存字符。随机访问快,在尾部插入/删除都很快。 |
以下是一些选择容器的基本原则(具体视情况而定,这里只是一般情况):
1、通常vector是最好的选择,除非你有很好的理由选择其他容器;
2、如果程序有很多小的元素,且空间额外开销很重要,则不要使用list或forward_list容器;
3、如果程序要求随机访问,应使用vector或deque容器;
4、如果程序要在头尾位置插入/删除,且不会在中间位置进行插入/删除操作,则应使用deque容器。