Vector 简单模拟实现

#define _CRT_SECURE_NO_WARNINGS

#pragma once
#include <iostream>
#include <assert.h>
using namespace std;

struct _TrueType     // 实现类型萃取
{
    bool Get()
    {
        return true;
    }
};
struct _FalseType
{
    bool Get()
    {
        return false;
    }
};

template <class T>
struct TypeTraits
{
    typedef _FalseType __IsPODType;
};

template <>          
struct TypeTraits<int>
{
    typedef _TrueType __IsPODType;
};
template<>
struct TypeTraits<char>
{
    typedef _TrueType __IsPODType;

};

template <class T>      // 简单迭代器
class VectorIterator
{
public:
    VectorIterator(T* ptr = NULL) :
         _pPtr(ptr)
    {}
    VectorIterator(const VectorIterator& d) :
        _pPtr(d._pPtr)
    {}
    T& operator*()
    {
        return *_pPtr;
    }
    VectorIterator& operator++()
    {
        ++_pPtr;
        return *this;
    }
    VectorIterator operator++(int)
    { 
        VectorIterator temp(*this);
        ++_pPtr;
        return temp;
    }
    VectorIterator& operator--()
    {
        --_pPtr;
        return *this;
    }
    VectorIterator operator--(int)
    {
        VectorIterator temp(*this);
        --_pPtr;
        return temp;
    }
    bool operator==(const VectorIterator& v)
    {
        return v._pPtr == _pPtr;
    }
    bool operator!=(const VectorIterator& v)
    {
        return v._pPtr != _pPtr;
    }
private:
    T* _pPtr;
};


template<class T>
class Vector
{
public:
    typedef VectorIterator<T> Iterator;
    Vector()
        :_start(new T[3])
        , _finish(_start)
        , _endOfStorage(_start + 3)
    {}
    Vector(const T* array, size_t size)
        :_start(new T[size])
        , _finish(_start + size)
        , _endOfStorage(_start + size)
    {
        if (TypeTraits<T>::__IsPODType().Get())     //判断是否为内置类型  如果是 使用memcpy效率高 不是 使用for循环
            memcpy(_start, array, size*sizeof(T));
        else
        {
            for (size_t i = 0; i < size; ++i)
                _start[i] = array[i];
        }

    }
    Vector(const Vector& v)
        :_start(new T[v.Capacity()])
        , _finish(_start + v.Size())
        , _endOfStorage(_start + v.Capacity())
    {
        if (TypeTraits<T>::__IsPODType().Get())
            memcpy(_start, v._start, v.Size()*sizeof(T));
        else
        for (size_t i = 0; i < size; ++i)
            _start[i] = v._start[i];
    }
    Vector& operator=(const Vector& s)
    {
        if (this != &s)
        {
            if (_start)
                delete[] _start;
            _start = new T[s.Capacity()];
            _finish = _start + s.Size();
            _endOfStorage = _start + s.Capacity();
            if (TypeTraits<T>::__IsPODType().Get())
                memcpy(_start, s._start, s.Size()*sizeof(T));
            else
            for (size_t i = 0; i < s.Size(); ++i)
                _start[i] = s._start[i];
        }

    }
    ~Vector()
    {
        if (_start)
        {
            delete[] _start;
            _start = NULL;
            _finish = NULL;
            _endOfStorage = NULL;
        }

    }
    Iterator Begin()
    {
        return _start;
    }
    Iterator End()
    {
        return _finish;
    }
    ///Modify 
    void PushBack(const T& data)
    {
        _CheckCapacity();
        *_finish = data;
        ++_finish;

    }
    void PopBack()
    {
        if (!Empty())
        {
            --_finish;
        }

    }
    void Insert(size_t pos, const T& data)
    {
        _CheckCapacity();
        assert(pos >= 0 && pos < Size());
        if (TypeTraits<T>::__IsPODType().Get())
            memmove(_start + pos, _start + pos - 1, (Size() - pos + 1)*sizeof(T));
        else
        for (size_t i = Size(); i > pos; --i)
        {
            _start[i] = _start[i - 1];
        }
        _start[pos] = data;
        _finish++;
    }
    void Erase(size_t pos)
    {
        assert(pos >= 0 && pos < Size());
        if (TypeTraits<T>::__IsPODType().Get())
            memmove(_start + pos - 1, _start + pos , (Size() - pos)*sizeof(T));
        else
        for (size_t i = pos; i < Size() - 1; ++i)
            _start[i] = _start[i + 1];
        _finish--;
    }

