当前位置: 首页 > news >正文

从零开始的C++(十一)

vector的模拟实现:

1.构造函数:

vector(){}vector(int n, const T& value = T()){   reserve(n);for (int i = 0; i < n; i++){push_back(value);}}template<class InputIterator>vector(InputIterator first, InputIterator last){  auto it = first;while (it != last){push_back(*it);it++;}}void swap(iterator&v1,iterator&v2){iterator ret = v1;v1 = v2;v2 = ret;}vector(const vector<T>& v){vector<T>tmp(v.cbegin(), v.cend());swap(_start,tmp._start);swap(_finish, tmp._finish);swap(_endOfStorage, tmp._endOfStorage);}
       private:iterator _start = nullptr; // 指向数据块的开始iterator _finish = nullptr; // 指向有效数据的尾iterator _endOfStorage = nullptr; // 指向存储容量的尾

对象的成员使用了参数列表,防止随机值引发异常。同时,对于传同类型对象的构造函数,复用了传迭代器的构造函数创建临时对象,然后交换this所指对象和临时对象的成员的值,防止浅拷贝,并且利用临时变量销毁原本this对象的成员的内容。

2.赋值重载:

     vector<T>& operator= (vector<T> v){swap(_start, v._start);swap(_finish, v._finish);swap(_endOfStorage, v._endOfStorage);return *this;}

赋值重载的原理和拷贝构造类似,都是用临时对象交换赋值,此处不用创建临时对象的原因是在实参到形参的过程已经进行了拷贝构造,即此处形参就是临时对象,所以直接交换即可。

3.插入和删除

  void push_back(const T& x){if (size() == capacity()){reserve(size() * 2+1);}*(_finish) = x;_finish++;}void pop_back(){assert(size() > 0);_finish--;}void swap(vector<T>& v){swap(_start, v._start);swap(_finish, v._finish);swap(_endOfStorage, v._endOfStorage);}iterator insert(iterator pos, const T& x){   assert(pos-_start <= size());assert(pos - _start>= 0);if (size() == capacity()){  int sz = pos - _start;reserve(size() * 2+1);pos = _start + sz;}auto it = _finish-1;while (it >= pos){*(it + 1) = *it;it--;}*pos = x;_finish++;return pos;}iterator erase(iterator pos){   assert(pos-_start >= 0);assert(pos-_start < size());auto it = pos+1;while (it != _finish){*(it - 1) = *(it);it++;}--_finish;return pos;}

需要注意的是,insert和erase都可能会造成迭代器失效(即迭代器使用结果可能未定义或无法使用)。同时也需要注意判断插入、删除是否合理(是否越界等)。

4.扩容

