概述
vector是一种线性容器,因此它的所有成员都是按照严格的线性排序。Vector是通过动态数组来实现的,因此它的成员都是存放在连续的内存中。所以我们不仅可以通过迭代器去遍历成员,还可以通过成员的指针加偏移来访问。因此vector擅长
- 通过下标来索引单个成员
- 任意顺序迭代访问所有成员
- 从尾部追加或删除成员
类图
首先我们来看下vector的类图,为了便于分析,将只给出接下来将要讲解的接口。首先vector继承于_Vector_base。_Vector_base只做了部分基础接口的包装,如申请与释放内存。_Vector_base有个负责实现的成员_Vector_impl,它有三个重要的成员。分别是_M_start, _M_finish, _M_end_of_storage;记录着vector的内存起始,使用,结束。而_Vector_impl实现最终继承自new_allocator。这是vector的默认内存分配器。new_allocator的实现是对于new与delete的简单包装,提供以vector存储对象类型为单位的内存申请,释放。对象的构造与析构能力。
__alloc_traits是一个统一的标准内存分配器的接口。它向上提供统一的接口,以隐藏各种分配器的实现细节。学习过设计模式的同学,脑中肯定会不由自主的想到策略模式。
实现
我们首先来看下size与capacity接口,capacity是返回vector的容量大小。首先_M_start到_M_finish之间的是已使用的内存,也就是size返回值。_M_finish到_M_end_of_storage是容量剩余大小。vector可以理解为记录使用情况的动态数组。
size_type size() const _GLIBCXX_NOEXCEPT
{ return size_type(this->_M