1. 为什么需要模拟实现vector?
在C++标准库中,vector是最常用的容器之一,但很多开发者只是停留在"会用"的层面。当我第一次尝试自己实现vector时,才发现原来这个看似简单的容器背后藏着这么多设计精妙之处。模拟实现vector不仅能帮助我们深入理解STL的设计思想,更是面试中经常被考察的重点内容。
vector本质上是一个动态数组,它能够在运行时根据需要自动调整大小。与普通数组相比,vector的优势在于:
- 自动内存管理
- 高效的随机访问
- 尾部插入/删除的高效性
- 丰富的成员函数接口
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. vector的核心结构设计
2.1 基础成员变量
每个vector实例需要维护三个关键指针:
cpp复制template <typename T>
class Vector {
private:
T* _start; // 指向数组首元素
T* _finish; // 指向最后一个元素的下一个位置
T* _end_of_storage; // 指向存储空间末尾
};
这种设计有几个精妙之处:
- 通过_start和_finish可以快速计算size():
return _finish - _start; - 通过_finish和_end_of_storage可以快速计算capacity():
return _end_of_storage - _start; - 空vector的初始化非常简洁:
_start = _finish = _end_of_storage = nullptr;
2.2 构造函数实现
vector通常需要实现以下几种构造函数:
cpp复制// 默认构造函数
Vector() : _start(nullptr), _finish(nullptr), _end_of_storage(nullptr) {}
// 指定大小和初始值的构造函数
Vector(size_t n, const T& value = T()) {
_start = new T[n];
_finish = _end_of_storage = _start + n;
std::fill(_start, _finish, value);
}
// 范围构造函数
template <typename InputIterator>
Vector(InputIterator first, InputIterator last) {
size_t n = std::distance(first, last);
_start = new T[n];
_finish = _end_of_storage = _start + n;
std::co
