认识、使用C++vetor和array

news2024/11/21 2:33:05

目录

前言:

1.vector模板

1.1vector简介

1.2创建vector类对象

2.array模板

2.1array简介

2.2创建array类对象

3.比较中学习

4.怎么避免数组越界访问


前言:

  指针的基础用法分了近三篇文章,结合数组、结构、共用体、字符串一起学习。相信读者已经掌握了指针的基本知识,我们来补充一下在涉及指针第一篇内容里提到的,在C++中,用vector和array模板替代数组的使用

1.vector模板

1.1vector简介

  vector模板类是在C++98新增的标准模板库(STL)提供的,它是动态数组的替代品(new typename[element];)。既然和动态数组有关,所以用vector模板类创建数据对象的时候,最后要记得使用数组格式释放掉相应的自由存储空间(堆区)。接下来我们来讲如何创建vector对象。

1.2创建vector类对象

  首先,使用vector模板要使用头文件vector,vector的名称空间在std里面,使用编译指令using就可以啦,需要声明的声明好后,就可以使用vetor创建对象。

  vi,vt,这里并不是英语里的不及物和及物动词的意思,碰巧这么起而已(doge)。vi是一个vector<int>的对象。这句话可以这样理解,vector是类,用类创建的对象,是什么样的?vector<int>样的,就像char ch;用char创建一个ch对象一样,只是char是基本类型,我们更常说,ch是一个char类型的变量。

  由于vector对象的大小可以根据我们的输入自动调整,所以可以在声明的时候,不指定数组的元素个数是可以的。而用静态联编创建数组int arr[元素个数];的时候,元素个数不能给0

2.array模板

2.1array简介

  array是在C++11中新增加的,如果想使用长度固定的数组,使用array是一个更好的选择vector的效率相比于数组是稍低的。我们说C、C++在数组进行访问的时候,对索引值不敏感,也就是可能超出数组的范围越界访问了而不报错。为了寻求功能更强大,更安全的长度固定的数组,我们引进了array类。

2.2创建array类对象

  一样的,需要引用头文件为<array>才能使用array模板,名称空间位于std。

  因为array是在C++11新增的,此时C++将使用列表初始化成为通用的一种方法,而在C98下vector对象不能使用列表初始化。

3.比较中学习

  我们使用数组创建了arr1,vector创建了arr2,array创建了arr3、arr4。

  vector对象不能被初始化,通过数组表示法来赋值,我们可以把vector创建的对象arr2当成一个数组,用数组表示法来使用,array对象也一样可以用

  arr4 = arr3;当数组元素一样,个数相同时,array类的对象是可以相互赋值的。我们看到打印arr4[2] = 3.14内容,可以记得更深刻一些

  arr1的地址是0x008FF780,arr2的地址是0x00ACF758这两个地址相差很大,这是因为,arr1数组是在栈区内存上的,vector是在堆区(动态数组替代品,动态开辟的空间在堆区)内存上的我们只需要知道,栈区和堆区是内存中两块相对独立的内存块,地址相差很大就可以了

  补充:堆区也叫内存池

  而arr1与arr3、arr4相差不大,甚至可以看到arr3、arr4两者几近是靠在一起创建的,当然也不是连续的,只是比较起arr2很近这是因为array创建的数组,也和arr1性质上也是相同的,固定长度的数组,局部,所以都是在栈区上开辟空间

  看到arr1[-1],相信大部分读者都反应过来说,数组arr1越界访问了是的,我们看到右边窗口说代码退出是3,这是异常退出的意思,3是个错误代码信息的编号,代码退出0才是正常的我们主要不是想讨论这个,而是说,结果是不是还是跑出来了?arr1[2]的地址是0x00FF780,arr[-1]是*(arr1-1)的意思,它们相差三个元素的位置,每个元素是double类型,算下来恰是地址0x8FF768这里想告诉大家的是,C、C++没有检索下标使用有效性的这个保护机制,如果有编译器它都不让你跑起来,而这里是跑完再报错,但内容还是被改了

