vector 的核心数据结构
vector 的底层实现依赖于三个关键指针(或者迭代器),它们共同管理内存空间与元素布局:
_start:指向数组的起始位置,即第一个元素的内存地址
_finish:指向最后一个元素的下一个位置,用于标记已分配但未使用的空间边界
_end_of_storage:指向当前分配内存的末尾,标记整个连续内存块的结束
这三个指针的动态调整是 vector 实现高效内存管理的核心。例如:当插入元素空间不足时,_finish 会触发扩容逻辑,分配更大的内存块并迁移数据!下面我们来通过 2 倍扩容来实现 vector。
模板框架搭建
既然 vector 的实现是依靠模板来的,那么推理出来就是:在自定义空间中用模板实现类。
namespace Seek { //vector 模板
template<class T>
class vector {
public:
//实现
private:
T* _start;
T* _finish;
T* _end_of_storage;
};
}
**类模板的实例化:**空间声明 + 模板类类型
Seek::vector<int> S1;
构造初始化
观察库里面的 Vector 我们发现在没有任何参数时 capacity 也是 0。那么我们开始只需要将三个指针全部初始化为空就行了。
//构造初始化
vector() :_start(nullptr) ,_finish(nullptr) ,_end_of_storage(nullptr) { }
析构函数
析构不能释放空,因此需要先判断指针是否开辟了空间,然后再置空。
//析构
~vector() {
//判断 assert(_start);
//释放空间 delete[]_start;
//置空 _start = _finish = _end_of_storage = nullptr;
}
尾插数据
首次学习 vector 实现我们以整形为主进行学习。
在尾插时我们可能需要更改三个指针的位置,因此需要先计算一下:size()、capacity。
原理:指针 - 指针=中间的元素个数(通过这样我们可以控制三个指针的移动)。
//size
size_t size() { _finish - _start; }
{ _end_of_storage - _start; }


