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

文章目录

  • 前言
  • 一、 整体
    • 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();//提前记录下sizefor (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.mzph.cn/news/7817.shtml

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

相关文章

小程序如何修改商品

​商家可能会遇到需要修改产品信息的情况。无论是价格调整、库存更新还是商品描述的修改&#xff0c;小程序提供了简便的方式来帮助你们完成这些操作。下面是一些简单的步骤和注意事项&#xff0c;帮助你们顺利地修改商品。 一、进入商品管理页面 在个人中心点击管理入口&…

矿井人员视频行为分析算法 opencv

矿井人员视频行为分析算法通过opencvpython网络模型技术&#xff0c;矿井人员视频行为分析算法实时监测人员的作业行为&#xff0c;并与安全标准进行比对&#xff0c;可以及时发现不符合安全要求的行为&#xff0c;预防事故的发生。OpenCV的全称是Open Source Computer Vision …

教师ChatGPT的23种用法

火爆全网的ChatGPT&#xff0c;作为教师应该如何正确使用&#xff1f;本文梳理了教师ChatGPT的23种用法&#xff0c;一起来看看吧&#xff01; 1、回答问题 ChatGPT可用于实时回答问题&#xff0c;使其成为需要快速获取信息的学生的有用工具。 从这个意义上说&#xff0c;Cha…

【N32L40X】学习笔记10-外部触发方式计数

定时器采用外部触发方式计数 也就是外部时钟源模式2 此模式由 TIMx_SMCTRL .EXCEN 选择等于 1。计数器可以在外部触发输入 ETR 的每个上升沿或下降沿 计数。 极性选择分频选择过滤选择选择外部时钟ETR模式 bsp_time_counter_ETR.h #ifndef _BSP_TIME_COUNTER_ETR_H_ #defi…

AI数字人:金融数字化转型的“关键先生”

今年年初ChatGPT的火热&#xff0c;在全球掀起一阵生成式AI&#xff08;AIGC&#xff09;热潮。国外的OpenAI、国内的百度等企业&#xff0c;都在AIGC上强力布局。 各种应用场景中&#xff0c;AIGC助力的数字人引起了市场注意。 事实上&#xff0c;数字人不是个新鲜事。早在1…

在Ubuntu 系统下开发GUI,用哪种开发工具比较好?

在Ubuntu系统下开发GUI&#xff0c;你可以考虑使用以下几种开发工具&#xff1a;Qt Creator&#xff1a;Qt Creator是一个跨平台的集成开发环境&#xff0c;专门用于开发基于Qt框架的应用程序。它提供了丰富的图形界面设计工具和代码编辑器&#xff0c;支持C和QML编程。Qt Crea…

UI 自动化稳定性用例实战经验分享!

目录 前言&#xff1a; 大家常说 UI 自动化不稳定&#xff0c;那又如何提高稳定性呢&#xff1f; 操作界面非预期的弹框、广告、浮层 测试系统的 A/B 策略 总结&#xff1a; 前言&#xff1a; 稳定性测试是软件测试的一个重要方面&#xff0c;它旨在评估软件在不同负载和…

一起学SF框架系列5.8-spring-Beans-注解bean解析4-bean解析

前面三节主要讲了如何加载注解Bean的BeanDefinition&#xff0c;执行环节是在DefaultBeanDefinitionDocumentReader.parseBeanDefinitions中用BeanDefinitionParserDelegate.parseCustomElement(ele)加载的&#xff0c;实际上没对注解真正进行解析。本节主要讲述注解bean如何被…

Mysql关于进程中的死锁和解除锁

Mysql 经常会遇到语句或者存储过程长时间没有反应&#xff0c;大概率就是挂掉了&#xff0c;或者死锁了。 可通过如下几种方式来查看当前进程状态 1. 查询数据库所有的进程状态 SHOW PROCESSLIST SELECT * FROM information_schema.PROCESSLIST; 2. 查询在锁的事务 SELECT…

opencv 图像腐蚀膨胀 erode dilate