4.怎么避免数组越界访问

  第一:足够细心。第二:让代码健壮一点。

  人难免会不经意的写出一个bug,所以为了保护好代码,适当加入写监督的机制。这里讲的是对C++中的vector类和array类使用at成员函数,来是程序在运行的时候,捕获非法索引的情况,程序默认中断。

  使用的例子:array<int, 5> arr1;  arr1.at(5);

  读者可能会问,那和前面报错有什么区别,我一样找不出原因呀,请注意,C和C++没有捕获这种索引值越界的在一个工程中,当我们越界访问的时候,没有报错,且没有终止(但一般都会),最后输出一个奇怪的结果,试问几万行里的代码,要怎么找bug不过介于博主知识有限,可能这个at成员报错会有提示在第几行呀,或者是我们自己添加一些可以快速定位到位置等等。大家知道这么一回事就可以啦,在日后的学习中,懂得更多! 

  还有一点就是,使用at()的代价是需要额外的时间去让编译器检查,这也是C和C++允许我们使用任何一个索引值的原因所在另外这些类还有成员函数,begin()、end()。让我们确定开头和结尾这个边界,以免超过这个范围。这里就不细说啦,认识认识。

  好啦,到这就讲完了,希望读者读完有所收获。

  如果本文有内容、排版上的错误,请在下边评论区留言哈。求点赞,求点赞,求点赞!你的点赞是我更新的动力~

 

 

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

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

相关文章

【Golang | http】使用http库完成一个简单的POST请求

引言 主要记录使用Golang实现一个POST请求所用到的小知识点 1、项目结构 客户端向服务端注册用户信息&#xff0c;服务端返回注册信息中的用户名 PS E:\goland-workspace\GolangLearning\http> tree /f 卷 文件 的文件夹 PATH 列表 卷序列号为 0C66-1433 E:. ├─client…

小样本学习FSL介绍

1 概念 小样本学习&#xff08;few-shot learning&#xff0c;FSL&#xff09;旨在从有限的标记实例&#xff08;通常只有几个&#xff09;中学习&#xff0c;并对新的、未见过的实例进行识别。 相比于传统的深度学习和机器学习方法&#xff0c;小样本学习能够更好地模拟人类的…

从C出发 22 --- 变量的作用域与生命期

问题 1 &#xff1a; 这样子定义一个不属于任何函数的变量正确吗? 问题 2 : 编译能通过吗? 问题 : 我们要打印的var 到底是 10 还是 100. 总结: 什么都不会输出&#xff0c;因为这里的 i ;是让局部变量的 i &#xff0c;程序会一直死循环 为什么都是 11&#xff0c;为什…

在构建个人想法时,使用哪个工具更好呢?Tana, AmpleNote 和 妙记多 Mojidoc的比较

笔记类 App 都很强调个人化&#xff0c;因为我们每个人会用不同的方法来做笔记、写日记。不过有一些框架可以帮助我们&#xff0c;比如子弹笔记&#xff08;Bullet Journal&#xff09;等。 Tana 和 Amplenote 都可以使用「标签」&#xff0c;尽管它们处理的方式、体验都大不相…

4.14~4.16学习总结

多线程&#xff1a; 同步代码块 格式&#xff1a;Synchronized(锁) { 操作共享数据的代码 } 特点1&#xff1a;锁默认打开&#xff0c;有一个线程进去了&#xff0c;锁自动关闭。 特点2&#xff1a;里面的代码全部执行完毕&#xff0c;线程处理&#xff0c;锁自动打开。 …

SaleSmartly(ss客服)怎么玩转Instagram自动化?

这段时间接触了不少粉丝&#xff0c;一直在说ins营销&#xff0c;说谁谁谁通过这个引流&#xff0c;结果爆了&#xff0c;那我们今天就来简单说一下。Instagram (IG) 是全球最大的照片和视频共享平台&#xff0c;拥有超过10亿的月活跃用户和 5 亿的日活跃Story用户。借助IG的强…

LNMP和论坛的搭建

系列文章目录 文章目录系列文章目录一、LNMP搭建1.承接上文搭建nginx服务2.Mysql数据库搭建3.安装配置 PHP 解析环境4.、部署 Discuz&#xff01;社区论坛 Web 应用总结一、LNMP搭建 1.承接上文搭建nginx服务 2.Mysql数据库搭建 1、安装Mysql环境依赖包 yum -y install \ n…

不限量免注册,极速体验AI助手

最近 ChatGPT 很火&#xff0c;火到每个人都想玩一把&#xff0c;由于受限&#xff0c;不是在搭梯子就是在搭梯子的路上&#xff0c;现在类 ChatGPT 产品&#xff0c;它终于来了。还是先简单秀一波操作&#xff1a;第一波&#xff1a;大数据记录中&#xff0c;涉及关键字快速检…

vue2路由(上)

