C++学习/复习12--vector的实现(三个基本成员函数/迭代器/扩容/插入删除/重载/测试/杨辉三角)

一、构造函数

1.匿名对象与构造函数

在C++中,匿名对象是一个临时对象,它没有名称,通常在对象创建后,只使用一次后就被销毁。创建匿名对象的方式是在创建对象时不使用变量名

下面是创建匿名对象的几种方式:

  1. 直接使用构造函数创建匿名对象

  2. 使用new关键字创建匿名对象

  3. 使用函数返回对象

  4. 使用初始化列表

注意,匿名对象通常在对象被创建后,只使用一次后就被销毁。如果你想要持有这个匿名对象的引用或指针,那么你需要将其转换为有名字的对象。

2.迭代器区域构建构造函数

模板形式便于不同类型迭代器使用,头尾两个迭代器规定数组范围,利用迭代器向这个范围的数据尾插数据。

二、拷贝构造(swap写法)

1.值传递、引用传递、临时变量

  • 值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。

  • 引用传递:也称为传地址

  • 方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

  • 临时变量通常在几种情况下产生 

  • 1. **值传递**:当函数以值传递方式返回对象时,编译器通常会生成一个临时变量来存储返回的对象。 

    2. **类型转换**:当发生类型转换时,特别是涉及到用户自定义类型的转换,也会产生临时变量。这包括隐式和显式(强转)类型转换。 

    3. **常量引用类型**:如果函数参数是常量引用类型,而传入的实参不匹配但可转换,或者实参是一个右值(非左值),那么编译器会产生一个临时变量。 

    4. **函数参数传递**:当函数参数需要通过值传递,但实参与形参类型不匹配时,编译器可能会生成临时变量以适配类型。 

    5. **特定语言构造**:在某些编程语言中,特定的语言构造会在背后产生临时变量。例如,在C++中,某些情况下返回类对象时,即使没有显式的临时变量声明,也可能由于编译器优化而实际产生了临时变量。

    6. **表达式计算**:在计算涉及多个步骤的复杂表达式时,编译器可能会生成临时变量来保存中间结果。 

    7. **异常处理**:在异常处理中,当抛出一个异常对象而尚未被捕获时,该异常对象就是一个临时变量,它在内存中的生命周期将持续到被捕获为止。

    8. **模板实例化**:在使用模板时,不同类型的实例化可能会导致创建临时变量以适应不同的类型参数。

    临时变量的产生通常是由编译器自动管理的,旨在支持程序的运行和提高代码的效率。 开发者可以通过避免不必要的临时变量生成来优化程序性能,例如通过使用引用传递而非值传递,或者通过避免不必要的类型转换。

三、析构函数

如果指针指向空间不为空就delete[ ]空间(空间由new[ ]在堆上开辟)的资源,同时重置vector成员数据

四、读写与只读迭代器

1.const

**const关键字的主要作用是定义不允许被改变的对象**。在C++中,它用于指定变量、函数参数、成员函数以及类的属性等不应被修改,从而提供程序的健壮性和可维护性。 

1. **定义常量**:使用const可以定义常量,这些常量的值一旦被设定后就不能改变。这有助于防止在程序运行过程中意外修改这些值,同时也向其他开发者明确表明这些值是只读的。
2. **类型检查**:当const用于函数参数时,它允许编译器进行更严格的类型检查,确保传入的参数不被意外修改,提高了代码的安全性和可靠性。
3. **保护数据**:const通过确保某些数据保持恒定不变,帮助保护了程序中的关键数据不被修改,这对于数据安全和程序稳定性至关重要。
4. **替代宏**:与预处理器的#define相比,使用const定义常量更加安全且符合C++语言的作用域规则,避免了宏定义带来的潜在问题。
5. **指针和引用**:const可用于修饰指针和引用,指向常量的指针(pointer to const)或对常量的引用(reference to const)保证了它们所指向或引用的对象在程序中的不变性
6. **接口设计**:在类的设计中,将getter方法中的成员变量声明为const,可以保证该方法不会修改任何成员变量的状态,这对于线程安全和类的设计是非常重要的。
7. **编译优化**:const对象为编译器提供了额外的优化机会,因为const对象表达出了不变的语义,编译器可以据此生成更优化的代码。

在使用const时,需要注意以下几点以确保正确性和程序的高效运行:

1. **初始化要求**:由于const对象一经定义便不可更改,因此必须在定义时对其进行初始化。
2. **文件内有效性**:默认情况下,const对象仅在其定义的文件内有效,若需要在多个文件间共享const对象,需使用extern关键字
3. **顶层底层const**:理解顶层const和底层const的概念对于正确地处理指针和引用至关重要。顶层const指的是指针本身是const,而底层const指的是指针所指向的对象是const。
4. **constexpr与const**:虽然两者都用于声明常量,但constexpr表示的常量必须在编译时就能计算出来,而const则没有这个限制。

