vector和array的使用非常相似,区别是vector是动态空间,
随着新元素的介入,靠内部机制就可以自动扩充空间以容纳新元素
vector的迭代器:
由于vector维护的是一个线性空间,所以可以用普通指针作为迭代器。指针也具备随即存取能力,因此vector提供随机访问迭代器。
vector的数据结构:
线性连续空间。
用start和finish指向目前已经被使用的范围中的头尾,并且以迭代器end_of_storage指向整块连续空间(包括备用空间)的末尾。
vector实际分配的空间一定大于等于需要的空间,以备将来的扩充。capacity的概念。
vector的构造与管理:
vector缺省使用alloc作为空间配置器
并且定义了一个data_allocator为了方便以元素大小为单位配置空间。
vector(size_type n,const T& value) { fill_initialize(n,value); } void fill_initialize(size_type n, const T& value) { start = allocate_and_fill(n, value); finish = start + n; end_of_storage = finish; } iterator allocate_and_fill(size_type n, const T& x) { iterator result = data_allocatoe::allocate(n); uninitialized_fill_n(result, n, x); return result; }
当我们用push_back插入元素时,先检查是否还有备用空间,如果有则直接在备用空间上构造新元素
如果没有,就扩充空间(重新配置,移动数据,释放原空间):
1.配置大小为原来的两倍;
2.把原内容拷贝到新的空间中
3.构造新元素并插入
4.析构并释放原vector
5.调整迭代器指向新的vector
所谓动态增加大小并不是在原vector后面增加新的空间,而是以原来的两倍大小开辟新的空间,然后把原内容拷贝过来,然后再构造新的元素,并且释放原空间。
因此任何对于vector的操作,一旦引起空间的重新分配,指向原vector的所有迭代器都会失效。
另外,vector的容量只会自动扩大,不会自动缩小。