c++学习之vector的实现

news2024/12/24 9:38:08

在学习实现vector之前我们会看到对于库中的vector的实现,这里并非使用在学习string那样的定义方式,而是利用迭代器,也就是指针来实现的,这在功能的实现时极大的方便了我们。

 那么我们就模仿库这样的方式实现我们呢经常会用到的一些成员函数

private:
	
	//定义迭代器分别表示指向数组的首,尾,容量末尾
	iterator _start;
	iterator _finish;
	iterator _endofstorage;

目录

1.成员函数

构造函数

拷贝构造函数

赋值运算符 

析构函数

迭代器

容器

size

capacity

resize

reserve

元素访问

operator[]

修饰符 

push_back

erase

swap


1.成员函数

构造函数

//无参构造
	vector() :_start(nullptr), _finish(nullptr), _endofstorage(nullptr)
	{

	}
//有参构造
	vector(size_t n, const T& val = T())
	{
		reserve(n);
		for (size_t i = 0; i < n; i++)
		{
			push_back(val);
		}
	}

拷贝构造函数

//拷贝构造
	vector(const vector<T> &v)
	{
		reserve(v.capacity());
		for (auto &it : v)
		{
			push_back(it);
		}
	}

赋值运算符 

vector<T>& operator=(const vector<T>& tmp)
	{
		swap(tmp);
		return *this;
	}

析构函数

~vector()
	{
		//_start即代表数组首位置,也代表整个数组
		delete [] _start;
		 _start=_finish= _endofstorage=nullptr;
	}

迭代器

除了迭代器外,c++库中还提供了利用迭代器区间实现数组的初始化:

//迭代器
	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;
	}
	//迭代器区间初始化
	template <class InputIterator>
	vector(InputIterator first, InputIterator last)
	{
		while (first != last)
		{
			push_back(*first);
			++first;
		}
	}

容器

size

size_t size()
	{
		return _finish - _start;
	}

capacity

//容量
	size_t capacity()
	{
		return _endofstorage - _start;
	}

resize

改变大小,并初始化
 匿名对象这里需要const延长生命周期
 对于类型在c++中,我们也可将他认为是一种对象,在不确定给其类型时,通过参数推导出类型如:int i=0; int j(1);int k=int(5);
注意这里的缺省值不能给0,因为其类型并不知道,所以给一个T的匿名对象

void resize(size_t x,const T& value =T())	
	{
		if (x < size())
		{
			//删除
			_finish = _start + x;
		}
		else
		{
			//扩并插入传的值
			reserve(x);
			while (_finish < _start + x)
			{
				*_finish = value;
				++_finish;
			}
		}
	}

reserve

这里需要注意的是在_start被重新初始化后,对应的_finish也需要变为现在对应的地址,我们可保存当前size

//扩容
	void reserve(size_t x)
	{
		T* tmp = new T[x];
		size_t sz = size();
		if (_start)
		{
			memcpy(tmp, _start, sizeof(T) * sz);
			delete[]_start;
		}
		//初始化首尾
		_start = tmp;
		_finish = _start + sz;
		_endofstorage = _start + x;
	}

元素访问

operator[]

T& operator[](size_t pos)
	{
		return _start[pos];
	}
	const T& operator[](size_t pos)const
	{
		return _start[pos];
	}

修饰符 

push_back

//尾插
	void push_back(const T& x)
	{
		if (_finish == _endofstorage)
		{
			//扩容
			size_t _capacity = capacity() == 0 ? 4 : capacity()* 2;
			reserve(_capacity);
		}
		//尾插
		*_finish = x;
		++_finish;
	}

insert

void insert(iterator pos, const T& x)
	{
		assert(pos >= _start);
		assert(pos <= _finish);
		if (_finish == _endofstorage)
		{
			size_t len = pos - _start;
			reserve(capacity() == 0 ? 4 : capacity() * 2);
			pos = _start + len;
		}
		iterator end = _finish - 1;
		while (end >= pos)
		{
			*(end + 1) = *end;
			--end;
		}
		*pos = x;
		++_finish;
	}

