DSA学习笔记——向量

接口与实现

基础

在这里插入图片描述

向量ADT

在这里插入图片描述
在这里插入图片描述

操作实例

在这里插入图片描述

构造与析构函数

在这里插入图片描述
在这里插入图片描述

复制

在这里插入图片描述

可扩充向量

静态空间管理

在这里插入图片描述

动态空间管理

在这里插入图片描述

扩容算法实现

template<typename T>
void Vector<T>::expand() { //向量空间不足时扩容
	if (_size < _capacity) return; //尚未满员时,不必扩容
	_capacity = max(_capacity, DEFAULT_CAPACITY); //不低于最小容量
	T* oldElem = _elem; _elem = new T[_capacity <<= 1]; //容量加倍
	for (int i = 0; i < _size; i++) //复制原向量内容
		_elem[i] = oldElem[i] //T为基本类型,或已重载赋值操作符‘=’
	delete[]oldElem; //释放原空间
}

得益于向量的封装,尽管扩容之后数据区的物理地址有所改变,却不致出现野指针

为何必须采用“容量加倍”的策略呢?其它策略是否可行?

加倍式扩容

在这里插入图片描述
在这里插入图片描述
空间换时间!

分摊复杂度

在这里插入图片描述

无序向量

无序向量:向量的最基本元素

模板的基本概念

S

循迭访问

在这里插入图片描述

插入

在这里插入图片描述

区间删除

template<typename T>  //删除区间[lo,hi),0<=lo<=hi<=size
int Vector<T>::remove(Rank lo, Rank hi) { //O(n-hi)
	if (lo == hi)return 0; //出于效率考虑,单独处理退化情况
	while (hi < _size)_elem[lo++] = _elem[hi++]; //[hi,_size)顺次前移hi-lo位
	_size = lo; shrink(); //更新规模,若有必要则缩容
	return hi - lo; //返回被删除元素的数目
}

在这里插入图片描述

查找

  • 无序向量:T为可判等的基本类型,或已重载操作符“==”或“!=”
  • 有序向量:T为可比较的基本类型,或已重载操作符“<”或“>”
    在这里插入图片描述
template<typename T> //0 <= lo < hi <= _size
Rank Vector<T>::find(T const& e, Rank lo, Rank hi)const {
 //O(hi - lo) = O(n),在命中多个元素时可返回秩最大者
	while ((lo < hi--) && e != _elem[hi]);  //逆向查找
	return hi; //hi < lo意味着失败;否则hi即命中元素的秩
} //Excel::match(e,range,type)

输入敏感(input-sensitive):最好O(1),最差O(n)

有序向量

冒泡排序构思

归并排序构思

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Driver.SHAO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值