数据结构之------vector

自己对vector的理解:

        首先vector的底层还是数组,但是他又不同于数组,数组是静态的,在定义的时候就确定了数组的长度。但是vector是动态的,他的长度是可以增加的。增加的规模是二倍增加。其次还需要注意的是真正实现的二倍增加并不是在原数组的基础上动态增加二倍,而是在系统空间中开辟一个原数组长度的二倍,然后再将原数组的值赋给新开辟的数组,然后将原数组删除的过程。

typedef int Rank;
#define DEFAULT_CAPACITY 3
template <template T> class Vector{
protected:
    Rank _size; int _capacity; T* _elem;
    ...
public:
    Vector(int c = DEFAULT_CAPACITY,int s = 0,T v = 0)
    {
        _elem = new T[_capacity = c];
        for(_size = 0;_size < s; _elem[_size++] = v);
    }
    Vector(T const* A,Rank n){copyFrom(A,0,n);} //数组整体赋值
    Vector(T const* A,Rank lo,Rank hi){copyFrom(A,lo,hi);} //区间赋值
    Vector(Vector<T> const& V){copyFrom(v._elem,0,V._size);} //向量整体赋值
    Vector(Vector<T> const& V,Rank lo,Rank hi){copyFrom(V._elem,lo,hi);}
    ~Vector(){delete []_elem;}
}

 这里面主要写了Vector的几种构造方法。不同的构造方法基于不同的方式。

template<typename T>
void Vector<T>::copyFrom(T const* A,Rank lo,Rank hi){
    _elem = new T[_capacity = 2*(hi-lo)];
    _size = 0;;
    while(lo < hi)
        _elem[_size++] = A[lo++];
}

copyFrom()方法首先是开辟一个需要赋值的原数组的大小的二倍空间,换算出新向量的规模。最后通过一次迭代,完成区间A[lo,hi)内各元素的依次复制。

  需要强调的是,由于向量内部含有动态分配的空间,默认的运算符“=”不足以支持向量之间的直接赋值。所以需要进行运算符重载。

template<typename T> Vector<T>& Vector<T>::operator=(Vector<T> const& V)
{
    if(_elem) delete []_elem;
    copyFrom(V._elem,0,V.size());
    return *this;
}

Vector的扩容与缩容都很有意思,后面再码。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值