void reserve(size_t n){if (n >capacity()){    int sz = size();iterator tmp = new T[n];if (_start!=nullptr){//值拷贝for (int i = 0; i < sz; i++){tmp[i] = _start[i];}}delete[]_start;//更新_start = tmp;_endOfStorage = _start + n;_finish = _start + sz;}}void resize(size_t n, const T& value = T()){if (n <=size()){_finish = _start + n;}else{reserve(n);while (size() < n){push_back(value);}}}

扩容应注意是深拷贝,因为成员可能是自定义类型,有自己的析构函数,如果是浅拷贝可能会出现二次delete的情况,也可能会出现析构导致内容变成随机值无法正常使用。

相关文章:

从零开始的C++(十一)

vector的模拟实现&#xff1a; 1.构造函数&#xff1a; vector(){}vector(int n, const T& value T()){ reserve(n);for (int i 0; i < n; i){push_back(value);}}template<class InputIterator>vector(InputIterator first, InputIterator last){ auto it …...

驱动开发day2

通过物理内存映射为虚拟内存 实现三盏LED灯亮灯灭 head.h #ifndef __HEAD_H__ #define __HEAD_H__#define PHY_LED1_MODER 0X50006000 #define PHY_LED1_ODR 0X50006014 #define PHY_RCC 0x50000A28#define PHY_LED2_MODER 0X50007000 #define PHY_LED2_ODR 0X50007014#defin…...

【CANoe】文件处理_hex文件读取解析

hex文件里面只有00&#xff0c;01&#xff0c;04三种码。那么我们在解析的时候只需要对这三种不同状态的进行不同的解析即可。 hex文件格式的解析&#xff0c;可阅读&#xff1a;HEX文件格式详解 首先创建一个Block的结构体&#xff0c;根据经验我们知道&#xff0c;一个数据…...

人脸识别顶会论文及源码合集,含2023最新

今天和大家聊聊人脸识别。 人脸识别的技术经过不断发展已经相当成熟&#xff0c;在门禁、监控、手机解锁、移动支付等实际场景都能看到。我们比较熟悉的识别方式是基于可见光图像的人脸识别&#xff0c;这种方式有个非常明显的缺点&#xff1a;光线限制。 在近两年的人脸识别…...

介绍drawio和图表使用场景

图表介绍 drawio是一个基于Web技术的草图、简图和图表的解决方案。 drawio支持在线编辑器&#xff0c;app.diagram.net.并支持不同的操作系统的桌面版离线安装版本。如&#xff1a;windows, linux, macOS。 对于个人或者团队&#xff0c;把图表绘制的安全放到第一位&#xff…...

leetcode-1438: 绝对差不超过限制的最长连续子数组

给你一个整数数组 nums &#xff0c;和一个表示限制的整数 limit&#xff0c;请你返回最长连续子数组的长度&#xff0c;该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。 如果不存在满足条件的子数组&#xff0c;则返回 0 。 示例 1&#xff1a; 输入&#x…...

【数据结构初阶】九、排序的讲解和实现(直接插入 \ 希尔 \ 直接选择 \ 堆 \ 冒泡 -- C语言)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【数据结构初阶】八、非线性表里的二叉树&#xff08;二叉树的实现 -- C语言链式结构&#xff09;-CSDN博客 排序 排序的概念 所谓排序&#xff0c;就是使一串记录&#xff0c;按照…...

uview组件使用笔记

图标样式 修改图标的样式 通过color参数修改图标的颜色通过size参数修改图标的大小&#xff0c;单位为rpx 效果图 <u-icon name"photo" color"#2979ff" size"28"></u-icon>图片图标 1.3.0 这里说的图片图标&#xff0c;指的是小…...

Linux1024一篇通俗易懂的liunx命令操作总结(第十课)

Linux1024一篇通俗易懂的liunx命令操作总结(第十课) 一 liunx 介绍 Linux是一种免费开源的操作系统&#xff0c;它的设计基于Unix。它最早是由芬兰的一位大学生Linus Torvalds在1991年开始编写的&#xff0c;取名为Linux。Linux具有高度的灵活性和可定制性&#xff0c;可以在…...

nuxt使用i18n进行中英文切换

中文效果图&#xff1a; 英文效果图&#xff1a; 版本&#xff1a; 安装&#xff1a; npm install --save nuxtjs/i18n 新建en.js与zh.js两个文件进行切换显示 en.js内容 import globals from ./../js/global_valexport default {/******* 公共内容开始* *****/seeMore: &quo…...

机器人制作开源方案 | 行星探测车实现WiFi视频遥控功能

1. 功能描述 本文示例所实现的功能为&#xff1a;用手机APP&#xff0c;通过WiFi通信遥控R261样机行星探测车移动&#xff0c;以及打开、关闭行星探测车太阳翼。 2. 电子硬件 在这个示例中&#xff0c;我们采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板 Basra主控…...

Angular main 中的enableProdMode

enableProdMode一次深度解析 在Angular的开发过程中&#xff0c;我们经常会遇到一个名为enableProdMode的设置。这个设置位于Angular的主模块&#xff08;main module&#xff09;中&#xff0c;它的主要作用是启用生产模式。那么&#xff0c;什么是生产模式&#xff1f;为什么…...

驱动day2:LED灯实现三盏灯的亮灭

head.h #ifndef __HEAD_H__ #define __HEAD_H__ #define PHY_PE_MODER 0x50006000 #define PHY_PF_MODER 0x50007000 #define PHY_PE_ODR 0x50006014 #define PHY_PF_ODR 0x50007014 #define PHY_RCC 0x50000A28#endif 应用程序 #include <stdio.h> #include <sys/…...

Android 编译错误:module xxx1 missing dependencies:xxx2

编译错误log module xxx1 missing dependencies&#xff1a;xxx2 分析方向 1.缺少依赖库 添加依赖库 shared_libs: ["libhidlbase","libhidltransport","libhwbinder","liblog","libutils","libcutils",],2.缺…...

使用EasyExcel实现Excel导入导出

介绍 EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 他能让你在不用考虑性能、内存的等因素的情况下&#xff0c;快速完成Excel的读、写等功能。 快速&#xff1a;快速的读取excel中的数据。 简洁&#xff1a;映射excel和实体类&#xff0c;让…...

京东手机销售数据:2023年9月京东手机行业TOP10品牌排行榜

鲸参谋监测的京东平台9月份手机市场销售数据已出炉&#xff01; 9月份&#xff0c;手机市场销售整体呈现下滑。鲸参谋数据显示&#xff0c;今年9月&#xff0c;京东平台手机销量为300万&#xff0c;环比下降约20%&#xff0c;同比下降约18%&#xff1b;销售额为92亿&#xff0c…...

常量字符串

一、常量字符串是什么&#xff1f; 常量字符串是一个常量&#xff0c;它的值是首字符的地址 比如 "abcdefg" 或 "123456789" 就是常量字符串 二、常量字符串与普通字符串的区别 1.常量字符串不可更改&#xff0c;而普通字符串可以更改 利用memcpy内存…...

【活体检测】“深度学习驱动的人脸反欺诈检测系统:性能提升与多模型支持“

微调小视科技开源静默活体检测模型加载方式&#xff0c;性能提升8倍 I. 引言 在当今数字化时代&#xff0c;人脸反欺诈检测在各种应用中发挥着重要作用&#xff0c;从人脸识别到金融欺诈检测。为了满足不断增长的需求&#xff0c;深度学习技术已成为关键工具&#xff0c;但性…...

Howler.js HTML5声音引擎

介绍 Howler.js是一个不错的HTML5声音引擎。功能强大&#xff0c;性能不错&#xff0c;用起来也很方便。 1. 官网 https://howlerjs.com/ GitHub https://github.com/goldfire/howler.js 2. 兼容性 Howler默认使用Web Audio&#xff0c;但在IE上可以自动转为HTML 5 Audio。这…...

centos 7.9每天定期发送最新备份文件到另外一台服务器

1.需求 在本地化部署的过程中&#xff0c;为了使系统相对来说高可用&#xff0c;一般情况下&#xff0c;我们都会做一个负载&#xff0c;但是客户又会考虑成本&#xff0c;所以只有可怜巴巴的两台服务器&#xff0c;要全部服务都做负载&#xff0c;这个就实现不了。所以只能把…...

告别Electron!用Qt QWebEngine + QWebChannel 打造高性能桌面混合应用(附完整Demo)

突破Electron性能瓶颈&#xff1a;Qt QWebEngine与QWebChannel混合开发实战指南 在桌面应用开发领域&#xff0c;Electron框架凭借其跨平台特性和Web技术栈的易用性长期占据主导地位。然而随着应用复杂度提升&#xff0c;Electron的内存占用高、启动缓慢和包体积庞大等问题逐渐…...

用STC89C52RC和HC-05蓝牙模块,DIY一个带转向灯和蜂鸣器的智能小车电机驱动板(附完整代码)

基于STC89C52RC的智能小车驱动系统开发实战 项目背景与核心功能 智能小车作为嵌入式开发的经典练手项目&#xff0c;融合了电机控制、无线通信、传感器反馈等多个技术模块。本次项目以STC89C52RC单片机为核心控制器&#xff0c;通过HC-05蓝牙模块实现无线遥控&#xff0c;采用I…...

软件因果图管理中的根因分析者

在软件开发和运维过程中&#xff0c;因果图管理是一种用于识别和解决复杂问题的有效方法。而根因分析者&#xff08;Root Cause Analyst&#xff09;则是这一过程中的核心角色&#xff0c;他们通过系统化的方法追溯问题的源头&#xff0c;确保类似问题不再发生。随着软件系统规…...

智读致用|《一人企业》第五章:价值观锚定,小而美地行动

系列&#xff1a;《一人企业》读书笔记 第5篇 书名&#xff1a;《一人企业&#xff1a;一个人也能赚钱的商业新模式》 作者&#xff1a;保罗贾维斯&#xff08;Paul Jarvis&#xff09; ---很多人创业的起点是一个想法&#xff0c;或者一股热情。 想法很快就有了&#xff0c;…...

2026届毕业生推荐的五大AI学术神器推荐榜单

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在人工智能辅助写作的场景里&#xff0c;“降AI指令”是这种提示方法&#xff0c;它被用来降…...

TMSpeech:Windows本地实时语音转文字工具,让你的会议记录效率提升300%

TMSpeech&#xff1a;Windows本地实时语音转文字工具&#xff0c;让你的会议记录效率提升300% 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 还在为会议记录手忙脚乱&#xff1f;担心云端语音识别泄露隐私&#xf…...

保姆级教程:给EMQX加个‘马甲’,搞定微信小程序MQTT真机连接

微信小程序MQTT真机连接实战&#xff1a;Nginx反向代理的深度配置指南 微信生态下的物联网开发常面临一个独特挑战&#xff1a;在开发者工具中运行正常的MQTT连接&#xff0c;切换到真机环境却频繁报错。这种现象背后隐藏着小程序安全策略与WebSocket协议的微妙冲突。本文将彻底…...

Petalinux 2020.1 QSPI启动踩坑记:手把手教你解决‘Bad data crc’和分区超限问题

Petalinux 2020.1 QSPI启动深度排障指南&#xff1a;从CRC校验到分区优化的完整实战 当ZynqMP平台遇上Petalinux 2020.1&#xff0c;QSPI FLASH启动往往会成为工程师的"噩梦现场"。那些看似简单的Bad data crc报错背后&#xff0c;隐藏着从Distro Boot机制到Flash物理…...

STM32CubeIDE定时器PWM实战:从驱动舵机到控制电机转速,一份配置通吃

STM32CubeIDE定时器PWM实战&#xff1a;从驱动舵机到控制电机转速 在嵌入式开发中&#xff0c;PWM&#xff08;脉冲宽度调制&#xff09;技术就像一位无声的指挥家&#xff0c;精确控制着各种执行器的动作节奏。无论是机器人关节的灵活转动&#xff0c;还是无人机螺旋桨的稳定转…...

多智能体与视觉大模型驱动的学术海报自动化生成:Paper2Poster项目实战

1. 项目概述&#xff1a;从论文到海报的自动化革命如果你是一名科研人员、研究生&#xff0c;或者经常需要参加学术会议&#xff0c;那么制作学术海报这件事&#xff0c;大概率是你科研生涯中既耗时又费力&#xff0c;还常常让人感到“审美无能”的环节。一篇动辄十几页、包含复…...