1. 容器
容器分为:顺序容器,关联容器,容器适配类
2. 顺序容器
是一种各个元素之间有顺序关系的线性表
- verctor 将元素保持在连续的存储空间
- deque
- list 双链表,从任何地方快速插入与删除
2.1 vector
相当于数组,可以通过下标随机访问,速度很快。但是在容器的中间位置添加和删除文件非常耗时。因为一次插入和删除操作都需要移动插入和删除位置之后的所有元素,来保护连续的存储。而且添加元素有时还需要分配额外的存储空间,拷贝数据到新空间,并释放老的空间
在创建一个vector后,它会自动在内存中分配一块连续的内存空间进行数据存储,初始的空间大小可以预先指定或由vector 默认指定,这个大小即capacity()函数的返回值。当存储的数据超过分配的空间时,vector会重新分配一块内存块,但这样的分配很耗时,在重新分配空间时会做这样的动作:
1.vector 会申请一块更大的内存块,然后将原来的数据拷贝到新的内存块中,接着销毁内存块中的对象,最后将原来的内存空间释放掉
2.如果vector保持的数据量很大时,这样操作会导致槽糕的性能。
2.2 list
这是一个线性链表结构,他的数据由若干个节点构成,每一个节点都包括一个信息块,一个前驱指针和一个后驱指针。他无需分配指定的内存块且可以任意伸缩,这是因为它存储在非连续的内存空间中,并且由指针有序的元素链接起来
容器使用链表在任何位置添加和删除速度很快,但是代价是不支持随机访问,为了一个元素访问,需要遍历整个容器
容器使用链表
2.3 deque
这是一种优化了的,对两端添加和删除操作的顺序容器。允许较为快速的随机访问,它不想vector把所有对象保持在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结构中保持对这些块及其顺序的追踪。向两端添加和删除的开销很小。不需要重新分配空间,所以向末端增加元素比vector更有效。deque 是对vector和list的优缺点结合,介于二者之间的容器
3. 关联容器
各个元素之间没有严格的物理上的顺序关系
- set 快速查找,不允许重复值
- multiset 快速查找,允许重复值
- map 对多映射,基于关键字查找,不允许重复值
- multima 对多映射,基于关键字查找,允许重复值
4. 容器适配器
容器的接口
- stack 后进先出
- queue 先进先出
- proority_queue 最高优先级元素总是第一个出列