手写 C++ Vector 容器底层原理与实现
Vector 作为 C++ STL 中最常用的序列容器,其核心在于对动态内存的高效管理。在实现层面,我们主要依赖三个关键指针来追踪数据状态:指向起始位置的 _start,指向有效数据末尾的 _finish,以及指向已分配存储空间末尾的 _endofstorage。
核心成员变量与初始化
这三个指针构成了 Vector 的骨架。构造函数负责将它们初始化为空状态,确保对象创建时处于安全可用状态。
#pragma once
#include <iostream>
#include <assert.h>
using namespace std;
namespace Solution
{
template<class T>
class vector
{
public:
typedef T* iterator;
typedef const T* const_iterator;
vector()
:_start(nullptr)
,_finish(nullptr)
,_endofstorage(nullptr)
{}
//实现拷贝构造,先开一样的空间,再拷贝
vector(const vector<T>& v)
:_start(nullptr)
,_finish(nullptr)
,_endofstorage(nullptr)
{
reserve(v.capacity());
//因为 memcpy 是浅拷贝,故不考虑,用深拷贝赋值拷贝
if (_start)
{
for (size_t i = 0; i < v.size(); ++i)
{
*(_start + i) = *(v._start + i);
}
}
_finish = _start + v.size();
_endofstorage = _start + v.capacity();
}
~()
{
[] _start;
_start = _finish = _endofstorage = ;
}
{
(_finish == _endofstorage)
{
capacity1 = ();
newcapacity = capacity1 == ? : * capacity1;
(newcapacity);
}
*_finish = val;
++_finish;
}
{
(_start != _finish);
_finish--;
}
{
(pos >= _start && pos <= _finish);
(_finish == _endofstorage)
{
capacity1 = ();
newcapacity = capacity1 == ? : * capacity1;
(newcapacity);
}
iterator end1 = () - ;
(end1 >= pos)
{
*(end1) = *end1;
--end1;
}
*pos = val;
_finish++;
}
{
(pos >= _start && pos < _finish);
(pos < _finish)
{
*pos = *(pos + );
++pos;
}
--_finish;
}
{
(n < ())
{
_finish = _start + n;
}
{
(n);
(_finish < _start + n)
{
*_finish = val;
++_finish;
}
}
}
{
(n > ())
{
sz = ();
T* tmp = T[n];
( i = ; i < sz; ++i)
{
*(tmp + i) = *(_start + i);
}
[] _start;
_start = tmp;
_finish = tmp + sz;
_endofstorage = tmp + n;
}
}
{
_start;
}
{
_finish;
}
T& []( n)
{
(n < ());
*(_start + n);
}
vector<T>& =( vector<T>& v)
{
( != &v)
{
vector<T> (v);
(v1);
}
*;
}
{
(_start, v._start);
(_finish, v._finish);
(_endofstorage, v._endofstorage);
}
{
_finish - _start;
}
{
_endofstorage - _start;
}
:
T* _start;
T* _finish;
T* _endofstorage;
};
}


