vector实现

#include <iostream>
#include <memory>

using std::endl;
using std::cout;

template<typename T>
class Vector
{
public:
    using iterator = T *;//C++的写法
    //typedef T* iterator ;//C的写法
    Vector(int n);
    Vector()
    :_start (nullptr)
    ,_finish (nullptr)
    ,_end_of_storage (nullptr)
    {
    }
    ~Vector();

    void push_back(const T &value);
    void pop_back();
    void print();

    iterator begin()
    {
        return _start;
    }
    iterator end()
    {
        return _finish;
    }

    int size();
    int capacity();
private:
    void reallocate();//重新分配内存,动态扩容要用的
private:
    static std::allocator<T> _alloc;

    T *_start;                 //指向数组中的第一个元素
    T *_finish;                //指向最后一个元素之后的下一个位置
    T *_end_of_storage;        //指向分配的内存之后的位置
};

template<typename T>
std::allocator<T> Vector<T>::_alloc;


template<typename T>
Vector<T>::Vector(int n)
:_start (_alloc.allocate(n))
,_finish (_start)
,_end_of_storage (_start + n)
{
}

template<typename T>
Vector<T>::~Vector()
{
    //先销毁对象
    for(T *p = _start; p!=_finish; p++)
    {
        _alloc.destroy(p);
    }
    //再回收内存
    if(size())
    {
        _alloc.deallocate(_start,capacity());
        _start = nullptr;
        _finish =nullptr;
        _end_of_storage =nullptr;
    }
}

template<typename T>
void Vector<T>::push_back(const T &value)
{
    if(size() == capacity())//内存达到上限
    {
        reallocate();//重新分配内存
    }
    if(capacity()>0)
    {
        _alloc.construct(_finish, value);//构建对象
        ++_finish;
    }
}

template<typename T>
void Vector<T>::pop_back()
{
    if(size() == 0)
    {
        cout << "error" <<endl;
    }
    else
    {
        _alloc.destroy(--_finish);//销毁对象
    }
}

template<typename T>
int Vector<T>::size()
{
    return _finish - _start;
}

template<typename T>
int Vector<T>::capacity()
{
    return _end_of_storage - _start;
}

template<typename T>
void Vector<T>::reallocate()
{
    //初始未分配内存时,需要分配1内存
    int newCapacity = size() > 0 ? 2 * capacity() : 1;//以两倍空间扩容
    T *_pNewStart = _alloc.allocate(newCapacity);
    T *_pNewFinsh = _pNewStart;

    if(size() > 0)
    {
        //复制旧空间的元素到新空间
        //不用copy()的原因:如果对自定义类型的对象进行复制时,copy底层会访问_pNewStart中的对象
        //但此时_pNewStart上并没有构建对象
        //所以必须使用不需要在新空间上构建对象的uninitialized_copy()进行复制
        std::uninitialized_copy(_start, _finish, _pNewStart);
        /*for(T *p = _start; p != _finish; ++p, ++_pNewFinsh)
        {
            _alloc.construct(_pNewFinsh, *p);//构造对象
             _alloc.destroy(p);//销毁旧空间对象
        }*/

        _alloc.deallocate(_start,capacity());//回收内存
    }
    int t=size();
    _start = _pNewStart;
    _finish =_start + t;
    _end_of_storage =_start + newCapacity;
}

template <typename T>
void Vector<T>::print()
{
    for(T *p = _start; p != _finish; p++)
    {
        cout << *p <<" ";
    }
    cout << endl;
}

int main()
{
    Vector <int> vec;
    vec.push_back(2);
    cout << "size()=" << vec.size() << endl;
    cout << "capacity()=" << vec.capacity() << endl;
    vec.push_back(3);
    vec.print();
    vec.push_back(4);
    cout << "size()=" << vec.size() << endl;
    cout << "capacity()=" << vec.capacity() << endl;
    for(auto &elem : vec)
    {
        cout << elem << " ";
    }
    cout << "HELLO" <<endl;
    vec.pop_back();
    cout << "size()=" << vec.size() << endl;
    vec.print();
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值