vector简介

cpp

vector

  • vector的底层数据结构是动态数组

    内存分配

  • 标准库的实现者使用了这样的内存分配策略:以最小的代价连续存储元素。为了使vector容器实现快速的内存分配,其实际分配的容量要比当前所需的空间多一些(预留空间),vector容器预留了这些额外的存储区用于存放添加的新元素,于是不必为每个新元素进行一次内存分配。当继续向容器中加入元素导致备用空间被用光(超过了容量 capacity),此时再加入元素时vector的内存管理机制便会扩充容量至两倍,如果两倍容量仍不足,就扩张至足够大的容量。容量扩张必须经历“重新配置、元素移动、释放原空间”这个浩大的工程。
  • 按照《STL源码剖析》中提供的vector源码,vector的内存配置原则为:
    • 如果vector原大小为0,则配置1,也即一个元素的大小。
    • 如果原大小不为0,则配置原大小的两倍。
  • 当然,vector的每种实现都可以自由地选择自己的内存分配策略,分配多少内存取决于其实现方式,不同的库采用不同的分配策略。

迭代器失效问题

  • vector管理的是连续的内存空间,在容器中插入(或删除)元素时,插入(或删除)点后面的所有元素都需要向后(或向前)移动一个位置,指向发生移动的元素的迭代器都失效。
  • 随着元素的插入,原来分配的连续内存空间已经不够且无法在原地拓展新的内存空间,整个容器会被copy到另外一块内存上,此时指向原来容器元素的所有迭代器通通失效。
  • 删除元素后,指向被删除元素的迭代器失效,这是显而易见的。

访问

  • 使用的vector下标必须小于vector.size();如果开始定义vector未指定大小,用数组下标输入不可以,因为vector中无相应元素,没相应内存空间

初始化大小

  • vector v(n,i)形式,v包含n 个值为 i 的元素
  • v(int n)将容器初始化为有 n 个元素
  • vector()无参构造函数,将容器初始化为空
  • 如果想知道vector是否为空,可以使用empty(),空返回true,否则返回false。
------ The Happy Ending ------