2.2向量操作

这篇博客详细介绍了C++中向量的操作,包括元素访问、插入、区间删除、查找、单元素删除、唯一化算法以及遍历。文章提到了不同操作的时间复杂度,并提供了有序和无序向量的查找策略。对于唯一化算法,讨论了多种实现方式,包括效率优化和稳定性考虑。最后,展示了如何遍历向量并应用各种操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

向量模板:

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]);}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值