文章目录
(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【这个时取的名字】
无序向量