STL源码剖析(八)序列式容器之vector
文章目录
一、容器简介
STL的容器分为序列式容器和关联式容器,所谓序列式容器是指其中的元素是可序的。所谓关联式容器,指的是每个元素都有key和value
STL有以下的序列式容器
vector
list
slist //非标准
deque
stack
queue
priority_queue
有以下关联式容器
set
map
multiset
multimap
hash_set //非标准
hash_map //非标准
hash_multiset //非标准
hash_multimap //非标准
本文将讲解vector容器
二、vector的数据结构
vecotr的定义如下
template <class T, class Alloc = alloc>
class vector {
...
protected:
typedef simple_alloc<value_type, Alloc> data_allocator; //空间配置器
iterator start;
iterator finish;
iterator end_of_storage;
...
};
上述可以看到,vector定义了一个属于自己的空间配置器data_allocator
,该空间配置器提供了静态的内存分配和释放方法,关于空间配置器请阅读STL源码剖析(二)普通的空间配置器,STL源码剖析(三)更加精致的空间配置器这里不详细说明
下面重点看这三个成员
iterator start;
iterator finish;
iterator end_of_storage;
这是三个迭代器,是维护vector容器的重要成员
vector的内部会分配一大块内存,然后维护一个数组,其中start
指向内存头部,finish
指向数组最后一个元素的下一个位置,end_of_storage
指向内存的尾部,如下图所示
数组是不可以动态生长的,vector内部虽然是数组,但是它是可以动态生长的,因为vector可以完成自动扩容
vector的扩容的方法是:申请一块更大的内存,将所有元素拷贝过去,将原本的内存析构释放。
因此vector的扩容是一个代价非常大的操作,所以每次扩容都会以两倍增长,由此来减少扩容次数