✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌟🌟 追风赶月莫停留 🌟🌟
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
🌟🌟 平芜尽处是春山🌟🌟
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
🍋vector模拟实现
🍑默认成员函数
🍍构造函数
//默认构造
vector()
{
}
//带参构造
vector(size_t x, const T& val = T())
{
resize(x, val);
}
......
对于带参构造当中,第二个参数,所采用的是匿名对象作为缺省值;因为在这里T的的类型不确定,只能使用匿名对象来修饰。
匿名对象:指的是没有被显式命名(即没有标识符或变量名)的对象实例。这类对象通常在需要临时执行某些操作或作为函数参数/返回值传递时创建,而不需要将结果长期存储于某个变量中。
此处的构造只涉及到浅拷贝,对于深拷贝后面会有介绍。
🍍拷贝构造函数
//拷贝构造(普通写法)
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)
{
reserve(v.capacity());
for (const auto& in : v)
{
push_back(in);
}
}
//现代写法
vector(vector<T>& v)
{
vector<T> ret(v.begin(), v.end());
swap(ret);
}
此处的拷贝构造函数就涉及到深拷贝问题,这里我提供了三种写法。
(1)第一种写法就是普通的写法,相信大家自己来模拟拷贝构造,思路大径相同;这里还用到了memmove()函数, 大家也可以采用while()循环的方式来代替,方法多种多样。
(2)第二种写法就是利用vector的插入完成,不过需要提前开满足够的空间,不然内存会泄露。
(3)第三种写法利用swap的特性。
🍍析构函数
//iterator _start = nullptr;
//iterator _finish = nullptr;
//iterator _endofstorage = nullptr;
~vector()
{
if(_start)
{
delete[] _start;
_start = nullptr;
_finish = nullptr;
_endofstorage = nullptr;
}
}
析构函数还是常规写法,没有什么特别之处。
_start、_finish、_endofstorage是vector的迭代器。_start是指向头;_finish是数据存储大小的尾;_endofstorage是整个空间大小的尾。
🍍赋值重载函数
//传统写法
vector<T>& operator=(const vector<T>& v)
{
if (this != &v)
{
reserve(v.capacity());
for (size_t i = 0; i < v.size(); i++)
{
_start[i] = v[i];
}
_finish = _start + v.size();
}
return *this;
}
//优化写法
vector<T>& operator=(vector<T> v)
{
swap(v);
return *this;
}
在进行赋值重载操作时,可以先对数据进行对比,如果相同就不用再进行此操作。
赋值重载需要注意的是优化写法中在参数中没有采用引用的写法,swap()函数是把两处的内容完全交换,而我们在这里仅仅只需要赋值,所以我在这里并对v采用引用的写法,如果对v采用引用的写法可能会把原有的v中数据破坏,未被引用的v仅仅只是原来v中数据的拷贝,虽然它俩名字相同,但作用域不同。
🍑迭代器
无论是范围for还是方括号进行遍历,底层原理都是迭代器,迭代器有两种版本,有const版本和非const版本;迭代器写法还是直接调用子函数进行实现。
iterator begin()
{
return _start;
}
iterator end()
{
return _finish;
}
const_iterator begin() const
{
return _start;
}
const_iterator end() const
{
return _finish;
}
🍑增删查改功能实现
🍍增加数据
- reserve()函数是扩容函数,capacity()函数是算出实际空间的大小,还额外使用了memcpy()函数进行了拷贝,这里之所以扩容在if条件下进行,是因为我