路由的简介 什么是路由&#xff1f; 用生活上的例子&#xff0c;路由器上的接口对应一个主机。 而由key和values组成的映射关系就是路由 主要用于SPA单页面应用 就是根据你端口号后面的路径&#xff0c;看你有没有配置这个页面对应的组件&#xff0c;如果有&#xff0c;那么就…

批处理脚本用法总结

目录一、常用命令二、基本语法1. rem 和 ::2. echo 和 3. pause4. errorlevel5. title6. color7. goto 和 :三、常见用法1. 设置临时环境变量2. 启动CMD执行命令3. 打开环境变量窗口参考资料&#xff1a;批处理(Batch)&#xff0c;也称为批处理脚本。顾名思义&#xff0c;批处理…

零入门kubernetes网络实战-29->在同一个宿主机上基于虚拟网桥bridge链接不同网段的不同网络命名空间的通信方案

《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 上一篇文章&#xff0c;我们分享了使用虚拟网桥来连接同网段的不同网络命名空间下的通信情况。 那么&#xff0c;本篇文章&#xff0c; 我们想测试一下&…

用ChatGPT快速阅读论文:3个步骤让你轻松阅读论文文档

引言 您是否曾经因为阅读论文而感到困难和无从下手&#xff1f;ChatDOC是一款专为您设计的人工智能工具&#xff0c;帮助您快速理解论文内容。通过上传文档&#xff0c;利用ChatGPT技术&#xff0c;您只需3个简单步骤&#xff0c;即可快速阅读论文&#xff0c;提高阅读效率。立…

[架构之路-162]-《软考-系统分析师》-3-作系统基本原理-进程管理

目录 前言&#xff1a; 3 . 1 操作系统概述 3.1.1 操作系统的类型 2 . 批处理系统 3 . 分时操作系统 4 . 网络操作系统 5 . 分布式操作系统 6 . 嵌入式操作系统 3.1.2 操作系统的软件结构 1 . 整体结构 2 . 层次结构 3 . 客户/服务器结构 4 . 面向对象结构 3 . 2…

一文总结 Shiro 实战教程

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

InstructGLM:基于ChatGLM-6B在指令数据集上进行微调

InstructGLM 基于ChatGLM-6BLoRA在指令数据集上进行微调 https://github.com/yanqiangmiffy/InstructGLM 本项目主要内容&#xff1a; &#x1f680; 2023/4/9 发布了基于100万条由BELLE项目生成的中文指令数据的Lora权重&#xff0c;具体可见output/belle/chatglm-lora.pt&a…

【Spring Boot】SpringBoot设计了哪些可拓展的机制?

文章目录前言SpringBoot核心源码拓展Initializer拓展监听器ApplicationListenerBeanFactory的后置处理器 & Bean的后置处理器AOP其他的拓展点前言 当我们引入注册中心的依赖&#xff0c;比如nacos的时候&#xff0c;当我们启动springboot&#xff0c;这个服务就会根据配置文…

【UE Sequencer系列】05-解决角色动画造成的位移问题

步骤 在上一篇博客制作的动画中&#xff0c;角色反击的动画部分会造成角色瞬移的问题&#xff0c;如下所示&#xff1a; 为了解决这个问题&#xff0c;我们可以做如下操作&#xff1a; 1.首先我的瞬移现象发生在第698帧到699帧的时候&#xff0c;我对第698帧的角色的transfor…

小朋友台灯什么品牌好?盘点儿童护眼台灯排行榜

小朋友自晚上学习时&#xff0c;有台灯肯定比没有台灯好&#xff0c;只要是合格的、能用的台灯&#xff0c;能有一个稳定又亮堂的环境&#xff0c;也不会给眼睛带来伤害。 这几年在台灯品类中出现“护眼灯”&#xff0c;主打是预防或缓解眼疲劳的&#xff0c;在普通台灯的基础是…

电子模块|外控集成 LED 光源 WS2812模块---硬件介绍

电子模块|外控集成 LED 光源 WS2812模块模块简介模块特点机械尺寸模块简介 WS2812是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个5050LED灯珠相同&#xff0c;每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路&#xff…

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的直方图算法增强(C#)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的直方图算法增强&#xff08;C#&#xff09;Baumer工业相机Baumer工业相机使用图像算法增加图像的技术背景Baumer工业相机通过BGAPI SDK联合OpenCV使用图像增强算法1.引用合适的类文件2.BGAPI SDK在图像回调中…