vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了;而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。
vector的扩充机制:按照容器现在容量的一倍进行增长。vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。这时原有指向旧内存空间的迭代器已经失效,所以当操作容器时,迭代器要及时更新。
vector的扩充机制:按照容器现在容量的一倍进行增长。vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。这时原有指向旧内存空间的迭代器已经失效,所以当操作容器时,迭代器要及时更新。
vector数据结构,采用的是连续的线性空间,属于线性存储。他采用3个迭代器_First、_Last、_End来指向分配来的线性空间的不同范围
下面是我提取出的一些源码和自己的理解
#include "allocator.h"
//vector容器是一个模板类,可以存放任何类型的对象(但必须是同一类对象)vector对象可以在运行时高效地添加元素,并且vector中元素是连续存储的。
//这里我所提出的源码中没有const迭代器和反向迭代器,而且后边对于vector的一个特化的范例bool型也没有列出
namespace w
{ // TEMPLATE CLASS vector
template<class _Ty, class _A = allocator<_Ty> >
class vector {
public:
typedef vector<_Ty,_A> _Myt;//只在类中有效的类型重定义
public:
typedef _A allocator_Type;
typedef _A::difference_type difference_Type;
typedef _A::pointer _Tptr;
// typedef _A::const _Ctptr;
typedef _A::reference reference;
// typedef _A::const_reference const_reference;
typedef _A::value_type value_type;
typedef _Tptr iterator;//对于向量无需对指针进行包装组成迭代器,指针本省作为迭代器
// typedef _Ctptr const_iterator;
explicit vector(const _A& _Al = _A())//构造函数产生默认的vector对象但是不能隐式类型转换
: allocator(_Al), _First(0), _Last(0), _End(0) {}
explicit vector(size_t _N, const _Ty& _V = _Ty(),//产生_N个值为_V的对象
const _A& _Al = _A())
: allocator(_Al)
{_First = allocator.allocate(_N, (void *)0);
_Ufill(_First, _N, _V);
_Last = _First + _N;
_End = _Last; }
vector(const _Myt& _X)//拷贝构造函数
: allocator(_X.allocator)
{_First = allocator.allocate(_X.size(), (void *)0);
_Last = _Ucopy(_X.begin(), _X.end(), _First);
_End = _Last; }
typedef iterator _It;
vector(_It _F, _It _L, const _A& _Al = _A())//用一段数据来初始化
: allocator(_Al), _First(0), _Last(0), _End(0)
{insert(begin(), _F, _L); }
~vector()
{
_Destroy(_First, _Last);
allocator.deallocate(_First, _End - _First);
_First = 0, _Last = 0, _End = 0;
}
_Myt& operator=(const _Myt& _x)//赋值函数
{
if(&_x != this)
{
if(_x.size() <= size())
{
iterator _s=copy(_x.begin(),_x.end(),_First);
_Destroy(_s,_Last);
_Last =_First + _x.size();
}
else if(_x.size() <= _x.capacity())
{
iterator _s = _x.begin()+size();
copy(_x.begin(), _s,