五、数据量与数组容量

通过vector的三个指针即可算出数组中的数据量与容量

六、reserve()与resize()

(1)拷贝构造

拷贝构造函数,也称为复制构造函数,是一种特殊的构造函数,它由编译器调用来完成同一类的其他对象的构建及初始化。拷贝构造函数的形参必须是引用,但并不限制为const,一般普遍的会加上const限制。拷贝构造函数经常用在函数调用时用户定义类型的值传递及返回。它要调用基类的拷贝构造函数和成员函数。拷贝构造函数的主要目的是用其他对象的数据来初始化当前对象,并没有期望更改其他对象的数据。12

在C++中,以下三种情况需要调用拷贝构造函数:

  1. 一个对象作为函数参数,以值传递的方式传入函数体;
  2. 一个对象作为函数返回值,以值传递的方式从函数返回;
  3. 一个对象用于给另外一个对象进行初始化(常称为赋值初始化)。

如果类中包含动态分配成员或包含指针成员,应该提供拷贝构造函数。在提供拷贝构造函数的同时,也应该考虑重载"="赋值操作符。拷贝构造函数的参数必须是一个引用,这是因为如果参数不是引用,就会调用该类的拷贝构造函数,从而造成无穷递归的调用。

如果没有显式地定义拷贝构造函数,那么编译器会自动生成一个默认的拷贝构造函数。这个默认的拷贝构造函数简单地使用“老对象”的成员变量对“新对象”的成员变量进行一一赋值。对于简单的类,这个默认的拷贝构造函数一般是够用的。然而,对于包含指针成员的类,这个默认的拷贝构造函数(浅拷贝)可能会导致新对象中的指针指向和初始化对象指针指向一致,当用来初始化的对象在释放内存时会释放掉指针指向的内存,而新创建的对象在释放时会出现程序错误。

resize()考虑是否扩容,还要考虑数据量是缩是扩,仍然是通过vector的三个成员参数实现

 七、尾插尾删

 

八、erase( )和insert( )

1.迭代器失效

注意原迭代器经扩容等操作后可能失效,要返回更新过的迭代器

九、重载[ ]下标访问

分只读与读写、以数组下标访问的方式取得数据

十、成员变量

十一、测试案例

1.三种循环访问方式

2.插入函数的运用

3.插入函数的返回值

      迭代器失效

4.数据的查找与size( )/capacity( )

5.构造与拷贝构造的调用

6.vector生成杨辉三角

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】(二)—— 用户和用户组管理

在了解了Linux基础命令格式后,今天我要介绍的是Linux的用户管理 目录 root用户用户管理操作用户ID切换用户查看用户添加用户指定密码修改用户信息删除用户退出登录查看登陆系统的用户 用户组的管理增加新用户组查看用户组删除用户组修改用户组切换用户组 与用户有关…

GAMES101笔记

Games101 文章目录 Games101一、Review of Linear Algebra 线性代数向量向量点乘:判断同向反向、接近程度点乘基本属性点乘坐标系运算向量投影向量叉乘:判定左右、判定内外叉乘基本属性(右手坐标系):不满足交换律叉乘坐…

CSS函数:fit-content与matrix的使用

网格函数 fit-content()属于网格函数,除此之外的网格函数还有:CSS函数: 实现数据限阈的数字函数。顾名思义,这三个函数只能在网格布局中使用。fit-content()函数主要是用于给定布局可用大小,适应内容,其功…

【数据结构】排序(直接插入、折半插入、希尔排序、快排、冒泡、选择、堆排序、归并排序、基数排序)

目录 排序一、插入排序1.直接插入排序2.折半插入排序3.希尔排序 二、交换排序1.快速排序2.冒泡排序 三、选择排序1. 简单选择排序2. 堆排序3. 树排序 四、归并排序(2-路归并排序)五、基数排序1. 桶排序(适合元素关键字值集合并不大)2. 基数排序基数排序的…

十六、【源码】plugins插件

源码地址:https://github.com/mybatis/mybatis-3/ 仓库地址:https://gitcode.net/qq_42665745/mybatis/-/tree/16-plugin plugins插件 plugins功能分为两部分 1.首先是在xml解析时解析出配置的插件类,并实例化放入拦截器链中 2.其次执行…

量化投资分析平台 迅投 QMT(四)获取标的期权的代码

