C++ STL vector 底层原理与模拟实现
在之前的讨论中,我们详细了解了 vector 核心接口的使用。接下来,我们将深入剖析其底层实现机制,并通过模拟代码来加深理解。
一、vector 的基本成员变量
在着手模拟之前,必须明确 vector 内部维护了哪些关键指针。通过查阅源码可以发现,vector 主要依赖三个指针来管理内存:
_start:指向已分配空间的头部。_finish:指向最后一个有效数据元素的下一个位置。_endofstorage:指向已分配空间的末尾。
基于此,我们可以搭建出 vector 的类框架。需要注意的是,模板类的声明和定义通常不能分离到不同文件中,因此所有实现都放在头文件内。
#include <iostream>
using namespace std;
namespace my_vector {
template<class T>
class vector {
public:
// 迭代器直接使用原生指针
typedef T* iterator;
typedef const T* const_iterator;
private:
iterator _start; // 指向空间头部
iterator _finish; // 指向最后一个有效数据的下一个位置
iterator _endofstorage; // 指向空间的末尾
};}
二、vector 核心接口的实现
2.1 构造相关接口
构造函数涵盖了多种初始化场景,包括默认构造、指定数量构造、拷贝构造、初始化列表构造以及迭代器区间构造。赋值运算符重载则通常通过交换逻辑来实现。
// 默认构造
vector() : _start(nullptr), _finish(nullptr), _endofstorage(nullptr) {}
// 使用 n 个 val 初始化
// T() 会调用类型 T 的默认构造,支持内置类型或自定义类型
vector(size_t n, T val = T()) {
resize(n, val);
}
// 拷贝构造
vector( vector<T>& v) {
(v.());
( e : v) {
(e);
}
}
(initializer_list<T> il) {
(il.());
( e : il) {
(e);
}
}
{
(first != last) {
(*first);
first++;
}
}
vector& =( vector<T>& v) {
(v);
*;
}
{
std::(_start, v._start);
std::(_finish, v._finish);
std::(_endofstorage, v._endofstorage);
}
~() {
(_start) {
[] _start;
_start = _finish = _endofstorage = ;
}
}


