【C++】STL基本容器的简单介绍------(10个)

容器是什么

在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。很简单,容器就是保存其它对象的对象,这种“对象”还包含了一系列处理“其它对象”的方法。“容器类是一种对特定代码重用问题的良好的解决方案”。

容器的分类

容器分为三大类
 

一、顺序容器

          是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。这个位置和元素本身无关,而和操作的时间和地点有关,顺序性容器不会根据元素的特点排序而是直接保存了元素操作时的逻辑顺序。比如我们一次性对一个顺序性容器追加三个元素,这三个元素在容器中的相对位置和追加时的逻辑次序是一致的。

1、vector(参量)

      定义:是一个线性顺序结构。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们可以将vector 看作动态数组。

      特点:

①随机访问方便;

②节省空间;因为他是连续存储,在存储数据的区域都没有浪费,未存储的区域是浪费的;

③只能在vector的最后进行push和pop,不能在vector头进行;

④在创建vector时指定其空间大小(达到最优性能)

2、deque(双端队列)      映射关系

     定义:是一种优化了的、对序列两端元素进行添加和删除操作的基本序列容器。它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结构中保存对这些块及其顺序的跟踪。向deque 两端添加或删除元素的开销很小。它不需要重新分配空间,所以向末端增加元素比vector 更有效。

deque 是对vector 和list 优缺点的结合,它是处于两者之间的一种容器。

     特点:

① 随机访问方便;

② 可以在内部进行插入和删除操作;

③ 可以在两端进行push和pop。

3、list(列表)

     定义:是一个线性链表结构,它的数据由若干个节点构成,每一个节点都包括一个信息块(即实际存储的数据)、一个前驱指针和一个后驱指针。它无需分配指定的内存大小且可以任意伸缩,因为它存储在非连续的内存空间中,并且由指针将有序的元素链接起来。

     它可以迅速地在任何节点进行插入和删除操作。因为list 的每个节点保存着它在链表中的位置,插入或删除一个元素仅对最多三个元素有所影响,不像vector 会对操作点之后的所有元素的存储地址都有所影响。

    

    特点:

①不使用连续的内存空间,可以随意的进行动态操作;

②可以在内部任何位置快速的插入删除,可以在两端进行Push和pop;

③list不能排序,用成员方法排序list.sort()进行排序,用list.clear()清空

二、关联容器(红黑树实现——一旦插入,所有联系失效)

            和顺序性容器不一样,关联式容器是非线性的树结构,更准确的说是二叉树结构(平衡检索二叉树——红黑树)。各元素之间没有严格的物理上的顺序关系,也就是元素在容器中并没有保存元素置入容器时的逻辑顺序。但是关联式容器提供了另一种根据元素特点排序的功能,这样迭代器就能根据元素的特点“顺序地”获取元素。

            关联式容器另一个显著的特点是它是以键值的方式来保存数据,就是它能把关键字和值关联起来保存,而顺序性容器只能保存一种(可以认为它只保存关键字,也可以认为它只保存值)。可以通过关键字直接访问

1、set(集合)(集合中的元素一定要能比较大小)

定义:就是一组元素的集合,但其中所包含的元素的值是唯一的,且是按一定顺序排列的,集合中的每个元素被称作集合中的实例。因为其内部是通过链表的方式来组织,所以在插入的时候比vector 快,但在查找和末尾添加上被vector 慢。

2、multiset(多重集合)

定义:是多重集合,其实现方式和set 是相似的,只是不要求集合中的元素是唯一的,也就是集合中的同一个元素可以出现多次。

3、map(映射)

定义:提供一种“键- 值”关系的一对一的数据存储能力。其“键”在容器中不可重复,且按一定顺序排列(其实我们可以将set 也看成是一种键- 值关系的存储,只是它只有键没有值。它是map 的一种特殊形式)。由于其是按链表的方式存储,它也继承了链表的优缺点。

map添加元素:值类型如果是自定义类型,一定要有默认的构造函数

4、multmap(多重映射)

定义:同map相似,“键”在元素中不唯一。

映射和多重映射的区别:

          映射和多重映射类提供了操作与关键字相关联的映射值(mapped value)的方法。映射和多重映射的主要差别在于多重映射允许存放与映射值相关联的重复关键字,而映射只允许存放与映射值一一对应的单一关键字
           多重映射和映射关联容器类用于快速存储和读取关键字与相关值(关键字/数值对,key/value pair)。如果保存学生的简明资料,要求按学号排序,使用映射关联容器(因为不会重号)是最合适的。如用姓名排序,因姓名可能重复,使用多重映射更为合适。使用时要用头文件<map>。

三、容器适配器

             C++的解释是:适配器是使一事物的行为类似于另一事物的行为的一种机制。

             容器适配器是让一种已存在的容器类型采用另一种不同的抽象类型的工作方式来实现的一种机制。其实仅是发生了接口转换。那么可以理解为容器的容器,它实质还是一个容器,只是他不依赖于具体的标准容器类型,可以理解是容器的模版。或者把它理解为容器的接口,而适配器具体采用哪种容器类型去实现,在定义适配器的时候可以由你决定。

1、stack(栈)

它关联的基本容器可以是任意一种顺序容器,因为这些容器类型结构都可以提供栈的操作有求,它们都提供了push_back 、pop_back 和back 操作;

2、queue(队列)

适配器要求其关联的基础容器必须提供pop_front 操作,因此其不能建立在vector 容器上;

3、priority-queue(优先级队列)

       元素插入是自动按优先级顺序插入,使最高优先级元素首先从优先级队列中取出。常用矢量为基础容器。缺省时priority_queue用vector为基础数据结构。 

要求提供随机访问功能,因此不能建立在list 容器上。

猜你喜欢

转载自blog.csdn.net/like_that/article/details/89706747