C++模拟实现vector

news2024/11/23 12:04:55

目录

1.代码实现

2.注意事项

1.成员变量

2. 不能使用memcpy函数拷贝数据

1.用string类型测试时,要考虑到vs可能把数据存储在数组buffer里面

3.insert函数中指针的失效性

1.加引用,那么就不能传常量,比如v.begin() + 3

2.加引用,就只能传变量了

 4.erase成员函数的指针的失效性


1.代码实现

2.注意事项

1.成员变量

这边以作者目前的能力,还不知道为什么不想string类一样,弄头指针,size, capacity成员变量一样,所以也只能目前跟着底层小小的模拟实现一下。

2. 不能使用memcpy函数拷贝数据

 如果使用memcpy函数拷贝,如果是vector<内置类型>倒也没有问题,但是如果是自定义类型,比如string类型,那么memcpy只会浅拷贝一下,就是之间原封不动的拷贝一下,那么_str的指针也是一样的,那么下一步delete[]_start就已经把_str给释放掉了,那么再调用就会出错了。

1.用string类型测试时,要考虑到vs可能把数据存储在数组buffer里面

有些人看了我上面说自定义类型不可以,比如string类型,有些人就像自己尝试一下。但是vs在string类型中做了小小的优化。它的成员变量不仅仅有_str, _size, _capacity。vs把string做了优化,他认为我们在调用得时候大部分都是很小的字符串,他就用一个数组存储起来了。

        你可以用你vs软件测试一下,创建一个string类型,比如string s, 然后再sizeof(s),看看其大小。不同系统还不一样,2019是28,说明存储了16字节大小的数组。16 + 8(_str) + 4(_size) + 4(_capacity).但2022就是40, 我想应该存储了32个字节,优化时,扩大了一倍。

        (Liunx系统下的g++软件,答案是8,还有待我去探索,我会更新)

3.insert函数中指针的失效性

在插入时,输入的是原地址的pos,但是如果插入后的内存不够,就会扩容,这边的扩容是是不会在原来的位置扩容的,所以pos的值会变化,所以我们在函数外应用的形参pos就会失效。但有些人就会说了,那为什么不用引用呢?

1.加引用,那么就不能传常量,比如v.begin() + 3

        有人还说,加个const不就好了,那就本末倒置了,pos是要改变的,所以底层就只能弄一个返回值,让你接收他。

2.加引用,就只能传变量了

引用是不可以传任何带计算的。v.begin()就不可以作为形参传值了。做个简单的例子。

 4.erase成员函数的指针的失效性

原理和insert一样,为什么要分开来说呢,有人说,如果不是删除最后一个,那么其他删除,pos肯定有效的值,是可以拜访的。但是由于vs系统做了检查,所以就完全不可以用的。但是Linux下g++系统是允许再次拜访的。但是重点来了,代码要有一个性质就是:可移植性!!!

所以这边建议不用erase后的pos指针!

 

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

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

相关文章

C#委托相关知识

最开始学习C#的时候&#xff0c;简单的看过委托&#xff0c;最近工作中经常需要使用到委托。这篇笔记是对之前看过的委托的一个补充&#xff0c;也是对最近工作中遇到的委托的一个总结吧。 这里使用的是窗体程序作为例子。实例在文末&#xff0c;可下载。 委托是一个类&#xf…

【动手学深度学习】--15.含并行连结的网络GoogLeNet

文章目录 含并行连结的网络GoogLeNet1.Inception块2.GoogLeNet模型3.训练模型 含并行连结的网络GoogLeNet 学习视频&#xff1a;含并行连结的网络 GoogLeNet / Inception V3【动手学深度学习v2】 官方笔记&#xff1a;含并行连结的网络&#xff08;GoogLeNet&#xff09; 1.…

【智能交互】OPPO接入小布语音技能通关教程:个人开发者实现接口调用

目录 前言实际操作注册OPPO平台账号打开创建技能界面创建技能创建意图槽位解析对话管理对话测试接口代码编写接口创建新建意图对话管理测试猜想测试相关文档前言 适用人群:本教程适合大赛接入小布语音技能的同学以及初次使用小布助手的开发者 本篇文章是博主弄了多次测试才勉…

勒索花样繁多,“Sophos Encrypt”披马甲进行勒索攻击

近日&#xff0c;网络安全供应商Sophos发表声明&#xff0c;称Sophos被一款名为“Sophos Encrypt”新型勒索软件冒充&#xff0c;该勒索软件进行攻击时会冒用Sophos品牌名称&#xff0c;并将用户重要文件进行加密以勒索赎金。 现在的勒索软件类型多样&#xff0c;令企业防不胜防…

LeetCode·每日一题·874. 模拟行走机器人·哈希

作者&#xff1a;小迅 链接&#xff1a;https://leetcode.cn/problems/walking-robot-simulation/solutions/2350184/ha-xi-biao-zhu-shi-chao-ji-xiang-xi-by-x-20cg/ 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 著作权归作者所有。商业转载请联系作者获得授权&am…

【iPaaS干货分享】大型企业都在用的新一代SAP集成方式,你了解吗?

目录 目前企业实现SAP集成的主要方式 一、使用SAP PI/PO实现SAP与外部系统的集成 二、使用自开发方式 SAP新一代集成方式——基于iPaaS SAP连接器 一、分钟级实现SAP系统的集成 二、统一集成接口及安全管理 三、可视化编排改造SAP接口 SAP&#xff08;Systems, Applicatio…

