说起数组我们都不陌生,但在C++中,除了数组还多了一个“新朋友”那就是vector。其实vector本质上与array的数据安排以及操作方式也其为相似。它俩唯一的差别就是空间灵活性。
无论在C语言还是C++中,array的空间一旦申请完成就不能进行更改,如果需要更大空间来存储数据,便得重新申请一个新的数组并将原来的数值拷贝过去,然后再将原来数组释放,而这一切都需要用户自己完成。而vector不同的是,它的空间分配更加灵活,当他内存不够存放时,它内部机制会自行进行容量扩充,这对于程序员来说使用起来更加灵活和方便。
vector结构图:
下面我们一起来看看STL中是如何示现vector的。
template <class T, class Alloc = alloc> //定义为模版类,配置空间默认使用alloc。
class vector
{
public: //将类型重命名使用起来更加方便、易懂
typedef T value_type;
typedef value_type* pointer;
typedef value_type& reference;
typedef value_type* iterator;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
protected:
//填充并初始化
void fill_initialize(size_type n, const T &value)
{
start = allocate_and_fill(n,value); //构造并填充
finish = start+n; //调整finish指向最后一个元素的下一个空间
end_of_storage = finish; //让end_of_storage指向目前可以使用空间的尾部
}
//构造空间并且填满初始值
iterator allocate_and_fill(size_type n, const T &x)
{
iterator result = data_allocator::allocate(n); //配置n个空间,此时allocate()实质上是使用的时空间配置器中的simple_alloc()函数
uninitialized_fill_n(result,n,x); //用x将n个空间填满
return result; //返回vector的首地址
}
public:
//用初始值构造一个vector
vector():start(0),finish(0),end_of_storage(0){}
//构造一个可存放n个元素的vector,初始值用默认值填充
vector(size_type n)
{
fill_initialize(n,T());
}
~vector()
{}
private:
typedef simple_alloc<value_type, Alloc> data_allocator; //将simple_alloc<value_type, Alloc>重命名
iterator start; //指向目前使用空间的头
iterator finish; //指向目前使用空间的尾
iterator end_of_storage; /