c++系列之vector类模拟实现

在这里插入图片描述

💗 💗 博客:小怡同学
💗 💗 个人简介:编程小萌新
💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞

构造函数

vector()


//_begin表示有效成员的开始
//_finish表示有效成员的大小
//_end表示有效的容积
vector():_begin(nullptr),_finish(nullptr),_end(nullptr){}

vector(size_t n, const T& value = T())

//这里不用memcpy拷贝的原因是
//1. memcpy是内存的二进制格式拷贝,将一段内存空间中内容原封不动的拷贝到另外一段内存空间中
//2. 如果拷贝的是内置类型的元素,memcpy既高效又不会出错,但如果拷贝的是自定义类型元素,并且自定义类型元素中涉及到资源管理时,就会出错,因为memcpy的拷贝实际是浅拷贝。
//3.内置类型也有拷贝构造
vector(int n, const T& value = T()):_begin(nullptr), _finish(nullptr), _end(nullptr){_begin = new T[n];_finish = _begin + n;_end = _begin + n;for (int i = 0; i < n; i++){*(_begin + i) = value;}}//便捷写法
/*vector(int n, const T& value = T())
{reserve(n);for (int i = 0; i < n; i++){_begin[i] =  value;}
}
vector(int n, const T& value = T())
{resize(n,value);
}*/

vector(InputIterator first, InputIterator last)

