Vector 底层实现:三个指针、内存与迭代器失效
想真正用好 vector,光会用 push_back 是不够的。搞懂它内部怎么管理内存,才能避开迭代器失效、浅拷贝那些坑。下面我们就直接拆一个自己的实现。
内存布局:三个指针
vector 内部维护了三个核心指针:
_start:指向动态分配空间的起始位置。_finish:指向当前有效数据的最后一个元素的下一个位置(即尾后迭代器)。_endofstorage:指向整个空间末尾的下一个位置(用于判断是否需要扩容)。
这仨搭档就能管理所有动态操作。基础类定义如下:
#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; // 指向空间的末尾
};
}
构造与赋值
模板类的声明和定义通常放在同一个文件里,不像普通类能安心分离 .h 和 .cpp。
// 默认构造
vector() : _start(nullptr), _finish(nullptr), _endofstorage(nullptr) {}
// 使用 n 个 val 初始化
vector(size_t n, T val = T()) {
resize(n, val);
}
// 拷贝构造
vector(const vector<T>& v) {
reserve(v.size());
( 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 = ;
}
}


