扩容:基于动态空间管理的扩容算法expand(),代码实现如下:
template <typename T> void Vector<T>::expand(){
if (_size < _capacity)
return;//尚未满员时,不必扩容
if(_capacity < DEFAULT_CAPACITY)
_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;
}
memcpy的用法
void *memcpy(void *dest, const void *src, size_t count) { char *d; const char *s; if (dest > (src+size)) || (dest < src)) { d = dest; s = src; while (count--) *d++ = *s++; } else /* overlap */ { d = (char *)(dest + count - 1); /* offset of pointer is from 0 */ s = (char *)(src + count -1); while (count --) *d-- = *s--; } return dest; }总结
1. 不要破坏传进来的形参,定义新的临时变量来操作
2.考虑指针的类型,不同类型的指针不能直接++赋值
3.overlap情况下需要从高地址处向前copy
具体可见:https://blog.csdn.net/goodwillyang/article/details/45559925,写的很好很全面。
以上介绍了为啥不能用mencpy代替向量内部数组动态扩容算法expand(),新数组的地址由操作系统分配,与原数据区没有直接的关系。在这种情况下,若直接引用数组,往往会导致共同指向元驻足的其他指针失效,成为野指针,而经封装为向量之后,即可继续准确地引用各个元素,从而有效的避免野指针的风险。
扩容思路:对于加倍扩容和固定扩容
算术级数:0(n的平方) (诀窍:总和和末项成平方关系。。。。)
几何级数:0(n)
这在空间上放弃了,但是在时间上却大大提高了。
平均复杂度或者期望复杂度: