从数组到向量
向量是数组的抽象和泛化,由一组元素按照线性次序封装而成
各元素[0,n)内的秩一一对应 //循秩访问
元素的类型不限于基本类型
操作,管理更加简化,统一和安全
可以更为便捷的参与复杂数据结构的定制与实现
向量ADT接口
size() 报告当前规模
get(r) 获取秩为r的元素
put(r,e) 用e替换秩为r元素的数值
insert(r,e) e作为秩为r元素插入,原后继元素依次后移
remove(r) 删除秩为r的元素,返回该元素中原存放的对象
uniquify() 去重
Vector模板类
typedef int Rank;
#define DEFAULT_CAPACITY 3
template <typename T> class Vector
{
private:Rank _size; int _capacity; T* _elem;
pritected:
//内部函数
public:
//构造
//析构
//只读接口
//可写接口
//遍历接口
}
Vector(int c=DEFAULT_CAPACITY)
{
_elem = new T[_capacity = c];
size = 0;
}
Vector(T const *A,Rank lo,Rank hi)
{
copyFrom(A,lo,hi); //数组区间复制
}
Vector(Vector<T>const &V,Rank lo,Rank hi)
{
copyFrom(V._elem,lo,hi); //向量区间复制
}
template<typename T> //T为基本类型,或已经重载‘=’
void Vector<T>::copyFrom(T* const A,Rank lo,Rank hi)
{
_elem = new T[_capacity = 2*(hi-lo)];//分配空间
_size = 0;//规模清0
while(lo<hi)
_elem[_size++]=A[lo++];//复制到_elem[0,hi-lo]
}
静态空间管理的不足
上溢:_elem[]不足存放所以元素
下溢 :_size/_capacity<<0.5