向量vector(2)

目录

 

1.3  构造与析构

1.3.1  默认构造方法

1.3.2  基于复制的构造方法

1.3.3  析构方法

1.4  动态空间管理

1.4.1  静态空间管理

1.4.2  可扩充向量

1.4.3  扩容

1.4.4  分摊分析

1.4.4.1  递增式扩容

1.4.4.2  加倍式扩容

1.4.4.3  平均分析与分摊分析

1.4.5  缩容

1.5  常规向量

1.5.1  直接引用元素

1.5.2  置乱器

1.5.2.1  置乱算法

1.5.2.2  区间置乱接口

1.5.3  判等器与比较器


1.3  构造与析构

向量结构中在内部维护一个元素类型为T的私有元素_elem[ ];容量为_capacity;有效元素的数量(即向量当前的实际规模)由_size指示。向量对象的构造与析构,将围绕这些私有变量和数据区的初始化与销毁展开。

1.3.1  默认构造方法

Vector ( int c = DEFAULT_CAPACITY, int s = 0, T v = 0 ) //容量为c、规模为s、所有元素初始为v
   { _elem = new T[_capacity = c]; for ( _size = 0; _size < s; _elem[_size++] = v ); } //s<=c

根据创建者指定的初始容量,向系统申请空间,以创建私有数组_elem[];若容量未明确,则使用默认值DEFAULT_CAPACITY。初始的向量尚未有任何元素,将_size初始化为0。

1.3.2  基于复制的构造方法

template <typename T> //元素类型
void Vector<T>::copyFrom ( T const* A, Rank lo, Rank hi ) { //以数组区间A[lo, hi)为蓝本复制向量
   _elem = new T[_capacity = 2 * ( hi - lo ) ]; _size = 0; //分配空间,规模清零
   while ( lo < hi ) //A[lo, hi)内的元素逐一
      _elem[_size++] = A[lo++]; //复制至_elem[0, hi - lo)
}

向量的另一个典型的创建方式就是以某个已有的向量或者数组为蓝本,进行(局部或者整体的)复制。copyFrom()首先根据复制区间的边界,换算成新向量的初始规模;再以双倍的容量,为内部数组_elem[ ]申请空间。最后通过一趟迭代,完成区间A[ lo, hi )内各元素的顺次复制。

但是由于向量内部含有动态分配的空间,默认的运算符“=”不足以支持向量之间的直接赋值。之后将以二维向量形式实现图邻接表,其主向量中的每一元素本身都是一维向量,通过默认赋值运算符,并不能复制向量内部的数据区,需要重载向量的赋值运算符。

template <typename T> Vector<T>::operator= ( Vector<T> const& V) { //重载
   if( _elem ) 
       delete []_elem;  //释放原有内容
   copyFrom( V._elem, 0, V.size() );   //整体复制
   return *this;  //返回当前对象的引用,以便链式赋值
}

1.3.3  析构方法

// 析构函数
   ~Vector() { delete [] _elem; } //释放内部空间

只需要释放用于存放元素的内部数组_elem[ ],将其占用的空间交还操作系统。_capacity和_size之类的内部变量无需做任何处理,它们将作为向量对象自身的一部分被系统回收,此后既无需也无法被引用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值