C++容器
文章目录
概念
- 数据存储上的一种对象类型, 可以持有其他对象或指向其他对象的指针(保存其他对象的对象)
- 一种对特定代码重用问题的良好解决方案
- 可自行扩展, 自动申请释放内存
- 通用容器分类
- 顺序性容器
- 各元素之间有顺序关系的线性表, 一种线性结构的可序群集
- 每个元素有固定位置, 保存元素操作时的逻辑顺序, 无关元素本身, 删除/插入操作改变此位置
- 只保存关键字/值
- 关联式容器
- 二叉树结构, 元素之间无严格物理顺序关系, 可根据元素特点顺序地获取元素
- 以键值方式保存数据, 把关键字和值关联起来保存
- 容器适配器
- 容器的容器, 已存在的容器类型采用另一种不同的抽象类型的工作方式来实现, 不依赖于具体的标准容器类型
- 顺序性容器
对比
标准容器类 | 特点 |
---|---|
顺序性容器 | |
vector | 从后面快速插入删除, 直接访问任何元素 |
deque | 从前/后快速插入删除, 直接访问任何元素 |
list | 双链表, 从任何地方快速插入删除 |
关联式容器 | |
set | 快速查找, 不许重复值 |
multiset | 快速查找, 允许重复值 |
map | 一对多映射, 基于关键字快速查找, 不许重复值 |
multimap | 一对多映射, 基于关键字快速查找, 允许重复值 |
容器适配器 | |
stack | 后进先出 |
queue | 先进先出 |
priority_queue | 最高优先级元素总是第一个出列 |
容器类
顺序性容器
vector
- 线性顺序结构, ≈动态数组
- 动态操作: 在vector最后
push_back()``pop_back()
- 可像数组一样操作, 支持
[]
操作符,vector.at()
- 动态操作: 在vector最后
- 内部插入/删除效率很低, 禁止
- 节省空间, 连续存储, 存储区不浪费, 但vector多数不满存, 未存储区域被浪费
- 大小可以不预先指定, 自动扩展
- 创建后自动在内存中分配一块连续的内存空间进行数据存储, 初始空间大小可预先指定/vector默认指定
- 存储数据超过分配空间时vector会重新分配一块内存块
- vector申请一块更大内存块
- 原来数据拷贝到新内存块
- 销毁原内存块的对象
- 释放原来内存空间
- 若vector保存数据量很大, 会导致差性能
- 消耗性能, 最好创建时指定空间大小
双向链表list
- 线性链表结构, 数据由若干节点构成, 每个节点包括(信息块x1, 前驱指针x1, 后驱指针x1)
- 无法内部随机访问, 不支持
[]
操作符和vector.at()
- 无需分配指定内存大小且可任意伸缩: 存储在非连续内存空间, 由指针将有序的元素链接
- 无法内部随机访问, 不支持
- 随即检索性能差, 不像vector一样直接找到元素地址, 要从头一个个顺序查找, 时间α目标位置
- 可迅速在任何节点插入/删除
- 内存占用比vector多
双端队列deque
- 优化的, 对序列两端元素添加&删除操作的基本序列容器
- 多个连续存储块, 在一个映射结构中保存对这些块及顺序跟踪
- 允许较快随机访问
- 可在两端
push
,pop
, 向两端增删元素开销很小 - 随机访问方便, 支持
[]``vector.at()
, 性能<vector - 可在内部插入,删除, 性能<list
关联容器
- set,multiset,map,multimap是红黑树结构(非线性), 同1原理, 核心算法一致
set
- 集合, 其中元素值唯一, 按一定顺序排列
- 每个元素称为集合的实例
- 以链表方式组织
- 使用上set是内部排序, 查询上弱于vector, 强于list
multiset
- 多重集合, 不要求元素唯一
map
- 提供键-值一对一数据存储能力
- 键不可重复, 按一定顺序排列
- set是map的特殊形式(有键无值)
- 按链表方式存储
- map不可取代, 保存了键-值关系的数据, 用字符关键字索引元素位置, 也可通过下标检索
multimap
- 类似map, 允许键在容器不唯一
容器适配器
- 容器的接口, 本身不直接保存元素, 保存元素的机制是调用另一种顺序容器去实现
- stack&queue基于deque容器实现
- priority_queue基于vector容器实现
栈stack
- 后进先出, 关联的基本容器可以是任意一种顺序容器, 这些容器类结构都可以提供栈的操作要求
push_back, pop_back, back
队列queue
- 先进先出, 要求关联的基础容器提供
pop_front操作
, 不能建立于vector容器
优先级priority_queue
- 提供随机访问功能, 不能建立在list容器