名企高频考点之-请谈谈vector的底层实现
0. 概述
STL版本比较多,第一个STL是在惠普实验室完成的,简称HP版本,后序版本STL都是基于HP版本给出来的,大同小异,本文主要基于SGI-STL版本进行探究,linux下采用就是SGI-STL,而且该版本的命名风格以及编码风格,可读性非常高。
1. vector的底层结构
vector底层实际是泛型的动态类型顺序表,因此其底层实际是一段连续的空间。在SGI-STL的vector中,实际在底层使用三个指针指向该段连续空间的,如下:
start指向空间的起始位置,finish指向最后一个元素的下一个位置,end_of_storage指向空间的末尾。
// SGI-STL部分源码
template <class T, class Alloc = alloc>
class vector {
public:
typedef T value_type; // vector中元素的类型
typedef value_type* iterator; // vector的迭代器,实际就是原生态的指针的别名
// ...
protected:
iterator start; // 指向底层空空间的起始位置
iterator finish; // 指向最后一个有效元素的下一个位置,没有元素时与start在同一位置
iterator end_of_storage; // 指向空间的末尾
// ...
// 开辟n个元素的一段连续空间,并使用value来进行填充
void fill_initialize(size_type n, const T& value) {
start = allocate_and_fill(n, value);
finish = start + n;
end_of_storage = finish;
}
// ...
public:
// n向vector中填充n个位置value的元素
vector(int n, const T& value) {
fill_initialize(n, value); }
// ...
public:
// vector的迭代器
iterator begin(){
return start; }
iterator end(){
return finish; }
// ...
};
2 vector支持随机访问
因为vector底层是连续空间,并且vector重载了[]下标运算符,用户可以向使用数组的方式访问vector中的每一个元素,即支持随机访问,但vector不适宜做任意位置的插入和删除操作,因为要进行大量元素的搬移,比如插入:
reference operator[](size_type n)
{
return *(begin() + n);
<