模拟实现vector容器

来源:互联网 发布:情感分类 贝叶斯算法 编辑:程序博客网 时间:2024/05/16 17:04

vector:

模型结构:

这里写图片描述

以上表示3个指针,分别指向不同的位置;
Vector的缺陷:前期增长代价太大,以1/2的模式开增,eg:1,2,3,4,6,6,9,9,9。。。
改进方法:使用reverse(x)直接开辟一个较大空间即可;

Vector中两种增容方式:
① resize(x,y) //会改变size()大小,会让容量变大或者不变
分三种情况:
a.X > capacity :增容会使capacity变大
b.X < size() :增容会改变size()大小
c.size() <= X <= capacity :增容不会改变size(),capacity的大小
② reserve(x) //会改变容量大小,不会改变size()大小
(x表示增容的大小,y表示增容后的内容用什么来初始化)

//#include"TypeTraits_re.h"文件//特化必须出现在原生类型以后struct _FalseType//非内置类型{};struct _TrueType//是内置类型{};//原生类型template <class T>struct TypeTraits{    typedef _TrueType _IsPodType;};//全特化template<>struct TypeTraits<int>{    typedef _TrueType _IsPodType;};template<>struct TypeTraits<char>{    typedef _TrueType _IsPodType;};template <class T>struct TypeTraits<T*>{    typedef _TrueType _IsPodType;};//模板函数//内置类型的复制template <class T>void _Copy(T* dst, T* src, size_t n, _TrueType){    memcpy(dst,src,n*sizeof(T));}//自定义类型的复制template <class T>void _Copy(T* dst, T* src, size_t n, _FalseType){    for(size_t i = 0; i < n; i++)    {        dst[i] = src[i];    }}template <class T>void Copy(T* dst, T* src, size_t n){    _Copy(dst,src,n,TypeTraits<T>::_IsPodType());//里面类型的小括号不能省略哦}#include"TypeTraits_re.h"#include<string.h>template <class T>class Vector{public:    typedef T* Iterator;    typedef const T* ConstIterator;protected:    Iterator _start;    Iterator _finish;    Iterator _endOfStorage;public:    //指针初始化可以赋为零,赋零和赋NULL是一样的    Vector()        :_start(NULL),_finish(NULL),_endOfStorage(NULL)    {}    //拷贝构造函数    Vector(Vector<T>& v)        :_start(NULL),_finish(NULL),_endOfStorage(NULL)    {        Expand(v.GetSize());        /*Reserve(v.GetSize());*/    /*  Resize(v.GetSize());*/        Copy(_start,v.Begin(),v.GetSize());        _finish = _endOfStorage = _start + v.GetSize();    }    ~Vector()//析构函数    {        if(_start)        {            delete[] _start;        }        _start = _finish = _endOfStorage;    }    size_t GetSize()//获取实际大小值    {        return _finish - _start;    }    size_t GetCapacity()//获取实际容量值    {        return _endOfStorage - _start;    }    void Resize(const size_t& n,const T& val = T())    {        //增容有三种情况        //1.大于总容量;2.小于实际值;3.大于实际值小于总容量        if(n > GetCapacity())        {            Expand(n);            Iterator pos = _finish;            while(pos != _start + n)            {                *pos = val;                ++pos;            }        }        else if(n < GetSize())        {            Iterator pos = _start + n;            while(pos != _finish)            {                pos->~T();                ++pos;            }            _finish = _start + n;        }        else        {            Iterator pos = _finish;            Iterator end = _start + n;            while(pos != end)            {                *pos = val;                pos++;            }        }    }    void Reserve(const size_t& n)    {        Expand(n);    }    void Expand(size_t capacity)    {        if(capacity < GetCapacity())            return;        size_t n = GetSize();        T* tmp = new T[capacity];        Copy(tmp,_start,GetSize());        _start = tmp;        _finish = _start + n;        _endOfStorage = _start + capacity;    }    void CheckCapacity()    {        if(_finish >= _endOfStorage)        {            //增容            size_t n = GetSize();            size_t capacity = GetCapacity();            capacity = capacity + capacity/2;            if(capacity < n + 1)            {                capacity = n + 1;            }            //扩容            //分为两种情况,一种是内置类型,一种是自定义类型            Expand(capacity);        }    }    void pushBack(const T& data)//后插    {        //判断是否需要扩容        CheckCapacity();        *_finish = data;        ++_finish;    }    void show()    {        size_t n = GetSize();        for(size_t i = 0; i < n; i++)        {            cout<<_start[i]<<" ";        }        cout<<endl;    }    //迭代器-----类型指针    Iterator Begin()    {        return _start;    }    Iterator End()    {        return _finish;    }    ConstIterator Begin() const    {        return _start;    }    ConstIterator End() const    {        return _finish;    }    T& operator[](const size_t& n)    {        assert(n < GetSize());        return _start[n];    }    const T& operator[](const size_t& n) const    {        assert(n < GetSize());        return _start[n];    }};template <class T>void printVector(Vector<T>& v){    Vector<T>::Iterator it = v.Begin();    while(it != v.End())    {        cout<<*it<<" ";        ++it;    }    cout<<endl;    cout<<"capacity: "<<v.GetCapacity()<<endl;    cout<<"size: "<<v.GetSize()<<endl;    /*for(size_t i = 0; i < v.GetSize(); i++)    {        cout<<v[i]<<" ";    }    cout<<endl;*/}