    //capacity 
    size_t Size()const
    {

        return  _finish - _start;
    }
    size_t Capacity()const
    {
        return _endOfStorage - _start;
    }
    bool Empty()const
    {
        return _start == _finish;
    }
    void Resize(size_t newSize, const T& data = T())
    {
        if (newSize < Size())
        {
            _finish = _start + newSize;
        }
        else if (newSize > Size() && newSize < Capacity())
        {
            while (_finish < _start + newSize)
                *_finish++ = data;
        }
        else
        {
            T* temp = new T[newSize];
            if (TypeTraits<T>::__IsPODType().Get())
            {
                memcpy(temp, _start, Size()*sizeof(T));
            }
            else
            {
                for (size_t i = 0; i < Size(); ++i)
                    temp[i] = _start[i];
            }

            if (TypeTraits<T>::__IsPODType().Get())
            {
                memcpy(temp + Size(), _start, newSize*sizeof(T));
            }
            else
            {
                for (size_t i = Size(); i < newSize; ++i)
                    temp[i] = data;
            }
            delete[] _start;
            _start = temp;
            _finish = _start + newSize;
            _endOfStorage = _finish;
        }
    }
    //Acess/// 
    T& operator[](size_t index)
    {
        assert(_start);
        return _start[index];
    }
    const T& operator[](size_t index)const
    {
        assert(_start);
        return _start[index];
    }
    T& Front()
    {
        assert(_start);
        return *_start;
    }
    const T& Front()const
    {
        assert(_start);
        return *_start;
    }
    T& Back()
    {
        assert(_start);
        return _start[Size() - 1];
    }
    const T& Back()const
    {
        assert(_start);
        return _start[Size() - 1];
    }
    void Clear()
    {
        if (_start)
            _finish = _start;
    }
    friend ostream& operator<<(ostream& _cout, const  Vector<T>& d)
    {
        for (size_t i = 0; i < d.Size(); ++i)
        {
            _cout << d._start[i] << " ";
        }
        return _cout;
    }

private:
    void _CheckCapacity()
    {
        if (_finish == _endOfStorage)
        {
            T* temp = new T[Capacity() * 2 + 3];
            for (size_t i = 0; i < Size(); ++i)
                temp[i] = _start[i];
            _finish = temp + Size();
            _endOfStorage = temp + Capacity() * 2 + 3;
            delete[] _start;
            _start = temp;
        }
    }
private:
    T* _start;
    T* _finish;
    T* _endOfStorage;
};

void Test()
{

    Vector<int> v;
    v.PushBack(1);
    v.PushBack(2);
    v.PushBack(3);
    v.PushBack(4);
    v.PushBack(5);
    v.PushBack(6);
    cout << v << endl;
    cout << *(v.Begin())<< endl;
    cout << *(--v.End()) << endl;
}

void TestVector()
{
    int arr[5] = { 1, 2, 3, 4, 5 };

    Vector<int> v(arr, sizeof(arr) / sizeof(arr[0]));
    cout << v << endl;
    cout << v.Size() << endl;
    v.PushBack(6);
    v.PushBack(7);
    cout << v.Size() << endl;
    cout << v.Capacity() << endl;
    v.PopBack();
    v.PopBack();
    v.PopBack();
    cout << v << endl;
    cout << v.Size() << endl;
    cout << v.Capacity() << endl;
    v.Resize(10);
    cout << v.Size() << endl;
    cout << v.Capacity() << endl;
    v[1] = 0;

    cout << v.Back() << endl;
    cout << v.Front() << endl;
    cout << v << endl;
    v.Insert(9, 9);
    cout << v << endl;
    v.Erase(10);
    cout << v << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值