前面跟大家介绍过STL库,STL主要是由6大部分组成,其中第一个提到的就是容器,容器在介绍STL中小哥有简单的跟大家介绍过,今天稍微再详细介绍一下。
首先需要看看STL中常用的一些容器及分类:
所谓容器表面上的意思就是用于容纳数据,存储数据的对象。
从上图可以看出,基础的容器根据其所存储数据的形式分为顺序容器和关联容器。
顺序容器当然就是数据成员顺序存储的形式,是一种线性结构,每个数据成员都有固定的位置,所以成员都是按位置来进行存储,类似于C语言中的数组形式。
关联容器是一种非线性结构,没有严格的顺序,主要是按数值来进行存储,通常通过迭代器进行访问,迭代器目前可以简单理解为"指针"。
顺序容器主要是三种:vector、list和deque
vector向量,其操作方式类似于动态数组,并且可以像数组一样直接进行访问,且通常只在后端进行添加与删除数据,中间插入效率太低,如果vector向量空间不够,其会动态进行创建。
list双向链表,该链表与我们平常的链表数据结构类似,其索引性能较差,不能进行随机数据访问,不像vector可以直接进行数据访问,而是需要从头不断的进行遍历,但是双向链表list的优点在于可以轻松的向链表容器中插入数据。
deque双端队列属于vector与list的折中版本,支持这两者的大部分操作,不过其性能上都没有其他两种基本容器好。
关联容器主要有四种:map、set、multimap和multiset。
这些关联容器都是基于平衡二叉树来实现的,所以其也是一种链式存储方式,不过相比顺序存储从一条线上扩展到了一个面。
当需要在中间插入元素的时候,对于vector是最慢的,list当然是最快的,而对于关联容器采用二叉树结构,中间插入元素所要改变的关系相比vector要少很多,但比list要多一些。
而对于数据元素的检索,vector无疑是最快的,list当然是最慢的,但对于关联容器其检索效果虽然比不过vector,但由于二叉树的结构查找速度比list要快很多,所以这也就是set容器的优势。
而对于map采用一种key与value的映射关系,相比vector用数字下标进行索引,map能够提供一种用字符来索引的功能,这也就是他的特点,当然也可以理解set是一种key与value相等的map。
而对于mulitset与multimap仅仅只是在set和map容器的元素唯一性上进行了可以不唯一的扩展。
首先容器适配器并不是容器,而是通过封装或限制容器的接口构造一些有特殊用途的适配器结构。
STL中主要包含三种适配器:
stack---栈,先进后出
queue--队列,先进先出
priority_queue--优先级队列
相比普通队列,优先级队列在插入时会根据关键词自动排序,出队列会按照排列顺序优先出队列。
这些容器适配器也可以通过选择不同的基础容器来实现,一般情况下会选择默认容器来进行适配,当然也可以进行手动修改,但不是每种适配器都可以由任意基础容器来进行实现,毕竟每种基础容器存在一些功能上的限制。
好了,这里小哥就简单介绍了STL中的容器和容器适配器的整体介绍,后面会对每个容器举例介绍,本系列文章后续还会更新,记得关注学习哦。
全部0条评论
快来发表一下你的评论吧 !