因为我们不实现缩容,所以这里我们需要知道capacity是多少,且后面的实现还需要知道有效数据个数,所以我们先把这两个功能实现一下
1.capacity
2.size
接下来实现reserve
首先判断是否满足指定的容量值大于当前容量值,若大于则开始进行扩容。
扩容:
1.根据val创建新的空间
2.拷贝对应值
3.释放旧空间
4.更新数组内置三个迭代器的值
但是这里会有个大问题:m_finish的指向会有问题
因为此时调用size,用的是旧的m_finish和新的m_start相减,m_start已经是指向新开辟的空间的迭代器,与m_finish八竿子打不着。我们有两种解决方式
方法一:换顺序
调换赋值顺序,我们把m_finish的赋值和m_start的赋值顺序换一下,这样就可以用旧的m_start和旧的m_finish相减,从而得到正确的size大小
方法二:变量存值
在扩容前,先用一个oldsize存储旧的size,后面赋值就不再调用size,而是直接使用oldsize。
方法二要比方法一更好,因为你无法保证其他程序员会不会去动你的代码顺序。
方法二实现
补充:由于实现模板需要考虑到各种数据类型,所以我们的reserve其实不能使用memcpy来实现数据拷贝,因为他是一个一个字节去拷贝的,实现的是浅拷贝。
对于需要深拷贝的我们应该实现深拷贝
这里对于内置类型则与之前没区别,但是对于自定义类型就可以调用赋值重载来实现深拷贝了