从零实现 STL vector 容器
前言
在之前的学习中,我们通过手写 String 类加深了对类和对象的理解。今天我们将继续这一系列实践,从零开始实现一个 vector 容器。这不仅有助于巩固模板编程和动态内存管理的知识,还能让我们更直观地理解 STL 底层的数据结构设计。
vector 前置知识
什么是 vector?
vector 是 C++ STL 库中提供的顺序容器类模板。它存储元素对象的连续内存空间,并提供了增删查改等常用接口。其核心特点是支持通过下标随机访问任意位置的元素。
相关接口概览
本文将重点讲解 vector 的核心接口实现。如果需要了解更多细节或官方文档,建议查阅 C++ Reference 标准文档。
手写 vector 类实现
1. 成员变量与整体框架
传统的顺序表通常记录指针、元素个数和空间大小。STL 的实现方式略有不同,主要关注三个关键指针:
_start:指向有效元素的起始位置。_finish:指向有效元素终止位置的下一个位置。_end_of_storage:指向已分配空间的终止位置。
这三个成员变量本质上都是迭代器(对于 vector 而言即指针类型)。由于顺序表在内存中连续存储,直接使用裸指针即可高效操作。我们在声明时直接赋予空指针作为默认值,避免了初始化列表中重复赋值的冗余。
![vector 内存布局示意]
2. 构造函数
我们需要实现三种主要的构造函数:
(1) 空构造
虽然编译器可能自动生成默认构造函数,但为了后续重载构造函数时不产生歧义,显式定义空构造是必要的。
vector() : _start(nullptr), _finish(nullptr), _end_of_storage(nullptr) {}
(2) 用 n 个元素对象进行初始化
参数中使用了默认值 T()。对于自定义类型,这会调用默认构造函数;对于内置类型(如 int),C++ 会将其视为可构造对象,返回默认值(如 0)。
vector(size_t n, const T& val = T()) {
_start = new T[n];
for (size_t i = 0; i < n; ++i) {
_start[i] = val;
}
_finish = _start + n;
_end_of_storage = _start + n;
}
*注:实际 STL 实现中可能会使用内存池优化分配效率,这里为了教学清晰直接使用 new。
(3) 使用迭代器区间初始化
这是一个函数模板,支持兼容其他类型的输入迭代器。
template<class InputIterator>
{
n = last - first;
_start = T[n];
InputIterator it = first;
( i = ; i < n; ++i) {
_start[i] = *it++;
}
_finish = _start + n;
_end_of_storage = _start + n;
}