GO语言方法集

实际上,这里 那为什么还要生产包装方法呢?主要是为了支持接口. 接口不能直接使用接收者为值类型的方法.因为我们A(a)接受者是第一个参数,而这个参数是动态派发的,参数放在栈的局部变量,编译器在编译阶段不能确定这个量的大小.而指针平台确定了大小也就确定了.面对这个问题,编译…

如何使用MATLAB软件完成生态碳汇涡度相关监测与通量数据分析

MATLAB MATLAB是美国MathWorks公司出品的商业数学软件&#xff0c;用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人&#xff0c;控制系统等领域。 [1] MATLAB是matrix&laboratory两个词的组合&#xff0c;意为矩阵工厂&a…

Java List集合 -- 最常用的两种排序方法

现在有一个类 public class Person {private int id;private int age;private String name;public Person(int id, int age, String name) {this.id id;this.age age;this.name name;}public int getId() {return id;}public int getAge() {return age;}public String getN…

149206-86-0,DOTA GGGA,双功能螯合物,修饰在多肽上的螯合剂

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ 规格单位&#xff1a;g |货期&#xff1a;按照具体的库存进行提供 | 纯度&#xff1a;95%| PART1-------试剂描述&#xff1a; 螯合剂Dota-ggga&#xff08;CAS号&#xff1a;149206-86-0&#xff09;&#xff0c;螯合…

skbuff.h在哪

今天看来下底层socket的实现&#xff0c;发现很多人都说有个skbuff结构&#xff0c;我就想着去找下这个&#xff0c; cat /include/linux/skbuff.h 结果找不到&#xff0c;查了下&#xff0c;需要下载内核源码 //Ubuntusudo apt install linux-headers-genericdpkg -S skbuff.…

Linux系统配置Node.js环境详细教程(图文讲解)

前言&#xff1a;在使用Jenkins部署Vue项目的时候&#xff0c;如果没有安装Node.js环境的话&#xff0c;Jenkins会无法对Vue项目进行构建&#xff0c;所以本期出了一篇关于在Linux系统如何配置Node.js环境的讲解&#xff0c;以博客的方式记录一下我详细的配置流程和踩过的坑&am…

包的使用及其创建

文章目录 前言类名冲突完整的类路径创建包导入类包总结 前言 java语言中&#xff0c;包在整个管理过程中发挥了重要的作用。使用包&#xff0c;可以有效地管理繁多的类文件&#xff0c;解决了类名重复的问题。在类中应用包和权限修饰符&#xff0c;可以控制他人对类成员的方法的…

旅游卡系统加盟代理软件开发

旅游行业的不断发展&#xff0c;越来越多的旅行社开始推出各种优惠卡来吸引游客。而随着智能手机的普及&#xff0c;开发一款旅行社优惠卡APP软件成为了一种必然的趋势。 该软件的主要功能是提供旅行社的各种优惠卡信息&#xff0c;包括优惠卡的种类、价格、使用范围、有效…

【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 螺旋矩阵 II

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏&#xff0c;今天将为大家带来螺旋矩阵的分享✨ 目录 前言59. 螺旋矩阵 II54. 螺旋矩阵总结 59. 螺旋矩阵 II 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n…

用微服务架构推进企业数字化转型升级

随着数字化转型进入深水区&#xff0c;企业应用程序建设需求急剧增长且变化多端&#xff0c;软件架构经历了单体结构、垂直架构、SOA架构&#xff0c;发展到了现在的微服务架构。 单体架构目前应用较多&#xff0c;部署容易&#xff0c;但单体式应用内部包含了所有需要的服务&…

四、DML-3.数据操作-删除

delete不能删除某个字段的值 若要删除某个字段的值&#xff0c;用update&#xff0c;将该字段设置为null 原数据表&#xff1a; 一、案例一 删除gender为女的员工 delete from employee where gender 女; 步骤一&#xff1a;输入delete命令并执行&#xff1a; 步骤二&#…

【Python】通过第三方库wxauto自动化操作微信电脑客户端

文章目录 一.简介二.wxauto提供的函数1.WxUtils类功能函数&#xff1a;2.WeChat类主要函数&#xff1a; 三.使用四.遇到的问题 一.简介 wxauto是一个Python第三方库&#xff0c;用于自动化操作微信电脑客户端通过wxauto&#xff0c;我们可以使用Python编写脚本&#xff0c;实现…

如何自学网络安全(黑客)

自学网络安全&#xff08;黑客&#xff09;需要掌握一系列的技能和知识&#xff0c;以下是一些学习网络安全的步骤&#xff1a; 基础知识&#xff1a;首先&#xff0c;你需要对计算机网络和操作系统有基本的了解。学习计算机网络的基本原理、网络协议和网络安全的基本概念。同时…

攻防世界-web-easytornado

题目描述&#xff1a;Tornado 框架。打开链接是一个简单的界面 1. 思路分析 看到有个/flag.txt&#xff0c;我们点击进去看下 发现传入了两个参数&#xff0c;一个是filename&#xff0c;还有一个是filehash 看到里面的内容&#xff0c;提示我们真正的flag在 /flllllllllllla…