【C++】vector类的模拟实现(增删查改,拷贝构造,赋值运算,深浅拷贝)

news2024/12/23 16:11:03

文章目录

  • 前言
  • 一、 整体
    • 1.命名空间:
    • 2构造函数:
      • 1普通构造
      • 2迭代器构造
      • 3初始化字符构造
      • 4拷贝构造:
    • 3析构函数
  • 二、成员函数实现
    • 1.大小
      • 1当前大小(size())
      • 2总体容量(capacity())
    • 2.返回头尾迭代器
      • 1begin()
      • 2end()
    • 3【】引用重载:
    • 4.内存预留(reserve)
    • 5.调整vector的有效长度(resize)
    • 6.尾插(push_back)
    • 7.在pos插入(insert)
    • 8.删除pos位置(erase)
    • 9.赋值运算符重载
  • 深浅拷贝问题(reserve):


前言

我们模拟vector是用迭代器(start,end,endofstorage)来控制增删查改操作的

在这里插入图片描述

一、 整体

1.命名空间:

namespace simulation {
	template<class T>//定义模板
	class vector {
	public:
		typedef T* iterator;
		typedef const T* const_iterator;
		//
		private:
		iterator _start;
		iterator _finish;
		iterator _endofstorage;
	};
	}

2构造函数:

1普通构造

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

2迭代器构造

template<class InputIterator>
		//【first,last)左闭右开区间
		vector(InputIterator first, InputIterator last) {
			while (first != last) {
				push_back(*first);
				first++;
			}
		}

3初始化字符构造

vector(size_t n, const T& val = T()) {
//const T& val = T()调用T的默认构造的缺省参数
			resize(n, val);
		}

4拷贝构造:

vector(const vector<T>& v) {
			_start = new T[v.capacity()];
			size_t sz = v.size();
			//提前记录下size
			for (size_t i = 0; i < sz; i++) {
				_start[i] = v._start[i];//实行深拷贝
			}
			_finish = _start + sz;
			_endofstorage = _start + v.capacity();
		}

3析构函数

~vector() {
			if (_start) {
				delete[] _start;
				_start = _finish = _endofstorage;
			}
		}

二、成员函数实现

1.大小

1当前大小(size())

//我本身是一个const对象,不可变,所以就需要调用一个const函数,
//但我要是一个非const对象,那么调用非const或者const函数是都都可以的
//这 成员函数加个const,这样const和非const对象都就可以调用了
		size_t size()const    {
			return _finish - _start;
		}

2总体容量(capacity())

size_t capacity() const   {
			return _endofstorage - _start;
		}

2.返回头尾迭代器

1begin()

       iterator begin() {
			return _start;
		}
		const_iterator begin()const {
			return _start;
		}

2end()

      iterator end() {
			return _finish;
		}
		const_iterator end()const {
			return _finish;
		}

3【】引用重载:

      T& operator[](size_t pos) {
			assert(pos < _finish);
			return _start[pos];
		}

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

4.内存预留(reserve)

	void reserve(size_t n) {
			if (n > capacity()) {
				T* tmp = new T[n];
				size_t sz = size();
		//提前存下size,因为后面start会变动
				
				if (_start) {
					for (size_t i = 0; i < sz; i++) {
						tmp[i] = _start[i];
					}
//这里拷贝原来的数据不用memcpy是因为memcpy是浅拷贝我们vector要的是深拷贝
//所以用for循环调用赋值运算符重载,实现对象的深拷贝
					delete[] _start;
				}
				_start = tmp;
				_finish = _start + sz;
				_endofstorage = _start + n;
			}
		}

5.调整vector的有效长度(resize)

void resize(size_t n, const T& val = T()) {
			//将前n个数据初始化为val
			//从当前已有数据后面开始
			if (n < size()) {
				_finish = _start + n;
				
			}
			else {
				reserve(n);
				while (_finish != _start+n) {
					*_finish = val;
					_finish++;
				}
			}
		}

6.尾插(push_back)

void push_back(const T& x) {
			if (_finish == _endofstorage) {
				//判断是否需要扩容
				size_t newcapacity = capacity() == 0 ? 4 : capacity() * 2;
				reserve(newcapacity);
			}
			*_finish = x;
			_finish++;
			//或者insert(--end());
		}

7.在pos插入(insert)

