【C++】Vector的简易模拟与探索

慈云数据 6个月前 (05-29) 技术支持 32 0

💞💞 前言

hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹

在这里插入图片描述

💥个人主页:大耳朵土土垚的博客

💥 所属专栏:C++入门至进阶

这里将会不定期更新有关C++的内容,希望大家多多点赞关注收藏💖💖

vector模拟实现完整代码

#pragma once
#include
using namespace std;
#include
#define _CRT_SECURE_NO_WARNINGS 1
namespace tutu
{
	template
	class vector
	{
	public:
		typedef T* iterator;
		typedef const T* const_iterator;
		//迭代器
		iterator begin()
		{
			return _start;
		}
		iterator end()
		{
			return _finish;
		}
		const_iterator begin() const
		{
			return _start;
		}
		const_iterator end() const
		{
			return _finish;
		}
		//构造函数
		//拷贝构造,深拷贝
		vector(const vector& v)
		{
			//提前预留空间
			reserve(v.capacity());
			for (auto i : v)
			{
				push_back(i);
			}
		}
		void swap(vector& v)
		{
			std::swap(_start, v._start);
			std::swap(_finish, v._finish);
			std::swap(_end_of_storage, v._end_of_storage);
		}
		//赋值运算符重载
		vector& operator=(vector v)
		{
			swap(v);
			return *this;
		}
		//默认构造
		vector()
			:_start(nullptr)
			, _finish(nullptr)
			, _end_of_storage(nullptr)
		{
		}
		//迭代器区间初始化
		//函数模板
		template
		vector(InputIterator first, InputIterator last)
		{
			while (first != last)
			{
				push_back(*first);
				++first;
			}
		}
		//n个val构造
		vector(size_t n, const T& val = T())//缺省值不能给0,因为T可能是string,所以给匿名对象
		{
			reserve(n);
			while (n--)
			{
				push_back(val);
			}
		}
		//n个val构造重载,第一个参数为int类型
		vector(int n, const T& val = T())//缺省值不能给0,因为T可能是string,所以给匿名对象
		{
			reserve(n);
			while (n--)
			{
				push_back(val);
			}
		}
		//initializer_list构造
		vector(initializer_list il)
		{
			reserve(il.size());
			for (auto i : il)
			{
				push_back(i);
			}
		}
		//析构函数
		~vector()
		{
			if (_start)
			{
				delete[] _start;
				_start = _finish = _end_of_storage = nullptr;
			}
		}
		//容量
		size_t capacity() const
		{
			return _end_of_storage - _start;
		}
		//数据个数
		size_t size()	const
		{
			return _finish - _start;
		}
		//扩容
		void reserve(size_t n)
		{
			if (n > capacity())
			{
				size_t oldsize = _finish - _start;
				T* tmp = new T[n];
				//memcpy(tmp, _start, oldsize * sizeof(T));	//拷贝数据,浅拷贝对于string类等不适用
		
				if (_start)//如果_start为空就不需要拷贝数据
				{
					for (size_t i = 0; i = _start);
			assert(pos 
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon