文章目录
(a)向量vector接口与实现
数据类型与数据结构的区别
(b)动态管理向量空间
1,向量的空间是静态的
会发生上溢与下溢
2,(动态空间管理)当即将发生上溢时,可以模仿蝉褪去原来的壳,扩容
实现代码
template <typename T>
void vector<T>::expand(){
if(_size <_capacity)return;
_capacity = max(_capacity,DEFAULT_CAPACITY)//不低于最小容量
T* oldElem = _elem;_elem = new T[_capacity <<=1];//保存旧的,新的创建空间两倍(左移1扩大两倍)
for(int i=0;i<_size;i++)
_elem[i] = oldElem[i]//复制元向量内容
delete[] oldElem;//释放原空间
}
得益于向量封装,访问向量空间,都是通过elem来标识起点,所以不存在复制后指针找不到的问题
3,选用何种扩容策略
但容量加倍是否合理呢?
T* oldElem = _elem;_elem = new T[_capacity +=INCREMENT];/ /追加固定大小的容量
实际每次固定尺寸扩容,时间成本大大增加(每隔I都要扩容)
每次扩容两倍,指数级扩容,时间大大减少,如下图
在空间上一定取舍,时间上获得巨大收益
* 平均分析和分摊分析(复杂度分析方法)
平均分析将各种可能的操作概率加权平均,割裂了操作间的关联独立存在
而分摊分析则对数据结构连续地多次操作,将所需总体成本分摊至单次操作
(c)无序向量
之前学过的,定义向量数据结构的类型的方法
统一得到模板式创建数据类型结构,方便之后组合融合使用
template <typename T> vector{……}
vector <int> myvector{……}【vector of intgter】
float
char
……
vector<BinTree> forest【这个时取的名字】
无序向量
1,循秩访问元素
2,插入元素
关键在于自后向前后移操作
3,区间删除
将介于某个区间的所有元素删除,关键在于自前向后前移操作
4,单元素删除
基于3区间删除,进行单元素删除,不反过来基于单元素进行区间删除,主要是效率太低
5,查找元素操作
调用如下,print(hi)即可
5,无序向量唯一化
普通法:每次检查前i个和第i+1个是否重复(向前比较,向后提取),加上i遍历–O(n^2)
6,遍历
有序向量