//迭代器构造
template<class InputIterator>
vector(InputIterator first, InputIterator last)
{while (first!= last){push_back(*first);//尾插first++;	}
}

vector(vector& v)

//拷贝构造
vector(vector<T>& v)
{size_t size = v._finish - v._begin;size_t capacity = v. _end - v._begin;_begin = new T[capacity];for (size_t i = 0; i < size; i++){*(_begin + i) = *(v._begin + i);}_finish = _begin + size;_end = _begin + capacity;	
}
//简便写法
vector(vector<T>& v)
{vector<T> tmp(v.begin(),v.end());swap(tmp);
}

析构函数

~vector()

~vector()
{if (_begin){delete[] _begin;_begin = _end = _finish = nullptr;}
}

运算符重载

vector& operator = (vector v)

//赋值拷贝
vector<T>& operator = (vector<T> v)
{swap(v);//这里传的是v的拷贝,改变v并不影响原本的对象return *this;
}

T& operator[](size_t pos);


T& operator[](size_t pos)
{assert(pos >= 0 && pos < size());//pos在有效范围种return _begin[pos];
}
//const对象调用
const T& operator[](size_t pos)const
{assert(pos >= _begin && pos < _finish);return _begin[pos];
}

查询vector容积和大小

size_t size()

size_t capacity()


size_t size() const
{return _finish - _begin;
}size_t capacity() const
{return _end - _begin;
}
size_t size()
{return _finish - _begin;
}size_t capacity()
{return _end - _begin;
}

调整vector的容积和大小

void reserve(size_t n)

void resize(size_t n, const T& value = T())


//这里发生扩容之后,原本的_begin,_finish,_end会发生改变,所以扩容之后要更新
void reserve(size_t n)
{if(n > capacity()){size_t oldsize = size();T* tmp = new T[n];for (size_t i = 0; i < oldsize; i++){tmp[i]  = _begin[i];}delete[] _begin;_begin = tmp;_finish = tmp +oldsize;_end = tmp + n;}
}void resize(size_t n, const T& value = T())
{if (n < size()){_finish = _begin + n;}else{if (n > capacity()){reserve(n);}while(_finish < _begin + n){*(_finish++) = value;}}
}

修改vector(头插,尾插,插入,删除,交换)

void push_back(const T& x)

void pop_back()

iterator insert(iterator pos, const T& x)

iterator erase(iterator pos)

void swap(vector& v)

void push_back(const T& x)
{if (_finish == _end){reserve(capacity() == 0? 4: capacity()*2);}*_finish =  x;_finish++;}void pop_back()
{assert(_begin != _finish);_finish--;
}
//这里会发生迭代器失效问题、
//原因1:如果发生扩容函数里原pos会变成野指针需要及时更新,函数外pos不会改变,所以要返回pos的新指针
//原因2.因为插入数据,原本pos意义改变,所以要及时更新,让pos指向新插入的元素
//正确做法是返回迭代器插入的指针
iterator insert(iterator pos, const T& x)
{assert(pos >= _begin && pos <= _finish);if (_finish == _end){size_t size = pos - _begin;reserve(capacity() == 0 ? 4 : capacity() * 2);pos = _begin + size;}iterator end = _finish - 1;while (end >= pos){*(end +1) = *(end);end--;}*pos = x;_finish++;return pos;
}
//迭代器失效原因1.erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是没有元素的,那么pos就失效了。因此删除vector中任意位置上元素时,vs就认为该位置迭代器失效了。
//迭代器失效原因2:erase之后pos位置的意义改变,迭代器所以要更新
//正确做法是返回迭代器下一个的指针
iterator erase(iterator pos)
{assert(pos >= _begin && pos <_finish );iterator end = pos + 1;while (end < _finish){*(end - 1) = *(end);end++;}_finish--;return pos;
}
void swap(vector<T>& v)
{std::swap(_begin,v._begin);std::swap(_finish,v._finish);std::swap(_end,v._end);
}

vector的迭代器

typedef T* iterator;
typedef const T* const_iterator;

完整代码

namespace zjy
{template<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;iterator begin(){return _begin;}iterator end(){return _finish;}const_iterator cbegin(){return _begin();}const_iterator cend() const{return _finish;}vector():_begin(nullptr),_finish(nullptr),_end(nullptr){}vector(int n, const T& value = T()):_begin(nullptr), _finish(nullptr), _end(nullptr){_begin = new T[n];_finish = _begin + n;_end = _begin + n;for (int i = 0; i < n; i++){*(_begin + i) = value;}}//vector(int n, const T& value = T())//{//	reserve(n);//	for (int i = 0; i < n; i++)//	{//		_begin[i] =  value;//	}//}//vector(int n, const T& value = T())//{//	resize(n,value);//}template<class InputIterator>vector(InputIterator first, InputIterator last){while (first!= last){push_back(*first);first++;}}vector(vector<T>& v){size_t size = v._finish - v._begin;size_t capacity = v. _end - v._begin;_begin = new T[capacity];for (size_t i = 0; i < size; i++){*(_begin + i) = *(v._begin + i);}_finish = _begin + size;_end = _begin + capacity;}//vector(vector<T>& v)//{//	vector<T> tmp(v.begin(),v.end());//	swap(tmp);//}vector<T>& operator = (vector<T> v){swap(v);return *this;}~vector(){if (_begin){delete[] _begin;_begin = _end = _finish = nullptr;}}size_t size() const{return _finish - _begin;}size_t capacity() const{return _end - _begin;}void reserve(size_t n){if(n > capacity()){size_t oldsize = size();T* tmp = new T[n];for (size_t i = 0; i < oldsize; i++){tmp[i]  = _begin[i];}delete[] _begin;_begin = tmp;_finish = tmp +oldsize;_end = tmp + n;}}void resize(size_t n, const T& value = T()){if (n < size()){_finish = _begin + n;}else{if (n > capacity()){reserve(n);}while(_finish < _begin + n){*(_finish++) = value;}}}T& operator[](size_t pos){assert(pos >= 0 && pos < size());return _begin[pos];}const T& operator[](size_t pos)const{assert(pos >= _begin && pos < _finish);return _begin[pos];}void push_back(const T& x){if (_finish == _end){reserve(capacity() == 0? 4: capacity()*2);}*_finish =  x;_finish++;}void pop_back(){assert(_begin != _finish);_finish--;}void swap(vector<T>& v){std::swap(_begin,v._begin);std::swap(_finish,v._finish);std::swap(_end,v._end);}iterator insert(iterator pos, const T& x){assert(pos >= _begin && pos <= _finish);if (_finish == _end){size_t size = pos - _begin;reserve(capacity() == 0 ? 4 : capacity() * 2);pos = _begin + size;}iterator end = _finish - 1;while (end >= pos){*(end +1) = *(end);end--;}*pos = x;_finish++;return pos;}iterator erase(iterator pos){assert(pos >= _begin && pos <_finish );iterator end = pos + 1;while (end < _finish){*(end - 1) = *(end);end++;}_finish--;return pos;}private:T* _begin = nullptr;T* _finish = nullptr;T* _end = nullptr;};
}

在这里插入图片描述

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

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

相关文章

python实现批量pdf转txt和word

文章目录 背景需求环境安装完整代码效果 背景需求 已经获取到了大量的pdf在download文件夹中&#xff0c;但是我需要的是txt文件和word文件&#xff5e; 环境安装 pip install pdf2docx pdfminer.six完整代码 # pip install pdf2docx pdfminer.siximport os from pdf2docx …

idea 基础设置

1、设置 IDEA 主题 2、自动导包和优化多余的包 3、同一个包下的类&#xff0c;超过指定个数的时候&#xff0c;导包合并为* 4、显示行号 &#xff0c; 方法和方法间的分隔符&#xff1a; 5、忽略大小写&#xff0c;进行提示 6、多个类不隐藏&#xff0c;多行显示 7、设置默认的…

sys.dm_exec_requests中statement_start_offset与statement_end_offset

文章目录 1.缘起2.根因3.示例4.附录 1.缘起 mssql中查早阻塞与及其相关联的sql时&#xff0c;遇到如下内容&#xff0c;故记录一下&#xff0c; substring(dest_blocked.text,der.statement_start_offset/21,(case when der.statement_end_offset-1 then DATALENGTH(der.sta…

TensorFlow学习:使用官方模型和自己的训练数据进行图片分类

前言 教程来源&#xff1a;清华大佬重讲机器视觉&#xff01;TensorFlowOpencv&#xff1a;深度学习机器视觉图像处理实战教程&#xff0c;物体检测/缺陷检测/图像识别 注&#xff1a; 这个教程与官网教程有些区别&#xff0c;教程里的api比较旧&#xff0c;核心思想是没有变…

分享一下怎么做多门店商城系统

随着互联网的快速发展&#xff0c;传统实体店面临着巨大的挑战。为了更好地适应市场变化&#xff0c;提高竞争力&#xff0c;多门店商城系统应运而生。这种新型的商业模式&#xff0c;旨在通过线上线下融合&#xff0c;实现门店之间的互联互通&#xff0c;提高运营效率&#xf…

【会议征稿通知】2024第四届神经网络、信息与通信工程国际学术会议(NNICE 2024)

2024第四届神经网络、信息与通信工程国际学术会议&#xff08;NNICE 2024&#xff09; 2024 4th International Conference on Neural Networks, Information and Communication Engineering 2024第四神经网络、信息与通信工程国际学术会议&#xff08;NNICE 2024&#xff0…

物理世界的互动之旅:Matter.js入门指南

本文简介 戴尬猴&#xff0c;我是德育处主任 欢迎来到《物理世界的互动之旅&#xff1a;Matter.js入门指南》。 本文将带您探索 Matter.js&#xff0c;一个强大而易于使用的 JavaScript 物理引擎库。 我将介绍 Matter.js 的基本概念&#xff0c;包括引擎、世界、物体和约束等…

CSS笔记-狂神

1、什么是CSS 如何学习 CSS是什么CSS怎么用&#xff08;快速入门&#xff09;CSS选择器&#xff08;重点难点&#xff09;美化网页&#xff08;文字&#xff0c;阴影&#xff0c;超链接&#xff0c;列表&#xff0c;渐变…&#xff09;盒子模型浮动定位网页动画&#xff08;特…

【IO面试题 二】、怎么用流打开一个大文件?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;怎么用流打开一个大文件…

手写效果流式响应(langchain+fastapi+js)

这是一个前后端完整可用的小项目 后端是 Python 的 FastAPI 框架&#xff0c;调用 langchain 进行 openai 的模型对话。前端是纯html css javascript&#xff0c;没调用任何第三方库&#xff0c;方便集成到 Vue React 等现有前端项目。 聊天界面&#xff1a; 效果就是提问之…

vue项目中定制化音频展示,wavesurfer.js基本使用

效果图&#xff1a; wavesurfer是一个可定制的音频波形可视化&#xff0c;建立在Audio API和HTML5 Canvas之上。 基本使用&#xff1a; <body><script src"https://unpkg.com/wavesurfer.js"></script><div id"waveform"></di…

软考系统架构师知识点集锦二:软件工程

一、考情分析 二、考点精讲 2.1 软件过程模型 &#xff08;1&#xff09;原型模型 典型的原型开发方法模型。适用于需求不明确的场景,可以帮助用户明确需求。可以分为[抛弃型原型]与[演化型原型] 原型模型两个阶段: 1、原型开发阶段;2、目标软件开发阶段。 &#x…

【深度学习】使用Pytorch实现的用于时间序列预测的各种深度学习模型类

深度学习模型类 简介按滑动时间窗口切割数据集模型类CNNGRULSTMMLPRNNTCNTransformerSeq2Seq 简介 本文所定义模型类的输入数据的形状shape统一为 [batch_size, time_step&#xff0c;n_features]&#xff0c;batch_size为批次大小&#xff0c;time_step为时间步长&#xff0c…

设计模式:桥接模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

上一篇《适配器模式》 下一篇《装饰器模式》 简介&#xff1a; 桥接模式&#xff0c;它是一种结构型设计模式&#xff0c;它的主要目的是将抽象部分与具体实现部分分离&#xff0c;使它们都可以独立地变化。…

Mingw下载---运行vscodeC++文件

下载 下载网址&#xff1a; https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/ 翻到最下面&#xff0c;选择win64的安装&#xff1a; 下载完&#xff0c;解压到没有空格和中文字符的路径。不然在vscode中运行不了C代码。

软考高级之系统架构师之数据流图和流程图

数据流图 概述 数据流图&#xff0c;DFD&#xff0c;用于表示业务信息系统中的数据流&#xff0c;它表达系统中的据传从输入到存储间所涉及的程序。采用图形方式来表达系统的逻辑功能、数据在系统内部的逻辑流向和逻辑变换过程&#xff0c;是结构化系统分析方法的主要表达工具…

源码推荐【源码好优多】

一、影视小程序 特点&#xff1a;可独立部署、消耗环境小、安全可靠。使用微信小程序技术开发。部署简单容易。该项目的部署需要具备微擎框架的开发以及部署能力 二、java博客管理系统 博客管理系统是一个融合线上、线下的网民在线交流管理信息化系统。它的使用为网民、运营者搭…

Flutter最全面试题大全

在理解这些问题之前&#xff0c;建议看一下Flutter架构原理&#xff0c;如下链接&#xff1a; https://blog.csdn.net/wang_yong_hui_1234/article/details/130427887?spm1001.2014.3001.5501 目录 一. 有个Text节点&#xff0c;由于文字内容过多&#xff0c;发生了溢出错误&…

三步,金蝶K3的数据可视化了

数据可视化的一大特点就是“一图胜千言”&#xff0c;没什么能比图表更直观展现数据的了。那&#xff0c;金蝶K3系统上那海量数据能不能也做成数据可视化报表&#xff1f;操作复杂吗&#xff0c;难度大吗&#xff1f; 换了别的软件来做&#xff0c;操作多、难度大是板上钉钉&a…

排序算法-堆积树排序法(HeapSort)

目录 排序算法-堆积树排序法&#xff08;HeapSort&#xff09; 1、说明 2、算法分析 3、C代码 排序算法-堆积树排序法&#xff08;HeapSort&#xff09; 1、说明 堆积树排序法是选择排序法的改进版&#xff0c;可以减少在选择排序法中的比较次数&#xff0c;进而减少排序…