【C++】容器

C++容器

概念

  • 数据存储上的一种对象类型, 可以持有其他对象或指向其他对象的指针(保存其他对象的对象)
    • 一种对特定代码重用问题的良好解决方案
    • 可自行扩展, 自动申请释放内存
  • 通用容器分类
    • 顺序性容器
      • 各元素之间有顺序关系的线性表, 一种线性结构的可序群集
      • 每个元素有固定位置, 保存元素操作时的逻辑顺序, 无关元素本身, 删除/插入操作改变此位置
      • 只保存关键字/值
    • 关联式容器
      • 二叉树结构, 元素之间无严格物理顺序关系, 可根据元素特点顺序地获取元素
      • 以键值方式保存数据, 把关键字和值关联起来保存
    • 容器适配器
      • 容器的容器, 已存在的容器类型采用另一种不同的抽象类型的工作方式来实现, 不依赖于具体的标准容器类型

对比

标准容器类特点
顺序性容器
vector后面快速插入删除, 直接访问任何元素
deque前/后快速插入删除, 直接访问任何元素
list双链表, 从任何地方快速插入删除
关联式容器
set快速查找, 不许重复值
multiset快速查找, 允许重复值
map一对多映射, 基于关键字快速查找, 不许重复值
multimap一对多映射, 基于关键字快速查找, 允许重复值
容器适配器
stack后进先出
queue先进先出
priority_queue最高优先级元素总是第一个出列

容器类

顺序性容器


在这里插入图片描述

vector

  • 线性顺序结构, ≈动态数组
    • 动态操作: 在vector最后push_back()``pop_back()
    • 可像数组一样操作, 支持[]操作符, vector.at()
  • 内部插入/删除效率很低, 禁止
  • 节省空间, 连续存储, 存储区不浪费, 但vector多数不满存, 未存储区域被浪费
  • 大小可以不预先指定, 自动扩展
    • 创建后自动在内存中分配一块连续的内存空间进行数据存储, 初始空间大小可预先指定/vector默认指定
    • 存储数据超过分配空间时vector会重新分配一块内存块
      1. vector申请一块更大内存块
      2. 原来数据拷贝到新内存块
      3. 销毁原内存块的对象
      4. 释放原来内存空间
      • 若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容器

ref

C++容器详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值