STL(3)---<vector>

     vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。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,
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值