量化投资分析平台 迅投 QMT [迅投 QMT](https://www.xuntou.net/?user_code7NYs7O)我目前在使用有了底层标的如何获取期权的交易代码呢?上代码历史帖子 迅投 QMT 我目前在使用 两个月前(2024年4月)迅投和CQF有一个互动的活动,进…

Java实现2048游戏源代码(启动即可玩)

使用Java语言从零到一开发经典2048游戏的全部源代码及详尽的开发教程。 适合Java初学者、游戏开发爱好者以及想要深入理解Swing GUI框架的开发者学习与参考。 知识领域:游戏开发、Java编程、图形用户界面(GUI)设计 技术关键词:Java Swing、事件监听、多…

“探索‘循环购‘:快消品行业的新商业模式与增长策略“

大家好,我是吴军,来自一家深耕于软件开发和商业模式创新的科技公司。我们的专长在于为各类企业量身打造商城系统,并提供个性化的商业模式解决方案。迄今为止,我们已经助力众多企业成功实施了超过200种前沿的商业模式,实…

阿奇科技 简单java-swing计算器源码(可用于课设等)

此系统用的技术有java swing! 实现的功能: 加减乘除(可以进行小数运算) 清空数据 最小化 小巧方便,功能齐全! 页面截图: 源码地址:点击这里下载源码 获取全套代码,或咨询更多代码…

【JavaEE】Spring Boot 日志详解

一 日志概述 日志是用于记录系统运行状态、用户操作和重大事件的工具。 1.日志的用途 系统监控 监控现在几乎是一个成熟系统的标配, 我们可以通过日志记录这个系统的运行状态, 每⼀个方法的响应时间, 响应状态等, 对数据进行分析, 设置不同的规则, 超过阈值时进行报警. 比如统…

科技赋能,无障碍出行的新纪元

在现代社会,公共设施的建设不仅是衡量城市文明程度的标尺,更是实现社会公平与包容的重要载体。对于盲人群体而言,一个完善的公共设施网络,意味着他们能够更加独立、自信地融入社会,享受与视力健全者同等的公共服务与便…

湖南(品牌控价)源点调研 手机价格管理对品牌的影响分析

前言:手机自发明以来,过去一直是国际品牌占主导地位,从最初的爱立信、摩托罗拉,到后来的诺基亚、三星,苹果在这个手机行业里,竞争激励,没有百年企业,每个品牌的盛衰都有背后的历史背…

软件测试——Java自动化测试Selenium

目录 1.运行环境 2.环境配置 3.第一个浏览器程序 4.浏览器操作 5.元素定位 6.元素操作常用API 7.特殊元素定位与操作 8.元素三大等待 9.iframe操作 10.window操作 11.select选择框 12.js语句执行 13.鼠标操作 14.截图操作 1.运行环境 编译工具:IDEA …

教师自费出书的注意事项有哪些?

备案主编专著的优势:(qkfb88688) 1、副高、正高职称最高学术成果 2、专著可以代替核心 3、周期短、出书快、可重复使用 4、双号齐全:ISBN~CIP 5、版权长期有效 教师自费出书有以下一些注意事项: 关于书稿&…

python---正则表达式

本章目标: 1:能够知道在Python中使用正则要导入的模块; [了解] re模块 2:能够使用re模块匹配单个字符; [重点] \d \w 正则表达式的概述: 基本介绍 正则表达式,也叫做规则表达式,通常会说成[正则] 实际上正则表达式就是指符合一定规则的字符串,同时他能用于检查一段…

MyBatis拦截器使用方法

前言 MyBatis拦截器可以做的工作:SQL修改,分页操作,数据过滤,SQL执行时间性能监控等。 1. 基础介绍 1.1. 核心对象 从MyBatis代码实现的角度来看,MyBatis的主要的核心部件有以下几个: Configuration&am…

OpenStack所支持的虚拟化技术和KVM、Xen、Hyer-V、QEMU、Libvirt说明

OpenStack所支持的虚拟化技术主要包括以下几种: KVM (Kernel-based Virtual Machine): 基于Linux内核的虚拟化技术。在Linux内核中添加一个虚拟化模块来实现虚拟机的运行。是OpenStack用户使用较多的虚拟化技术,支持OpenStack的所有特性。通过QEMU模拟器…

【NoSQL数据库】Redis——哨兵模式

Redis——哨兵模式 Redis哨兵 Redis——哨兵模式1.什么是哨兵机制(Redis Sentinel)1.1 哨兵的作用 2.哨兵的运行机制3.故障处理redis常见问题汇总1、redis缓存击穿是什么?如何解决?2、redis缓存穿透是什么?如何解决&am…

详解!Python怎么配置环境变量

详解!Python怎么配置环境变量 许多刚开始学习编程的初学者在 python的安装上会抱有一定的疑惑,为什么明明已经安装好了 python 环境,但并不能运行python 代码,这是因为 python 的安装过程中还有一步环境变量的配置,接…

微信“对方正在输入”背后的小心思:保持隐秘感,享受宁静的交流

微信,这个伴随我们起居、工作的超级应用,不仅仅是一款聊天软件,它几乎成为了我们社交生活的一部分。它的便捷,让我们的日常沟通如鱼得水。然而,在这个几乎完美的社交工具中,有一个功能,让不少人…