vector的实现和使用中的常见错误

news2025/1/18 10:08:58

文章目录

  • 实现构造函数时的调用模糊
  • 实现insert函数时的迭代器失效
  • 使用erase函数时的迭代器失效
  • 实现reserve函数使用memcpy函数导致的浅拷贝

实现构造函数时的调用模糊

image-20230106165740725

vector的构造函数有这四种,其中有两种在实例化的时候会有调用模糊的问题:

vector<int> v(10, 3); 

该代码的意义是:实例化一个vector对象,该对象有10个元素,每个元素是int类型的3。如果用我们自己实现的vector来执行上述代码时可能会发生错误。

image-20230106173741307

因为该代码的原意是调用fill(2)函数,但实际上调用的是range(3)函数,因为我们的参数10和3都是int类型,而fill(2)的两个参数类型分别是size_type和const value_type&,range(3)的两个参数类型都是InputIterator。编译器在选用构造函数的时候会更倾向于选择range(3),而该构造函数内部会对迭代器进行解引用,当传入两个int解引用时就会报错。

STL库中的做法是这样的:重载更适合的参数类型的构造函数。

image-20230106170901671

实现insert函数时的迭代器失效

image-20230106171746146

在使用insert函数时会传参数position,但是该函数内部是非常有可能进行扩容的。扩容会开辟新的内存、释放旧的内存,然后指向新的内存,但此时由于position仍旧指向旧的内存,就会发生迭代器失效问题。

image-20230106175052107

正确的做法是这样的:用变量先记录下position的偏移量,当扩容之后再利用偏移量更新position。

截屏2023-01-06 17.57.13

使用erase函数时的迭代器失效

image-20230106171807038

使用erase函数也会传参数position,它的返回值也是iterator。

当该函数删除position位置上的数据后,由于vector是个数组,所以该位置后面的元素会向前移动,就会导致position位置上仍有数据,linux下g++就是这样实现的。但Visual Studio并不是这样实现的,它的底层迭代器被封装成了类,一但该位置上的数据发生变化,该迭代器就会作废。这就是同一问题的两种编译器的不同做法,所以为了统一,普遍认为即使在g++下该情况也是迭代器失效。

正确的使用方法是:

image-20230106181322157

实现reserve函数使用memcpy函数导致的浅拷贝

image-20230106181611193

该函数是vector进行扩容的函数,扩容之后肯定会把原数组里的数据拷贝到新数组里,有些人这时会用memcpy函数,这时就会出错了。

对于内置类型,这里用memcpy函数没什么问题,但是对于自定义类型来说,用memcpy就会出错,因为memcpy只是按照字节拷贝数组里的数据,进行的是浅拷贝,例如:

image-20230106182747866

所以这里不能够用memcpy,这里就应该一步一步的用旧对象的数据来初始化新对象。

正确的做法如下:

image-20230106182911673

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

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

相关文章

SpringBoot自定义配置的提示

文章目录1. 引入依赖2. 开启 IDEA 配置3. 使用 ConfigurationProperties 自定义配置4. 编译项目&#xff0c;自动生成 spring-configuration-metadata.json 文件文件中的属性值介绍5. 可以看到有提示了官方文档&#xff1a;https://docs.spring.io/spring-boot/docs/2.2.2.RELE…

机器视觉(七):图像分割

目录&#xff1a; 机器视觉&#xff08;一&#xff09;&#xff1a;概述 机器视觉&#xff08;二&#xff09;&#xff1a;机器视觉硬件技术 机器视觉&#xff08;三&#xff09;&#xff1a;摄像机标定技术 机器视觉&#xff08;四&#xff09;&#xff1a;空域图像增强 …

whistle的使用【前端抓包】

前言 抓包工具看起来只是测试要用的东西&#xff0c;其实对前端作用也很多&#xff0c;因为我们也要模拟请求、mock数据、调试。站在巨人肩膀上永远不亏! whistle能解决的痛点 一、看请求不方便 跳页、支付时候上一页的请求结果看不到&#xff0c;h5、小程序newWork不能在电…

Raki的读paper小记:Continual Learning of Natural Language Processing Tasks: A Survey

第一次写综述的小记&#xff0c;也将是我读完的第一篇综述&#xff08; 最开始因为可乐老师的原因&#xff0c;接触到了持续学习&#xff0c;然后从一开始的音频到自己读了一些ICLR的paper找idea做NLP的持续学习&#xff0c;然后做了自己第一个粗糙的工作&#xff0c;在杰哥的…

Hadoop高手之路9-Azkaban工作流管理器

文章目录Hadoop高手之路9-Azkaban工作流管理器一、工作流概述1. 工作流简介2. 常见的工作流调度工具1) Azkaban2) Oozie二、Azkaban简介1. Azkaban组成结构2. Azkaban的部署模式1) solo-server mode&#xff08;独立服务器模式&#xff09;2) two server mode&#xff08;双服务…

8Manage SRM:使用采购管理软件进入现代化模式

在企业运营发展中&#xff0c;采购组织一直是一个非常重要的部门&#xff0c;它会直接影响企业的采购成本效益。在采购活动中&#xff0c;如果采用传统线下的采购方式&#xff0c;容易导致采购信息不集中&#xff0c;效率低&#xff0c;出错率高&#xff0c;最终损害企业的利益…

社区发现系列02-算法介绍

hello, 大家好&#xff0c;欢迎来到阿君聊风控&#xff0c;我是阿君&#xff08;一名有7年互金和电商风控经验的算法工程师&#xff09;。在上篇文章https://blog.csdn.net/u010569893/article/details/128565829?spm1001.2014.3001.5502 中我们了解到可以用社区发现技术来对图…

