目录
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之类的内部变量无需做任何处理,它们将作为向量对象自身的一部分被系统回收,此后既无需也