c++:vector

时间:2025-01-30 20:09:52

因为我们不实现缩容,所以这里我们需要知道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来实现数据拷贝,因为他是一个一个字节去拷贝的,实现的是浅拷贝。

对于需要深拷贝的我们应该实现深拷贝

这里对于内置类型则与之前没区别,但是对于自定义类型就可以调用赋值重载来实现深拷贝了