#pragma once
namespace yqx
{
template<class T>
class vector
{
public:
typedef T* iterator;
typedef const T* const_iterator;
vector()//构造
:_start(nullptr)
,_finish(nullptr)
,_endofstorage(nullptr)
{
}
//模板里边套模板
//拷贝构造函数,迭代器用作参数,来构造一个对象
template<class InputIterator>
vector(InputIterator first, InputIterator last)
: _start(nullptr)
, _finish(nullptr)
, _endofstorage(nullptr)
{
while (first != last)
{
push_back(*first);
++first;
}
}
//传统写法
/*vector(const vector<T>& v)
{
_start = new T[v.capacity()];
_finish = _start;
_endofstorage = _start + v.capacity();
for (size_t i = 0; i < v.size(); ++i)
{
*_finish = v[i];
++_finish;
}
}*/
/*vector(const vector<T>& v)
:_start(nullptr)
,_finish(nullptr)
,_endofstorage(nullptr)
{
reserve(v.capacity());
for(const auto& e : v)
push_back(e);
}*/
//现代写法
vector(const vector<T>& v)
:_start(nullptr)
, _finish(nullptr)
, _endofstorage(nullptr)
{
vector<T> tmp(v.begin(), v.end());
swap(tmp);
}
/*vector<T>& operator=(const vector<T>& v)
{
if (this != v)
{
delete[] _start;
_start = _finish = _endofstorage = nullptr;
resever(v.capacity);
for(auto e: v)
{
push_back(e);
}
}
return *this;
}*/
/*vector<T>& operator=(vector<T> v)
{
swap(_start, v._start);
swap(_finish, v._finish);
swap(_endofstorage, v._endofstorage);
return *this;
}*/
vector<T>& operator=( vector<T> v)
{
swap(v);
return *this;
}
~vector()
{
delete[] _start;
_start = _finish = _endofstorage = nullptr;
}
iterator begin()
{
return _start;
}
iterator end()
{
return _finish;
}
const_iterator begin()const
{
return _start;
}
const_iterator end()const
{
return _finish;
}
void reserve(size_t n)
{
if (n > capacity())
{
size_t sz = size();
T* tmp = new T[n];
if (_start)
{
//memcpy(tmp, _start, sizeof(T) * sz);按字节拷贝,浅拷贝,若数组内容是字符串,就会出错。因此要用深拷贝
Vector的理解及模拟实现
最新推荐文章于 2024-10-16 10:13:45 发布
本文探讨了C++中Vector的迭代器失效问题,详细解释了operator[]与at()的区别,at()在访问时会进行边界检查,而operator[]则不检查。同时,文章还介绍了如何对Vector的迭代器进行指针操作。
摘要由CSDN通过智能技术生成