目录
拷贝
传统写法:
//v2(v1)
//第一种传统写法
vector(const vector<T>& v)
{
//开一块空间
_start = new T[v.capacity()];
//拷贝有效数据过去
memcpy(_start, v._start, sizeof(T)*v.size());
_finish = _start + v.size();
_endofstorage = _start + v.capacity();
}
//第二种传统写法
vector(const vector<T>& v)
:_start(nullptr)
, _finish(nullptr)
, _endofstorage(nullptr)
{
//一次性把空间给开好
reserve(v.capacity());
//遍历v1,把v1的数据插入到v2,插入push_back会自己开空间
for (const auto& e : v)
{
push_back(e);
}
}
现代写法:
//v2(v1)
//现代写法
//类模板的成员函数,还可以在定义模板参数
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(nullptr)
, _finish(nullptr)
, _endofstorage(nullptr)
{
vector<T>tmp(v.begin(), v.end());
this->swap(tmp);//v1和tmp交换
}
void swap(vector<T>& v)
{
std::swap(this->_start,v._start);
std::swap(this->_finish,v._finish);
std::swap(this->_endofstorage,v._endofstorage);
}
完成了深拷贝————>
赋值
传统写法:
//v1 = v4
//传统写法
vector<T>& operator = (const vector<T>& v)
{
if (this ! = &v)
{
delete[] _start;//释放掉之前的空间
_start = _finish = _endofstorage = nullptr;
//开跟你v4一样大的空间
reserve(v.capacity());
//遍历v4,插入数据
for (const auto& e : v)
{
push_back(e);
}
return *this;
}
}
现代写法:
//v1 = v4
//现代写法
vector<T>& operator = (vector<T> v)//直接使用传值
{
swap(v);
return *this;
}