iterator insert(iterator pos, const T& x) {
			assert(pos >= _start && pos <= _finish);
			if (_finish == _endofstorage) {
				size_t len = pos - _start;
				//算出pos的相对位置
				size_t newcapacity = capacity() == 0 ? 4 : capacity()  
				reserve(newcapacity);
				pos = _start + len;
			}
			iterator end = _finish - 1;
			while (end >= pos) {
				*(end + 1) = *end;
				--end;
			}
			*pos = x;
			++_finish;
			return pos;
		}

8.删除pos位置(erase)

iterator erase(iterator pos) {
			assert(pos >= _start && pos < _finish);
			iterator it = pos + 1;
			//将pos后面的数据朝前覆盖
			while (it != _finish) {
				*(it - 1) = *it;
				++it;
			}
			_finish--;
			return pos;
		}

9.赋值运算符重载

void swap(vector<T>& v) {
			std::swap(_start, v._start);
			std::swap(_finish, v._finish);
			std::swap(_endofstorage, v._endofstorage);
		}
		vector& operator=(vector<T>  v) {
			swap(v);
			//创建一个临时对象,临时对象为v的拷贝
			//交换this与v的数据,出了作用域以后
			//this获得新的数据,临时对象v出作用域销毁
			return *this;
		}

深浅拷贝问题(reserve):

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

改进的北方苍鹰算法优化BP神经网络---回归+分类两种案例

今天采用前作者自行改进的一个算法---融合正余弦和折射反向学习的北方苍鹰(SCNGO)优化算法优化BP神经网络。 文章一次性讲解两种案例&#xff0c;回归与分类。回归案例中&#xff0c;作者选用了一个经典的股票数据。分类案例中&#xff0c;选用的是公用的UCI数据集。 BP神经网络…

达芬奇密码

《达芬奇密码》是一款由德国人发明的桌游&#xff0c;游戏由2-4个人组成。每个玩家执有一定的数字牌&#xff0c;玩家需隐藏你的数字密码&#xff0c;猜透对手的密码&#xff0c;推测可能的答案&#xff0c;打败对手。 24 块塑料立牌&#xff0c;12 个黑色和12个白色。每块上数…

7-25作业

