C++ 容器梳理

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
  • 支持下标[]操作

你可能感兴趣的:(C++ 容器梳理)