STL源码解析 Vector

vector

定义

单向开口的连续线性空间

动态数组

迭代器:

普通指针

数据结构

vector的数据结构 是 线性连续空间
三个迭代器
start
finish
end_of_storage

构造和内存管理

构造时指定空间大小

构造时指定空间大小,则空间的finish和end_of_storage 是相同的,即空间大小是指定的大小,不多分配空间。

空间配置器alloc

vector默认是alloc 为默认的空间配置器
且定义了data_alocator

uninitialized_fill_n()与fill_n()的区别

  • fill_n() 指的是 对每个元素填充value
  • uninitialized_fill_n() 是对未初始化空间(空间还没对象)填充,
    uninitialized_fill_n()先判断value的类型,类型若是POD,则调用fill_n()高阶函数填充;若不是POD类型,则遍历构造

POD

C++中的POD型别

push_bask()元素

  • finish < end_of_storage
    备用空间插入元素

  • finish == end_of_storage
    若原空间大小为0,则分配1;若原空间大小不为0,则分配2倍
    拷贝元素
    析构并释放原空间 destory() 和 deallocate()
    将原来迭代器指向新的位置

erase() 清楚元素

将erase()的元素后面往前拷贝,释放erase的元素个数大小

insert()

  • 备用空间 > 新插元素个数

    • 新增元素个数 < 插入点后的元素个数
      copy插入点到finish的元素
    • 新增元素个数 > 插入点后的元素个数
      调整finish的位置
      copy插入点到 旧finish 的元素 ,到 新 finish的位置
  • 备用空间 小于 新增元素个数

    分配一块更大的空间,
    【分配多大?】 一般是2倍,若2倍不够用 ,就分配【原个数+新增个数】
    拷贝过去,析构和释放原空间

posted @ 2021-07-31 23:34  appearAndLeave  阅读(67)  评论(0)    收藏  举报