#include "iostream" #include "opencv2/opencv.hpp" using namespace std; using namespace cv;int main() {Mat img, dst, dstbin, distancetransform,rel, rel2;img imread("m3.jpg");//转为灰度图cvtColor(img, dst, COLOR_BGR2GRAY);//二…

从Vue2到Vue3【五】——新的组件(Fragment、Teleport、Suspense)

系列文章目录 内容链接从Vue2到Vue3【零】Vue3简介从Vue2到Vue3【一】Composition API&#xff08;第一章&#xff09;从Vue2到Vue3【二】Composition API&#xff08;第二章&#xff09;从Vue2到Vue3【三】Composition API&#xff08;第三章&#xff09;从Vue2到Vue3【四】C…

网络通信原理(第十八课)

网络通信原理(第十八课) 4.1 回顾 1.什么是TCP/IP 目前应用广泛的网络通信协议集 国际互联网上电脑相互通信的规则、约定。 2.主机通信的三要素 IP地址:用来标识一个节点的网络地址(区分网络中电脑身份的地址,如人有名字) 子网掩码:配合IP地址确定网络号 IP路由:网…

10分钟内入门 ArcGIS Pro

本文来源&#xff1a;GIS荟 大家好&#xff0c;这篇文章大概会花费你10分钟的时间&#xff0c;带你入门 ArcGIS Pro 的使用&#xff0c;不过前提是你有 ArcMap 使用经验。 我将从工程文件组织方式、软件界面、常用功能、编辑器、制图这5个维度给大家介绍。 演示使用的 ArcGI…

【Nodejs】nodejs内置模块(中)

1.路劲处理模块 path 1.1 模块概览 在nodejs中&#xff0c;path是个使用频率很高&#xff0c;但却让人又爱又恨的模块。部分因为文档说的不够清晰&#xff0c;部分因为接口的平台差异性。将path的接口按照用途归类&#xff0c;仔细琢磨琢磨&#xff0c;也就没那么费解了。 1.…

计算机网络模型

计算机网络模型 网络模型网络模型中各层对应的协议封装与分用TCP/IP协议簇的组成 网络模型 OSI 七层模型 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 TCP/IP四层模型 应用层、传输层、网络层、网络接口层 TCP/IP五层模型 应用层、传输层、网络层、数据链路…

iOS transform rotate总结

研究了一下transform的旋转设置&#xff0c;调了半天还以为是旋转写错了&#xff0c;发现是两个不同的view对象写错了&#xff0c;不管怎么说&#xff0c;还是记录一下旋转相关的操作吧。 参数都是弧度。 以一个图片来举例。 let img UIImageView.init() img.image UIImage…

k8s集群环境的搭建

1.环境规划 1.1 集群类型 Kubernetes集群大致分为两类&#xff1a;一主多从和多主多从。 一主多从&#xff1a;一个Master节点和多台Node节点&#xff0c;搭建简单&#xff0c;但是有单机故障风险&#xff0c;适合用于测试环境。 多主多从&#xff1a;多台Master和多台Node节点…

ubuntu与windows之间的文件共享

最近在做项目&#xff0c;需要用到ubuntu进行代码编译生成可执行文件&#xff0c;但是我个人阅读和编写代码喜欢用source insight这个软件IDE。安利一下这个软件&#xff0c;阅读代码和编辑代码真的很棒啊&#xff0c;谁用谁知道吧&#xff01; 由于在ubuntu中安装source insig…

RocketMQ基本概念与入门

文章目录 MQ基本结构依赖案例:productConsumer 核心概念1.nameserver2.broker3.主题队列4.queue队列5. 生产者6.消费者分组和生产者分组7.消费点位 MQ基本结构 message: 消息数据对象product: 程序代码,生成消息,发送消息到队列consumer: 程序代码,监听(绑定)队列,获取消息,执行…

全志F1C200S嵌入式驱动开发(spi-nor image制作)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 一般soc系统里面添加spi-nor flash芯片,特别是对linux soc来说,都是把它当成文件系统来使用的。spi-nor flash和spi-nand flash相比,虽然空间小了点,但是胜在稳定,这是很多工业…