STL Vector 模拟实现
Vector 是 C++ 中最常用的动态数组容器,它结合了普通数组连续存储、下标访问高效的特点,同时解决了大小固定的问题。其底层通过动态分配的内存块管理元素,当空间不足时会自动扩容。
核心结构
Vector 的底层维护三个关键指针来管理内存状态:
_start:指向容器中第一个有效元素的起始位置。_finish:指向容器中最后一个有效元素的下一个位置(尾后迭代器)。_endofstorage:指向已分配内存空间的最后一个位置的下一个位置。
有效元素范围是 [_start, _finish),总容量由 _endofstorage - _start 决定。当 _finish == _endofstorage 时,容器已满,插入新元素需要触发扩容。
默认成员函数
构造函数
我们需要处理几种构造场景:空构造、填充构造和范围构造。
template <class T>
class vector {
public:
// 空构造
vector() : _start(nullptr), _finish(nullptr), _endofstorage(nullptr) {}
// 填充构造
vector(size_t n, const T& val = T()) { resize(n, val); }
// 范围构造
template<class InputIterator>
vector(InputIterator first, InputIterator last) {
while (first != last) {
push_back(*first);
++first;
}
}
private:
iterator _start;
iterator _finish;
iterator _endofstorage;
};
这里有一个容易踩坑的细节:vector<int> v(10, 1) 可能会误匹配范围构造函数,因为编译器可能将 10 当作迭代器。解决方式是将参数显式指定为 size_t 类型(如 10u),或者重载一个接受 int 的填充构造函数版本。
拷贝构造与赋值
对于包含动态资源的自定义类型(如 string),必须执行深拷贝,避免浅拷贝导致的内存共享问题。传统写法是直接开辟新空间并逐个元素赋值;现代写法则可以利用 配合 简化逻辑。