erase

//删除
	iterator erase(iterator pos)
	{
		assert(pos >= _start);
		assert(pos < _finish);

		iterator it = pos + 1;
		while (it < _finish)
		{
			*(it - 1) = *it;
			++it;
		}
		--_finish;
		return pos;
	}

swap

//交换
	void swap(const vector<T>& v)
	{
		std::swap(_start, v._start);
		std::swap(_finish, v._finish);
		std::swap(_endofstorage, v._endofstorage);
	}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/950163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vision Transformer(vit)原理分析以及特征可视化

目录 Vit简介 Vit model结构图 vit输入处理 图像分块 class token与position的添加 特征提取 vit代码 Vit简介 Vision Transformer&#xff08;ViT&#xff09;是一种基于Transformer架构的深度学习模型&#xff0c;用于图像识别和计算机视觉任务。与传统的卷积神经网络…

【spring】一文带你弄懂Spring Bean的生命周期(超详细,超级通俗易懂!!)

目录 首先让我们来回顾一下Spring中的Bean是什么 Bean的生命周期 然后让我们由浅及深的对Bean的创建过程进行了解 首先来看最核心的五步骤 然后让我们逐层递进&#xff0c;学习一下七步骤版本吧 现在我们就可以进一步了解十步骤的版本&#xff08;完整的生命周期&#xff…

Java“牵手”1688商品列表数据,关键词搜索1688商品数据接口,1688API申请指南

1688商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取1688商品列表和商品详情页面数据&#xff0c;您可以通过开放平台的接口或者直接访问1688商城的网页来获取商品详情信息。以下是两种常用方法的介绍&…

【Axure高保真原型】多图表动态切换

今天和大家分享多图表动态切换的原型模板&#xff0c;点击不同的图标可以动态切换对应的表&#xff0c;包括柱状图、条形图、饼图、环形图、折线图、曲线图、面积图、阶梯图、雷达图&#xff1b;而且图表数据可以在左侧表格中动态维护&#xff0c;包括增加修改和删除&#xff0…

【深度学习 | 核心概念】那些深度学习路上必经的核心概念,确定不来看看?(二)

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

信息化发展10

消费互联网基本属性 消费互联网具有的属性包括&#xff1a; 1 &#xff09; 媒体属性&#xff1a; 由自媒体、社会媒体以及资讯为主的门户网站。 2&#xff09; 产业属性&#xff1a; 由在线旅行和为消费者提供生活服务的电子商务等其他组成。 数字中国概览示意图 在党的十九…

设计模式行为模式-访问者模式

文章目录 介绍基本原理1. 定义访问者模式2. 角色及其职责2.1 元素&#xff08;Element&#xff09;2.2 具体元素&#xff08;ConcreteElement&#xff09;2.3 访问者&#xff08;Visitor&#xff09;2.4 具体访问者&#xff08;ConcreteVisitor&#xff09;2.5 对象结构&#x…

D-Link DCS 密码泄露漏洞

0x01 前言 本次测试仅供学习使用&#xff0c;如若非法他用&#xff0c;与本文作者无关&#xff0c;需自行负责&#xff01;&#xff01;&#xff01; 0x02 漏洞描述 D-link DCS是一款成像色彩为彩色 是一款网络摄像机。D-link DCS系统存在密码泄露漏洞&#xff0c;攻击者通过…

什么牌子的电容笔比较好?适合学生党的电容笔推荐

如今&#xff0c;几乎人手一部iPad平板&#xff0c;它能帮大家解决许多工作、学习方面的问题&#xff0c;例如在工作中整理文件&#xff0c;制作一些简单的PPT。因此&#xff0c;给iPad平板配上一个好的电容笔就显得尤为重要了。在此&#xff0c;我向各位安利一些又好用又便宜的…