思维导图 QT窗口代码 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {qDebug()<< this->size();this->resize(1000,800);//设置宽高this->setFixedSize(1000,800);//固定宽高//窗口标题this->setWindowTitle("跟党走…

全志F1C200S嵌入式驱动开发(lcd屏幕驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 lcd RGB屏幕作为比较经济、实用的显示工具,在实际场景中使用较多。它的信号来说,一般也比较简单,除了常规的数据信号,剩下来就是行同步、场同步、数据使能和时钟信号了。数据信…

LED芯片 VAS1260IB05E 带内部开关LED驱动器 汽车硬灯带灯条解决方案

VAS1260IB05E深力科LED芯片是一种连续模式电感降压转换器&#xff0c;设计用于从高于LED电压的电压源高效驱动单个或多个串联连接的LED。该设备在5V至60V之间的输入电源下工作&#xff0c;并提供高达1.2A的外部可调输出电流。包括输出开关和高侧输出电流感测电路&#xff0c;该…

【Linux】进程通信 — 管道

文章目录 &#x1f4d6; 前言1. 通信背景1.1 进程通信的目的&#xff1a;1.2 管道的引入&#xff1a; 2. 匿名管道2.1 匿名管道的原理&#xff1a;2.2 匿名管道的创建&#xff1a;2.3 父子进程通信&#xff1a;2.3.1 read()阻塞等待 2.4 父进程给子进程派发任务&#xff1a;2.5…

使用 OpenCV 进行图像模糊度检测(拉普拉斯方差方法)

写在前面 工作中遇到&#xff0c;简单整理人脸识别中&#xff0c;对于模糊程度较高的图像数据&#xff0c;识别率低&#xff0c;错误率高。虽然使用 AdaFace 模型&#xff0c;对低质量人脸表现尤为突出。但是还是需要对 模糊程度高的图像进行丢弃处理当前通过阈值分类&#xff…

8.python设计模式【组合模式】

内容&#xff1a;将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。角色&#xff1a; 抽象组建&#xff08;component&#xff09;叶子组建(Leaf)复合组建(Composite)客户端 (Client) UML 图 举个例子 需求&#xf…

Mysql-MHA高可用

MHA高可用配置及故障切换 一.MySQL MHA 1.什么是MHA &#xff08;&#xff11;&#xff09;MHA (Master High Availability) 是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 &#xff08;&#xff12;&#xff09;MHA的出现就是解决MySQL 单点的问题。 &#xff…

elementui el-table折叠表格,点击主表数据展开从表明细

用element-ui 的el-table实现&#xff1a;主表table可实现展开行显示关联的明细表table的列表数据&#xff0c;效果图如下 <el-tableref"tableData"v-loading"listLoading":data"tableData"row-key"id"borderstripehighlight-curr…

idea中设置maven本地仓库和自动下载依赖jar包

1.下载maven 地址&#xff1a;maven3.6.3 解压缩在D:\apache-maven-3.6.3-bin\apache-maven-3.6.3\目录下新建文件夹repository打开apache-maven-3.6.3-bin\apache-maven-3.6.3\conf文件中的settings.xml编辑&#xff1a;新增本地仓库路径 <localRepository>D:\apache-…

十二、数据结构——二叉树基本概念及特点

数据结构中的二叉树 目录 一、二叉树的基本概念 二、二叉树的特点 三、二叉树的分类 四、二叉树的存储结构 (一)、顺序存储 (二)、链式存储 一、二叉树的基本概念 二叉树是一种重要的数据结构&#xff0c;它是每个节点最多有两个子节点的树结构。在二叉树中&#xff0c;每个…

【源码解析】SpringBoot循环依赖源码解析II

前言 前面已经写过循环以来的分析&#xff0c;对循环依赖有一些了解&#xff0c;【源码解析】Spring循环依赖和三级缓存。简单回顾一下&#xff1a; Spring可以解决Autowired注入的循环依赖 Spring解决不了构造器注入的循环依赖 使用Aysnc注解会导致循环依赖。提前暴露的Bea…

Vue基础 --- 路由

1. 前端路由的概念与原理 1.1 什么是路由 路由&#xff08;英文&#xff1a;router&#xff09;就是对应关系。 1.2 SPA 与前端路由 SPA 指的是一个 web 网站只有唯一的一个 HTML 页面&#xff0c;所有组件的展示与切换都在这唯一的一个页面内完成。 此时&#xff0c;不同…

K8s卷存储详解(二)

K8s卷存储详解&#xff08;二&#xff09; 持久卷持久卷&#xff08;PV&#xff09;持久卷申领&#xff08;PVC&#xff09;存储类&#xff08;StorageClass&#xff09;存储制备器&#xff08;Provisioner&#xff09;PV和PVC的生命周期持久卷的类型CSI 卷快照CSI 卷克隆 投射…

《合成孔径雷达成像算法与实现》Figure2.14

%% 插值核 clc close all clear allN 40; x1 -4:1/N:4-1/N; hx sin(pi*x1)./(pi*x1); if x1 0hx 1; end figure plot(x1,hx,k) axis([-4 4,-0.4 1.2]) grid on arrow([-4,0],[4,0],Color,k,Linewidth,1); arrow([0,-0.4],[0,1.2],Color,k,Linewidth,1); %% 初始样本 x2 1…

第一章 函数的连续与间断与 无穷小量

文章目录 前言一、连续二、间断考点 识别间断点解题思路 三、无穷小量无穷小量的加减运算与比较无穷小的题型与解答 四、曲线的渐近线1、概念2、分类3、例题 前言 一、连续 二、间断 考点 识别间断点 解题思路 三、无穷小量 无穷小量的加减运算与比较 无穷小的题型与解答 四、曲…

高效协作处理缓存清理需求:生产者-消费者模式助力多模块缓存管理

在现代应用系统中&#xff0c;缓存是提高性能和减少数据库负载的重要手段之一。然而&#xff0c;缓存的数据在某些情况下可能会过期或者变得无效&#xff0c;因此需要及时进行清理。在复杂的应用系统中&#xff0c;可能有多个系统、多个模块产生缓存清理需求&#xff0c;而这些…

从实践彻底掌握MySQL的主从复制

目录 一、本次所用结构如图---一主多从级联&#xff1a; 二、IP。 三、配置M1&#xff1a; 四、从库M1S1&#xff1a; 五、从库M2配置&#xff1a; 六、 从库M2S1&#xff1a; 一、本次所用结构如图--- 一主多从级联&#xff1a; 二、IP。这里M1S1和M1S2一样的&#xff0…

怎么学习Java框架和库相关知识? - 易智编译EaseEditing

学习Java框架和库相关知识可以遵循以下步骤&#xff1a; 确定学习方向&#xff1a; Java拥有众多的框架和库&#xff0c;例如Spring、Hibernate、JavaFX、Apache Commons等。首先确定你感兴趣的方向和应用场景&#xff0c;然后选择相应的框架和库进行学习。 官方文档和教程&a…