容器用来管理一组泛型的元素。暂且可以理解为具有特殊 “功能” 的 “特殊数组”。数组体现出集合的特点,特殊功能是指在绑定了一些通用的算法。
常用的几个容器的特点:
set、multiset、map、multimap
各种容器的特点:
vector: 可以随机存取元素(动态数组,连续存储用索引直接存取),在尾部添加或移除元素非常快速。但是在中部或头部安插元素比较费时。(单向)
deque: 双向队列,可以随机存取元素(用索引直接存取),头部和尾部添加或移除元素都非常快速。但是在中部或头部安插元素比较费时。(双向)
list:双向链表,不提供随机存取(按顺序走到需存取的元素,O(n))。在任何位置上执行插入或删除动作都非常迅速,内部只需调整一下指针。
stack,queue,priority_queue: 分别是栈、队列、优先队列,应该称为“适配器” —— 实际使用的是上面三种容器,但是屏蔽或者添加了一些操作, 底层实现还是使用上面的三种容器。
1 stack 堆栈适配器 ( 底层实现可用的容器类型 vector deque list)默认是deque
2 queue 队列适配器 ( 底层实现可用的容器类型 deque list)默认的容器是deque,vector不支持“前出” 操作
3 priority_queue 优先级队列 ( 底层实现可用的容器类型 deque vector)默认是vector
所谓底层默认实现是指在定义适配器的时候,不指定底层实现(少一个参数)。如果需要特定的底层实现,当然则定义适配器时,需要多一个参数。
set/multiset:内部的元素依据其值自动排序,set内的相同数值的元素只能出现一次,multiset内可包含多个数值相同的元素。内部由二叉树实现,便于查找。
map/multimap:map的元素是键值/实值(k-v),内部的元素依据其值自动排序。map内的相同数值的元素只能出现一次,multimap内可包含多个数值相同的元素。内部由二叉树实现,便于查找。
与序列式容器的最大区别是:关联式容器采用非线性结构的树来实现。存放的是key-value队(set底层也使用k-v方式来存放数据),在数据检索时比序列式容器效率更高。其中multi可以理解为允许key的重复。