【数据结构】多叉树转换为二叉树-c++代码实现-POJ 3437 Tree Grafting

文章目录 写这个题目的原因寻找提交网址题目解决思路AC代码成功AC 写这个题目的原因 1、今天在看王道考研数据结构的课&#xff08;虽然我要保研&#xff0c;但是因为这些看保研面试的时候会问&#xff0c;所以看一下嘞orz&#xff09;&#xff0c;看到了这个多叉树转换为二叉…

微信黑名单怎么恢复好友?1分钟教你找回消失的“他”

微信的【黑名单】功能可以屏蔽掉一些令大家分心或者浪费时间的人。这个功能有利于减少干扰、保护隐私&#xff0c;并且还能大大提高用户的社交体验。 但是&#xff0c;有时候大家可能会因为发生冲突而将对方暂时拉入黑名单。在问题得到解决后却又希望恢复与他的联系。那么&…

Seata整合nacos,Postgresql 为DB存储

Seata整合nacos,Postgresql 为DB存储 环境 详情环境可参考 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E 我这里 <spring.cloud.alibaba-version>2021.1</spring.cloud.alibaba-version>所有选择seata版本为 1…

模拟实现应用层协议

模拟实现应用层协议 文章目录 模拟实现应用层协议应用层再谈协议 序列化和反序列化 网络版计算器自定义协议利用Json进行序列化和反序列化json库的安装条件编译 应用层 应用层&#xff08;Application layer&#xff09;是OSI模型的第七层。应用层直接和应用程序接口并提供常见…

CountDownLatch详解——深入探究CountDownLatch源码

这篇文章将会详细介绍CountDownLatch这个并发类&#xff0c;通过深入底层源代码讲解其具体实现。 /*** A synchronization aid that allows one or more threads to wait until* a set of operations being performed in other threads completes.*/ 上面是CountDownLatch这个…

对SAE的测评报告

对SAE的测评报告&#xff1a; 很高兴在这里跟大家分享我对SAE产品的测评体验&#xff0c;以下我将通过实验以及本期话题的问题这两个方面带领大家走进SAE&#xff1a; 产品介绍&#xff1a; Serverless应用引擎SAE是一款极简易用、自适应弹性的容器化应用平台。它提供全托管…

C++ 动态多态(虚函数)

所谓动态多态即&#xff0c;在运行过程中&#xff0c;会随参数的变化而展现不同的功能&#xff0c;其关键原理便是虚函数&#xff0c;与之对应的静态多态便是函数重载。 虚函数&#xff0c;即当存在与虚函数一样的函数&#xff0c;即返回值&#xff0c;函数名&#xff0c;参数等…

【毕业设计】基于SSM的电子图书分享系统

前言 &#x1f525;本系统可以选作为毕业设计&#xff0c;运用了现在主流的SSM框架&#xff0c;采用Maven来帮助我们管理依赖&#xff0c;所选结构非常合适大学生所学的技术&#xff0c;本系统结构简单&#xff0c;容易理解&#xff01;本系统功能结构完整&#xff0c;非常高适…

回归预测 | MATLAB实现IBES-ELM改进的秃鹰搜索优化算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现IBES-ELM改进的秃鹰搜索优化算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现IBES-ELM改进的秃鹰搜索优化算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图…

基于STM32的甲醛浓度检测报警仿真设计(仿真+程序+讲解)

仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;C0083 甲醛浓度检测报警仿真 1.主要功能2.仿真3. 程序4. 资料清单&下载链接 1.主要功能 功能说明&#xff1a; 1、以STM32单片机和控制核心设计甲醛浓度检测报警设计&…

Kubernetes技术--使用kubeadm快速部署一个K8s集群

这里我们配置一个单master集群。(一个Master节点,多个Node节点) 1.硬件环境准备 一台或多台机器,操作系统 CentOS7.x-86_x64。这里我们使用安装了CentOS7的三台虚拟机 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多 2.主机名称和IP地址规划 3. 初始化准备工作…