迭代器
vector维护的是一个连续线性空间。普通指针可以满足条件作为vector的迭代器。
template <typename T, typename Alloc=alloc>
class vector
{
public:
using value_type = T;
using iterator = value_type*;
};
vector::iterator //int*
vector::iterator //char*
数据存储
迭代器start和finish分别表示vector的起始元素的地址和终止元素的地址。
end_of_storage 表示vector开辟的空间的终止位置。
start - finish 表示的就是我们在连续空间中已经使用的范围。
start - end_of_storage 表示我们的总的空间大小。
finish - end_of_storage 表示我们还未使用过的空间总大小。
数据填充
无需扩容的情况:并且到finish为止,现有的元素的数量(elem_after)大于等于插入的元素数量 n
首先把绿色区域往后拷贝
把蓝色区域往后拷贝
最后在position位置拷贝进新的元素
无需扩容的情况:但是到finish为止,现有的元素的数量(elem_after)小于插入的元素数量 n
直接把n 大于elem_after之后的部分拷贝到 finish之后
把position到finish之间原有的元素全部拷贝到finish之后,为图中蓝色区域,
最后把剩余的n的一部分填充至 position到finish之间,使用 fill填充
需要扩容的情况:剩余备用的元素无法存放进全部的 n 个元素,因此需要重新分配空间,并且销毁原空间。获得容纳全部元素至少需要多少空间,重新分配空间,首地址发生改变。
首先把start到position的全部元素拷贝到新的空间
新入的n个元素翻入finish之后
最后再把原来 position到 finish之间的元素全部拷贝到 finish之后
最后调整新的 start finish end_storage