浅谈C++容器

在面向对象程序中,大多引入了容器的概念。那么什么是容器?实质上是一组相同类型对象的集合,但它不单单是数组那么简单,它实现了比数组更复杂的数据结构,可以实现更复杂的功能。C++标准模版库里提供了10种通用的容器,它基本能够解决程序中遇到的大部分问题。算法

什么是容器数组

C++中容器的定义以下:数据存储上,有一种对象类型,它能够持有其余对象或指向其余对象的指针,这种对象类型叫容器。通俗的说容器就是保存其余对象的对象,这种“对象”还包含了一些列处理其余对象的方法,这也体现了容器类的一个好处,“容器类对特定代码重用问题的良好的解决方案”。数据结构

容器另外一个好处就是能够自行扩展,解决问题是咱们不知道须要存储多少个对象,数组在这方面是个欠缺。容器能够为你申请内存、释放内存,而且使用最优的算法来执行你的命令。函数

通用容器的分类性能

(1)顺序性容器:各元素之间有顺序关系的线性表,是一种线性关系的有序集群,顺序容器中的元素均有固定的位置,除非用删除和插入来改变它的位置,这个位置和元素自己无关,和操做时间和地点有关。指针

vector:从后面快速删除和插入,访问任一元素;对象

deque:从前面或后面快速删除和插入,访问任一元素;排序

list:双联表,从任何位置插入和删除;接口

(2)关联式容器:非线性的树结构(二叉树结构),各元素之间没有严格的物理顺序。关联容器提供了根据元素特色排序的功能,迭代器根据元素特色“顺序”的取元素。队列

set:快速查找,不容许重复值;

multiset:快速查找,容许重复值;

map:一对多映射,基于关键字快速查找,不容许重复值;

multimap:一对多映射,基于关键字快速查找,容许重复值;

(3)容器适配器:让一种已存在的容器类型采用另外一种不一样抽象类型的工做方式来实现的一种机制。实质上仅发生了接口转换。

stack:后进先出;

queue:先进先出;

priority_queue:最高优先级第一个出列;

顺序性容器

(1)向量vector:咱们能够把它当作动态数组,建立一个vector后,它会在内存中分配一块连续的区域存储数据,初试空间能够指定也能够有vector决定(capacity()函数返回值)。当数据存储空间超过度配空间,vector会从新分配一块内存区域,这样的分配很耗时,动做以下:

首先,vector申请一块更大内存区域;

而后,将原来的数据拷贝到新的内存区域;

其次,销毁原来内存块数据;

最后,释放原来内存空间。

因此,若是vector保存的数据量很大,这样的操做会致使很糟糕的性能。只有在预知空间大小的状况下,vector的性能才是最好的。

(2)双向链表List:双向线性链表结构,指针将全部元素连接起来。根据其结构特色,List检索性能很差,须要顺序查找,检索时间与目标元素位置成正比。可是它能够对快速的删除和插入。

(3)双端队列deque:对序列两端插入和删除的容器,能够快速的随即查找。它不像vector把全部元素存储在同一内存块,而是采用多个连续的存储块,而且一个映射结构中保存对这些块和元素顺序的跟踪。deque是vector和List优缺点的结合,它是处于二者之间的一种容器。支持[]及vector.at(),性能没有vector好。

关联容器

set,multiset,map,multimap都是非线性结构的树结构,采用高效的平衡检索二叉树——红黑树结构。

(1)set:一组元素的集合,元素值是惟一的,且按必定顺序排列,集合中每一个元素称为集合的实例,内部采用链表结构组织;

(2)multiset:多重集合,实现方式相似set,元素值不惟一;

(3)map:提供“键--值”一一对应的数据存储能力,“键”在容器中不可重复,且按必定顺序排列;

(4)multimap:原理同上,“键”在容器中可重复。

关联容器插入和删除比vector快,比List要慢,每次插入删除后须要对元素重现排序;

关联容器检索比vector慢,但比List要快得多;

容器适配器

STL提供的三种适配器能够由某一种顺序容器去实现,默认stack和queue是基于deque容器实现,prioriety_queue是基于vector实现。

相关文章
相关标签/搜索