数据结构与算法(邓俊辉清华大学2013版书)学习笔记5-向量-可扩充向量 扩容:基于动态空间管理的扩容算法expand(),代码实现如下: memcpy的用法

扩容:基于动态空间管理的扩容算法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)


   这在空间上放弃了,但是在时间上却大大提高了。

平均复杂度或者期望复杂度:





猜你喜欢

转载自blog.csdn.net/qq_37791134/article/details/80324243
今日推荐