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
  • 支持下标[]操作
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. vector的特点 内存特点: 内存空间连续,随机访问效率高。插入删除:插入或者删除某个元素,需要将现有元素...
    郑行_aover阅读 2,049评论 0 2
  • 一、string 虽然string一般不被认为是C++的容器,但是它和容器具有很多相同的特点。因此先说一下stri...
    play_robot阅读 970评论 0 0
  • (2020.12.08 Tues)STL容器允许重复利用已有的实现构造自己特定类型下的数据结构,通过设置一些模板类...
    Mc杰夫阅读 316评论 0 0
  • 原文链接 什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它...
    Franck2020阅读 504评论 0 0
  • 什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其...
    Jack_Cui阅读 500评论 0 2