【数据结构】模拟实现Vecotr
namespace my_vector
{template <class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;//常量指针,指针指向的值不可以变;//构造函数vector():start(nullptr),finish(nullptr),end_of_storage(nullptr){}//析构函数~vector(){delete[] start;start = finish = end_of_storage = nullptr; }//const T& x=T(); 这个的生命周期从一行被延长为当前作用域结束;无论是内置类型还是自定义类型都可以采用匿名形式vector(int n,const T& val=T()):start(nullptr), finish(nullptr), end_of_storage(nullptr){for (int i=0;i<n;++i){push_back(val);}}//迭代器构造函数,即便是string类的迭代器也能拷贝,只是把char类型转成int(打比方)类型,所以会造成空间浪费;
//不同类型的迭代器拷贝可能引起数据丢失和越界问题或者浪费空间等问题);//模板 template<class InputIterator>vector(InputIterator first,InputIterator last){while (first!=last){//vs库里面的迭代器不是原生指针,而是被封装好的类;push_back(*first);//这里不能用自定义类型会出现“非法寻址”的问题++first;}}//拷贝构造函数vector(const vector<T>& v){reserve(v.capacity());//浅拷贝:memcpy(start,v.start,sizeof(t)*v.size());//深拷贝for(int i=0;i<v.size();++i){start[i] = v.start[i];//里面如果是自定义类型,会调用赋值函数构造每一个对象(会自己开辟空间,在下面90行已经实现深层赋值,针对vector<t>)属于深拷贝;}finish = start + v.size();end_of_storage = start + v.capacity();}vector(initializer_list<T> i1){//常量数组结构体对象initializer_list<T> ::iterator it = i1.begin();while (it!=i1.end()){push_back(*it);++it;}}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=(vector<T> v){swap(v);return *this;}void reserve(size_t n) {//需要的空间大于原容量才进行扩容if (n > capacity()){T* tmp = new T[n];size_t sz = size();if (start)//如果原来的空间不为空,那么就直接拷贝原来所有的元素(如果是自定义类型,会两次析构);{//memcpy(tmp,start,sizeof(T)*size());for (int i=0;i<size();++i){tmp[i] = start[i];//深拷贝}delete[] start;}start = tmp;finish = tmp + sz;end_of_storage = tmp + n;}}//扩容+初始化void resize(size_t n,T val=T()){ if (n>capacity()){reserve(n);while (finish!=end_of_storage){*finish = val;++finish;}}else{if (n < size()){//删除数据finish = start + n;}}}//迭代器失效问题:野指针(扩容引起)iterator insert(iterator pos,const T& val){assert(pos<=finish);assert(pos>=start);//判断是否需要扩容if (finish==end_of_storage){ int len = pos - start;size_t newCapacity = capacity() == 0 ? 4 : capacity() * 2;reserve(newCapacity);//扩容会导致pos迭代器失效,需要更新一下;pos = start + len;}iterator end = finish - 1;while (end>=pos){*(end+1) = *end;--end;}*pos = val;++finish;return pos;//返回更改后的形参pos,让pos指向插入的元素,也就是原来指向的前一个;}iterator erase(iterator pos){assert(pos <finish);assert(pos >= start);iterator end = pos+1;while (end<finish){*(end - 1) = *end;++end;}--finish;return pos;}void push_back(const T& x){if (finish==end_of_storage){reserve(capacity()==0?4:capacity()*2); }*finish = x;++finish;}void pop_back(){assert(!empty());--finish;}bool empty(){return start == finish;}T& operator[](size_t pos)//无符号整数pos,如果pos为-1,那么就是int型正整数的最大值;{assert(pos < size());return *(start + pos);}T& operator[](size_t pos)const//无符号整数pos,如果pos为-1,那么就是int型正整数的最大值;{assert(pos < size());return *(start + pos);}//迭代器不要引用返回,因为如果++或--迭代器,vector容器里面也会更改;iterator begin() {return start;}const_iterator begin()const{return start;}iterator end() {return finish;}const_iterator end()const{return finish;}const size_t size() const{return finish - start;}const size_t capacity() const{return end_of_storage - start;}private:iterator start;iterator finish;iterator end_of_storage;};
}
相关文章:
【数据结构】模拟实现Vecotr
namespace my_vector {template <class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;//常量指针,指针指向的值不可以变;//构造函数vector():start(nullptr),finish(nullptr),end_of_storage(nullptr){}//析构函数…...
Qt开发: 利用Qt的charts模块绘制曲线、饼图、柱状图、折线图等各种图表
一、前言 Qt Charts模块是Qt提供的一个用于创建各种类型图表的功能模块。为开发人员提供了一种简单而强大的方式来可视化数据。Qt Charts模块基于Qt GUI框架构建,可以与其他Qt模块无缝集成,例如Qt Widgets、Qt Quick和Qt OpenGL。 Qt Charts模块包含了几个核心类: (1)Q…...
Redis:加速你的应用响应时间,提升用户体验
绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知。这里对 Redis 常见问题做一个总结,解决大家的知识盲点。 1、为什么使用 Redis 在项目中使用 Redis&am…...
乐鑫 SoC 内存映射入门
微控制器 (MCU) 的性能和内存能力逐步提升,其复杂度也随之加大。特别是当用户需要配置内存管理单元来映射外部存储器芯片 (Flash/SPIRAM) 时,这种现象尤其明显。 开始在乐鑫 SoC 上运行 Zephyr RTOS 时,会发现这些 SoC 与 ARM 架构的 MCU 相…...
蓝凌EIS智慧协同平台saveImg接口存在任意文件上传漏洞
蓝凌EIS智慧协同平台saveImg接口存在任意文件上传漏洞 一、蓝凌EIS简介二、漏洞描述三、影响版本四、fofa查询语句五、漏洞复现六、深度复现1、发送如花2、哥斯拉直连 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者…...
【SEC 学习】美化 Linux 终端
一、步骤 1. 进入 /etc/bash.bashrc vim /etc/bash.bashrc2. 重新加载 bash.bashrc source /etc/bash.bashrc二、各参数指标 符号含义\u当前用户的账号名称\h仅取主机的第一个名字,如上例,则为fc4,.linux则被省略\H完整的主机名称。例如&…...
【Unity小技巧】可靠的相机抖动及如何同时处理多个震动(附项目源码)
文章目录 每篇一句前言安装虚拟相机虚拟相机震动测试代码控制震动清除震动控制震动的幅度和时间 两个不同的强弱震动同时发生源码完结 每篇一句 围在城里的人想逃出来,站在城外的人想冲进去,婚姻也罢,事业也罢,人生的欲望大都如此…...
【51单片机】51单片机概述(学习笔记)
一、课程简介 1、硬件设备 51单片机开发板 Win电脑 2、软件设备 Keil5:编写程序代码 STC-ISP:下载程序 有道词典 福昕阅读器 二、开发工具介绍 1、Keil5 keil.com > 下载C51版本 > 使用破解程序 2、STC-ISP 绿色版:直接运…...
make和new的区别
make和new都是golang用来分配内存(理论上都是在堆上分配),不同的是 new分配空间只是将内存清零,并没有初始化;而make分配之后只初始化内存new为每个类型都分配,而make专用于slice、map、channew返回类型指…...
vue3获取页面路径
import { useRouter, useRoute } from vue-routerconst router useRouter()router.currentRoute.value.path // 页面路径...
基于STM32闭环步进电机控制系统设计
**单片机设计介绍,1654基于STM32闭环步进电机控制系统设计(仿真,程序,说明) 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序文档 六、 文章目录 一 概要 基于STM32的闭环步进电机控制系统设计是…...
Java中的队列:各种类型及使用场景
在Java中,队列是一种重要的数据结构,用于存储按特定顺序排列的元素。队列在多线程环境中特别有用,因为它们可以用来解决并发问题。在Java中,队列主要分为以下几种类型: 接口: Queue: 这是Java Queue接口&…...
MappingMongoConverter原生mongo 枚举类ENUM映射使用的是name
j.l.IllegalArgumentException: No enum constant com.xxx.valobj.TypeEnum.stringat java.lang.Enum.valueOf...
Java中的锁:类型,比较,升级与降级
在Java中,锁是一种用于实现并发控制的重要工具。在多线程环境中,锁可以确保数据的一致性和完整性。Java提供了多种类型的锁,包括内置的synchronized关键字,ReentrantLock类以及更高级的并发工具,如StampedLock和ReadWr…...
STM32:串口轮询模式、中断模式、DMA模式和接收不定长数据
一.串口轮询模式底层机制: 在STM32每个串口的内部都有两个寄存器:发送数据寄存器(TDR)/发送移位寄存器,当我们调用HAL_UART_Transmit 把数据发送出去时,CPU会将数据依次将数据发送到数据寄存器中,移位寄存器中的数据会根据我们设置…...
【OJ for Divide and Conquer】OJ题解
文章目录 A - Ultra-QuickSortB - Hanoi Tower Troubles Again! [找规律递归]C - Fibonacci Again[找规律]E - [Fire Net](https://programmerall.com/article/7276104269/)[DFS 搜索 ⭐⭐]F - Gridland[找规律]G - Maximum Subarray Sum[动态规划/分治..经典⭐]I - Quoit Desi…...
使用 Sealos 一键部署 Kubernetes 集群
Sealos 是一款以 Kubernetes 为内核的云操作系统发行版,使用户能够像使用个人电脑一样简单地使用云。 与此同时,Sealos 还提供一套强大的工具,可以便利地管理整个 Kubernetes 集群的生命周期。 Sealos 不仅可以一键安装一个单节点的 Kubern…...
解读电力系统中的GPS北斗卫星同步时钟系统
随着电力系统的快速发展,变电站中的各类系统 :计算机监控系统、水情测报系统、视频监控系统 状态监测系统 生产信息管理系统等,各类装置:继电保护装置、故障录波装置、PMU装置、事件顺序记录SOE功能越来越强大,需要采集、记录的数…...
原子类:Java并发编程的利器
在多线程环境下,确保数据的一致性和原子性是至关重要的。Java提供了一些原子类,用于解决多线程并发问题。这些原子类能够确保操作在多线程环境下是原子的,即不会被其他线程干扰。本文将介绍Java中的原子类及其应用。 一、原子类概述 原子类…...
99%网工都会遇到的经典面试问题
①问题:介绍TCP连接的三次握手?追问:为什么TCP需要握手三次? 三次握手: 第一步:A向B发送一个SYN报文表示希望建立连接 第二步:B收到A发过来的数据包后,通过SYN得知这是一个建立连接的请求,于是发送ACK确认,由于TCP的全双工模式ÿ…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
