基本框架
在模拟实现vector之前我们应该对vector有个基本的框架,可以通过对源代码的分析与了解,实现自己的vector。
第一步:现有大致的类模板,类中的成员变量
第二步:构造函数、析构函数、赋值运算符重载函数、拷贝构造函数这些默认函数
第三步:关注push_back(),reserve(),insert()等接口函数
模拟实现vector
namespace my_vector
{
template<class T>
class vector
{
public:
typedef T* iterator;
private:
iterator _start;
iterator _finish;
iterator _end_of_storage;
};
}
设置好一个命名空间,类,以及成员变量。
vector()
:_start(nullptr)
,_finish(nullptr)
,_end_of_sorage(nullptr)
{}
设置一个构造函数,可以选择在初始化变量进行初始化成员变量。
~vector()
{
if (_start)
{
delete[] _start;
_start = _finish = _end_of_storage = nullptr;
}
}
设置一个析构函数,注意这里需要对_start进行判空,如果_start为空,则说明_start是是一空指针,则无法进行析构。
size_t size() const
{
return _finish - _start;
}
设置一个size()函数,用来计算vector的数据个数。
size_t capacity() const
{
return _end_of_storage - _start;
}
设置一个capacity()函数,用来计算vector的容量大小。
void reserve(size_t n)
{
if (capacity() < n)
{
size_t sz = size();
T* tmp = new T[n];
if (_start)
{
//memcpy(tmp, _start, sizeof(T) * sz);
for (size_t i = 0; i < sz; ++i)
{
tmp[i] = _start[i];
}
delete[] _start;
}
_start = tmp;
_finish = _start + sz;
_end_of_storage = _start + n;
}
}
设置一个reserve()函数,可以用来提高容量。这里需要注意的是需要提前知道_start与_finish之间的元素个数,以便设置_finish。
void push_back(const T& x)
{
if (_finish == _en