【C++初阶】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;
}

🍑增删查改功能实现

🍍增加数据

  1. reserve()函数是扩容函数,capacity()函数是算出实际空间的大小,还额外使用了memcpy()函数进行了拷贝,这里之所以扩容在if条件下进行,是因为我
评论 49
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悦心无谓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值