全面兼容各端的动画库PAG,对标Lottie

感谢Tencent 开源了PAG库&#xff0c;终于有了国人自己的动画库了&#xff0c;该库兼容&#xff1a;移动端&#xff0c;桌面端&#xff0c;&#xff0c;WEB端&#xff0c;还有小程序端&#xff0c;真可谓用心了&#xff0c;而且PAG库相对其他库&#xff0c;使用的pag文件更小&a…

《UEFI内核导读》SecCore与PeiCore简介(I)

敬请关注&#xff1a;“固件C字营 SecCore也被称之为VTF&#xff0c;被映射到Boot Firmware Volume (BFV)&#xff0c;BFV的地址被放置在0xFFFFFFE0连续的4个字节&#xff08;小端模式&#xff09;。 SecCore 是一个FFS firmware file&#xff0c;其文件末端地址与于BFV的末端…

磨金石教育摄影技能干货分享|摄影拼贴技法的运用与效果

河南省-黄阳惠智-《那是山吗》画面中是一片群山景象。我们看上去感觉像是画出来的&#xff0c;又像是电脑做的图。其实这是摄影师用了中国山水画的特有表现手法&#xff0c;对桂林山水的景象&#xff0c;进行了拼贴在创造。作者用一些非山非水的现代物品&#xff0c;像织女一样…

【记录一】gis理论

gis地图相关一、gis 理论知识二、fianlshell连接服务器连接服务器命令行记录三、geoserver地图服务器初识geoserver添加新图层最近图层样式修改图层样式新增编辑图层的样式四、git上传代码查看远程地址上传代码时新建tag一、gis 理论知识 二、fianlshell连接服务器 连接服务器…

【小知识点】免费头像API,用 Python Flask 动态生成一个汉字头像

本案例是 爬虫训练场 项目的衍生案例&#xff0c;用于渲染用户头像&#xff0c;大家也可以将该接口用于其它目的。 本文会使用随机汉字生成技术&#xff0c;如未掌握&#xff0c;可以查看 Python 随机生成一个汉字 文章目录基础环境配置加载本地 txt 文件&#xff0c;用于随机生…

打包安卓apk后的V1和V2签名

前言&#xff1a;打包apk后上架之前需要进行加固&#xff0c;加固后生成的apk文件需要进行重新签名&#xff1b;单独的apk文件可以使用基于JDK&#xff08;需要安装java jdk&#xff09;和SDK&#xff08;需要下载android studio 开发工具&#xff09;的命令进行手动签名。安装…

【Maven】核心概念

Maven的核心概念一、Maven工程中约定的目录结构二、仓库管理&#x1f3b6;仓库的概述&#x1f3b6;仓库的分类本地仓库所在位置的设置重写更改本地仓库路径&#xff0c;不使用默认路径有什么好处呢&#xff1f;&#x1f3b6;Maven对仓库的使用三、POM工程的唯一标识依赖&#x…

数据结构与算法:泛型初学习

1.包装类 java中的数据类型int&#xff0c;double等不是对象&#xff0c;无法通过向上转型获取到Object提供的方法&#xff0c;而像String却可以&#xff0c;只因为String是一个对象而不是一个类型。基本数据类型由于这样的特性&#xff0c;导致无法参与转型&#xff0c;泛型&…

【服务器数据恢复】Raid5丢失一块盘被重建的数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器上5块硬盘组建raid5磁盘阵列&#xff0c;用于存储公司数据&#xff0c;无备份。 服务器故障&分析&#xff1a; 服务器上一块硬盘故障掉线&#xff0c;用户聘请一家运维公司对服务器进行维护&#xff0c;运维公司技术人员在没有了…

redis 基础

Redis学习笔记配置文件启动redis与redis进行交互redis命令Redis通用命令keys 查看所有符合模板的keytype 查看这个key的存储类型![在这里插入图片描述](https://img-blog.csdnimg.cn/175e3a5c1b064ce09b9b47cc1c7b34f9.png)del 删除一个keyexists 判断一个Key是否存在ttl 查看一…

HummerRisk V0.8.0:新增金山云、K8s基准检测、源IP审计分析等

HummerRisk V0.8.0发布&#xff1a;多云检测支持金山云、K8s检测新增CIS Benchmark 功能 、操作审计增加源 IP 分析功能、主机检测增加Linux 检测规则。同时优化 operator及Benchmark 的自动/手动安装&#xff0c;优化多个结果展示页面等。 感谢社区中小伙伴们的反馈&#xff…

整型常量不同进制间的相互转换

整型常量可以分别用二进制、八进制、十进制和十六进制表示&#xff0c;不同的进制并不影响数据本身的大小&#xff0c;同一个整型常量可以在不同进制之间转换&#xff0c;具体转换方式如下。 1.十进制和二进制之间的转换 (1)十进制转二进制 十进制转换成二进制就是一个除以2…

实验用试剂mPEG-PDLLA介绍;甲氧基聚乙二醇-聚DL-丙交酯 嵌段共聚物

PLA-MPEG、peg-pla、mPEG-PDLLA 甲氧基聚乙二醇-聚乳酸、甲氧基聚乙二醇-聚DL-丙交酯 结构式&#xff1a; 【详情】 化学式&#xff1a;CH3(C2H4O)m (C6H10O2)n 溶剂&#xff1a;氯仿、二氯甲烷、丙酮、DMF、DMSO等有机溶剂。 性状&#xff1a;半固体或固体&a…