C++ 容器包括
顺序存储结构:
vector list dequeue
关联存储结构:
set map multiset multimap
vector
连续存储结构,每个元素字内存上都是连续的
支持高效的随机访问和在尾端插入和删除操作,但是其他部位插入和删除操作效率低下
deque
连续存储结构,其每个元素在内存上都是连续的,类似于 vector
不同之处在于 deque 提供了量级数组结构,第一级完全类似于 vector,另一级维护容器首地址
这样,deque 除了具有 vector 功能之外,还支持高效首端插入删除操作
list
非连续存储结构,具有双链表结构,每个元素维护一对前向指针和后向指针,因此支持前向后向遍历
支持高效的随机插入删除操作,但是随机访问效率低下,且由于需要维护额外指针,开销较大
顺序存储结构的选择
- 若是需要随机访问,不关心插入和删除效率,则选择 vector
- 若已知需要存储的个数,选择 vector
- 若需要随机插入和删除(非首尾端)选择 list,这样不能高效随机访问
- 只有在首端需要插入删除的时候,才选择 deque,否则都是 vector
- 当存储大型类对象,list 由于 vector,虽然可以使用 vector 来指向对象指针,这样同样高效,但是指针的维护容易出错,不推荐
capacity V.S size
- capacity是容器需要增长之前,能够盛的元素总数;只有连续存储的容器才有capacity的概念(例如vector,deque,string),list不需要capacity。
- size是容器当前存储的元素的数目。
- vector默认的容量初始值,以及增长规则是依赖于编译器的。
vector 存储自定义类对象时,自定义类对象必须满足
- 有可调用的无参构造函数,默认的自定义的都可
- 有可用的拷贝赋值函数,默认的自定义的都可
迭代器 iterator
- vector 和 deque 的迭代器支持算数运算,list 的迭代器只能进行 ++/-- 操作,不支持普通算数运算
set
- set 里面每个元素只存有一个 key,它支持高效的关键字查询操作,对应数学中的集合
- 存储同一类型的数据元素,这点和 vector queue 相同
- 每个元素的值唯一,没有重复元素
- 根据元素的值自动排列大小
- 无法直接修改元素
- 高效插入删除操作
map
- map 对应数学中的映射,是一种 key-value 的容器
- 高效的插入与删除
- 快速查找
- key 和 value 可以是任何需要的类型
- 可以根据 key 修改 value
- 支持下标[]操作