当前位置: 首页 > news >正文

【C++进阶四】vector模拟实现

目录

1.构造函数

(1)无参构造

(2)带参构造函数

(3)用迭代器构造初始化函数

(4)拷贝构造函数 

 2.operator=

3.operator[]

4.size()

5.capacity()

6.push_back

 7.reserve

 8.迭代器(vector的原生指针)

9.resize

10.pop_back

11.insert

12.erase

13.memcpy替换为深拷贝


 大致框架

namespace zbw
{
	template <class T>
	class vector
	{
	public:
		typedef T* iterator;
	private:
		iterator _start;
		iterator _finish;
		iterator _end_of_storage;
	};
}

1.构造函数

(1)无参构造

	vector()
		:_start(nullptr)
		, _finish(nullptr)
		, _end_of_storage(nullptr)
	{}

(2)构造n个val

	vector(size_t n,const T& val = T())//const延长匿名对象的生命周期
		:_start(nullptr)
		, _finish(nullptr)
		, _end_of_storage(nullptr)
	{
		reverse(n);
		for (int i = 0; i < n; i++)
		{
			push_back(val);
		}
	}

匿名对象生命周期只有这一行,调用完匿名函数后会调用析构函数将其析构

但引用会延长匿名对象的生命周期到引用对象域结束,由于匿名对象具有常性,所以需要用const修饰,此时调用完匿名对象,并不会调用析构函数释放

(3)用迭代器构造初始化函数

	tmplete <class InputIterator>
	vector(InputIterator first,InputIterator last)
		:_start(nullptr)
		, _finish(nullptr)
		, _end_of_storage(nullptr)
	{
		while (first != last)
		{
			push_back(*first);
			first++;
		}
	}

使用迭代器模板,就可以传任意类型的迭代器,否则只能使用vector的迭代器

起名为InputIterator,是因为函数模板的模板参数要传迭代器区间时,是存在命名规范的

InputIterator这种迭代器所指的对象为“只读”,不允许外界更改

(4)拷贝构造函数 

传统写法

	vector(const vector<T>& v)//v2(v1)
	{
		_start = new T[v.capacity()];
		_finish = _start + v._size();
		_end_of_storage = _start + v._capacity;

		memcpy(_start, v._start, v.size() * sizeof(T));
	}

开一块和v1一样大的空间,再把v1的数据拷贝到新空间里去

现代写法 

	void swap(vector<T>& v)
	{
		std::swap(_start, v._start);
		std::swap(_finish, v._finish);
		std::swap(_end_of_storage, v._end_of_storage);
	}
	vector(const vector<T>& v)//v2(v1)
	{
		vector<T> tmp(v.begin(), v.end());
		swap(tmp);
	}

 利用迭代器初始化的构造函数,用v1创造一个临时变量tmp,再将v2与tmp交换,tmp出了作用域就调用析构函数销毁

最终版本:(防止浅拷贝)

vector(const vector<T>& v)//拷贝构造
{
	reserve(v.capacity());
	for (size_t i = 0; i < v.size(); i++)
	{
		_start[i] = v._start[i];//使用默认的赋值运算符会发生浅拷贝
	}
	_finish = _start + v.size();
}

 2.operator=

现代写法

	void swap(vector<T>& v)
	{
		std::swap(_start, v._start);
		std::swap(_finish, v._finish);
		std::swap(_end_of_storage, v._end_of_storage);
	}
	vector<T>& operator=(const vector<T> v)//v3 = v1
	{
		swap(v);
		return *this;
	}

利用传值传参拷贝构造v(此时v就是v1),再将v3与v1交换,v是临时对象除了作用域会调用析构函数销毁

3.operator[]

	T& operator[](size_t i)
	{
		assert(i < size())

相关文章:

  • 蓝桥杯省模拟赛 数位和
  • 使用LangChain Agents构建Gradio及Gradio Tools(3)——使用Langchain agents构建Gradio UI
  • AI-人工智能-多模态学习助力精准预测心脏毒性
  • 使用Hugging Face训练自定义重排模型(Reranker)完全指南
  • 2024年蓝桥杯Java B组省赛真题超详解析-分布式队列
  • Docker中安装MySQL--------【详细图解】
  • Vue2函数式组件实战:手写可调用的动态组件,适用于toast轻提示、tip提示、dialog弹窗等
  • 掌握AI营销:移动营销的新动力
  • c++:哈希表
  • GPT-4o推出的原生图像生成功能升级后有点东西!
  • 世界通信大会、嵌入式展及慕尼黑上海光博会亮点回顾
  • 手绘风格流程图工具:简单高效的在线流程图绘制工具
  • C语言复习笔记--指针(1)
  • echarts+HTML 绘制3d地图,加载散点+散点点击事件
  • 2025年SCI1区(TAC) ——语义和情感双重通道用于文本对话情感识别
  • 基于vue框架的智能服务旅游管理系统54kd3(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • Python学习第二十八天
  • 游戏引擎学习第195天
  • 8.集成模板引擎
  • 【1-1】ICT=IT+CT
  • 看纪录片抵学分,贺桂梅:纪录片是对抗低质碎片信息的好媒介
  • 陈颖已任上海黄浦区委常委、统战部部长
  • 永辉超市回应顾客结算时被“反向抹零”:整改并补偿
  • 深交所修订创业板指数编制方案,引入ESG负面剔除机制
  • 网商银行2024年年报发布,客户资产管理规模超过1万亿
  • 国台办:相关优化离境退税政策适用于来大陆的台湾同胞