向量模板:
Template<typename T> Vector{...}
可以说定义了一系列向量:
Vector<int/float/char> myVector;
1、元素访问
通过V.get®、V.put(r,e)可以读写向量,但不如数组元素A[i]的访问方式的便捷性。
可以通过如下方法实现:
template<typename T>
T&Vector<T>::operator[](Rank r) const{return _elem r;}
既可以访问,也可以赋值
2、插入
template <typename T>
Rank Vector<T>::insert(Rank T,T const & e){
expand();//若有必要,扩容
for(int i=_size;i>r;i--)//自后向前
_elem[i]=_elem[i-1];
_elem[r]=e;_size++;
return r;
}
3、区间删除
template <typename T>
int Vector<T>::remove(Rank lo,Rank hi){
if(lo==hi)return 0;
while(hi<_size)_elem[lo++]==_elem[hi++];//顺次往前移位
_size=lo;shrink();//更新规模,如有必要,则缩容
return hi-lo;
}
4、查找
无序向量:T为可攀登的基本类型,或已重载操作符==、!=
有序向量:T为可比较的基本类型,或已重载操作符“>”“<”
template <typename T>
Rank Vector<T>::find(T const & e,Rank lo,Rank hi){
while((lo<hi--)&&(e!=elem[hi]));
return hi;
}
与输入的参数紧密相关,最好o(1),最差o(n)
5、单元素删除
template <typename T>
T Vector<T>::remove(Rank r){
T e=_elem[r];//备份被删除元素
remove(r,r+1);
return e;//返回被删除元素
}
6、唯一化算法
template <typename T>
int Vector<T>::deduplicate(){
int oldSize=_size;
Rank i =1;
while(i<_size)
(find(_elem[i],0,i)<0)?i++:remove(i);
return oldSize-_size;
}
总体消耗时间o(n2)
可进一步优化:
1、仿照uniquify()高效版的思路,元素移动的次数将至o(n),但比较次数不变,稳定性破坏
2、先对需删除的重复元素做标记,然后再统一删除,稳定性保持,但查找长度更长,导致更多对比操作
3、v.sort().unquify():建明实现最优的o(nlogn)
下列代码为有序化向量的唯一化操作:
template <typename T>
int Vector<T>::unquify(Rank lo, Rank hi){
Rand i=lo,j=lo+1;
while(++j<hi)//循环条件
{if(_elem[i]!=_elem[j++])_elem[++i]_elem[j];}//不相等时,将次序调换
_size=++i;shrink();//缩减不必要空间
return j-i;
}
7、遍历
遍历向量,同意对各元素分别实施visit操作。
利用函数指针机制,只读或局部性修改
template <typename T>
void Vector<T>::traverse(void (*visit)(T&))//函数指针
{for(int i=0;i<_size;i++)visit(_elem[i]);}
利用函数对象机制,可全局性修改
template <typename T>
void Vector<T>::traverse(void visit)//函数对象
{for(int i=0;i<_size;i++)visit(_elem[i]);}