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

news2024/12/27 15:37:19

一、构造函数

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生成杨辉三角

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

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

相关文章

元宇宙数字藏品交易所,未来发展的大趋势

随着科技的飞速进步,元宇宙以其独特的魅力为数字世界绘制了一幅前所未有的宏伟蓝图。在这一宏大的背景下,数字藏品交易所作为连接虚拟与现实的桥梁,正以其卓越的优势,引领着数字藏品市场迈向新的高度。 首先,元宇宙为…

计算机组成原理·考点知识点整理

根据往年考试题,对考点和知识点的一个整理。 校验编码 码距 一种编码的最小码距,其实就是指这种编码的码距。码距有两种定义: 码距所描述的对象含义 2 2 2 个特定的码其二进制表示中不同位的个数一种编码这种编码中任意 2 2 2 个合法编码的…

汽车IVI中控开发入门及进阶(二十五):CVBS视频流

前言: AHD和CVBS是两种视频格式,在车载摄像头中,有支持传统CVBS模拟视频的摄像头,也有支持新的高分辨率AHD格式的摄像头。 CVBS视频是经典的模拟视频格式,在视频经常显示在小型监视器上的车辆上仍然最受欢迎。如果想要车辆的最大分辨率,可选择AHD格式,即高分辨率模拟视…

计算机网络错题答案汇总

王道学习 第1章 计算机网络体系结构 1.1 1.2

景区ar互动大屏游戏化体验提升营销力度

从20世纪60年代的初步构想,到如今全球范围内无数企业的竞相投入,AR增强现实技术已成为引领科技潮流的重要力量。而在这一浪潮中,中国的AR公司正以其独特的魅力和创新力,崭露头角。 中国的AR市场正在迎来前所未有的发展机遇。如今&…

C++的类和new和delete和菱形继承机制

文章目录 参考虚函数使用虚函数的class结构相关实现源码IDA反编译子类虚表和父类虚表调用函数菱形继承 参考 https://showlinkroom.me/2017/08/21/C-%E9%80%86%E5%90%91%E5%88%86%E6%9E%90/ https://www.cnblogs.com/bonelee/p/17299985.html https://xz.aliyun.com/t/5242?t…

一文看懂Llama 2:原理、模型与训练

一文看懂Llama 2:原理、模型与训练 Llama 2是一种大规模语言模型(LLM),由Meta(原Facebook)研发,旨在推动自然语言处理(NLP)领域的发展。本文将详细介绍Llama 2的原理、模…

flutter封装日历选择器(单日选择)

简单封装: 引入库:table_calendar import package:generated/l10n.dart; import package:jade/utils/JadeColors.dart; import package:jade/utils/Utils.dart; import package:util/easy_loading_util.dart; import package:flutter/material.dart; im…

智能小家电品牌如何在美国沃尔玛创新中脱颖而出?

智能小家电品牌想要在美国沃尔玛的创新中脱颖而出,需要采取一系列策略,这些策略不仅涉及产品层面的创新,还包括市场定位、营销策略以及与沃尔玛的合作方式等多个方面。 以下是一些具体的建议: 一、产品创新与技术突破 智能小家电…

UnityXR Interactable Toolkit如何实现Climb爬梯子

前言 在VR中,通常会有一些交互需要我们做爬梯子,爬墙的操作,之前用VRTK3时,里面是还有这个Demo的,最近看XRI,发现也除了一个爬的示例,今天我们就来讲解一下 如何在Unity中使用XR Interaction Toolkit实现爬行(Climb)操作 环境配置 步骤 1:设置XR环境 确保你的Uni…

Memory测试工具-stressapptest详解

✨前言: stressapptest 是一个用于在各种系统组件上施加压力的工具,特别专注于内存和CPU。通过运行各种模式的访问测试,stressapptest 旨在模拟高负载下的系统行为,并帮助发现潜在的错误,比如硬件故障、过热或系统组件…

IGraph使用实例——图属性设置2之GML或GraphML输出

1 概述 1.1GML Graph Modeling Language (GML) 是一种用于描述图形结构的文本格式,它提供了为节点和边分配属性的灵活性。以下是关于GML的详细解释:1)定义与用途: GML是一种通用的图形表示语言,常用于表示网络…

个人笔记-python生成gif

使用文件的修改时间戳进行排序 import os import re import imageio# 设置图片所在的文件夹路径 folder_path /home/czy/ACode/AMAW_20240219/9.3.x(Discrete_time_marching)/9.3.17.11.1(Disc_concessive_CH_ZJ)/current_figures # 文件夹路径;linux…

Mysql疑难报错排查 - Field ‘XXX‘ doesn‘t have a default value

项目场景: 数据库环境 :mysql8; 工程使用:MyBatisPlus 表情况: 问题描述 某一个插入语句使用了 MyBatisPlus 的 save 方法,因为end_time1 end_time2都并没有值,所以在MyBatisPlus默认情况下,…

kafka-消费者-指定offset消费(SpringBoot整合Kafka)

文章目录 1、指定offset消费1.1、创建消费者监听器‘1.2、application.yml配置1.3、使用 Java代码 创建 主题 my_topic1 并建立3个分区并给每个分区建立3个副本1.4、创建生产者发送消息1.4.1、分区0中的数据 1.5、创建SpringBoot启动类1.6、屏蔽 kafka debug 日志 logback.xml1…

视频汇聚平台EasyCVR对接GA/T 1400视图库:结构化数据(人员/人脸、车辆、物品)对象XMLSchema描述

在信息化浪潮席卷全球的背景下,公安信息化建设日益成为提升社会治理能力和维护社会稳定的关键手段。其中,GA/T 1400标准作为公安视频图像信息应用系统的核心规范,以其结构化数据处理与应用能力,为公安信息化建设注入了强大的动力。…

精妙无比的App UI 风格

精妙无比的App UI 风格

BERT+PET方式模型训练

基于BERTPET方式文本分类模型搭建 模型搭建 本项目中完成BERTPET模型搭建、训练及应用的步骤如下(注意:因为本项目中使用的是BERT预训练模型,所以直接加载即可,无需重复搭建模型架构): 一、实现模型工具类函数二、实现…

RAG检索增强生成(1)-大语言模型的外挂数据库

Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks Lewis P, Perez E, Piktus A, et al. Retrieval-augmented generation for knowledge-intensive nlp tasks[J]. Advances in Neural Information Processing Systems, 2020, 33: 9459-9474. RAG结合了信息检…

AI绘画揽活新中式室内设计,能不能让你一见“粽”情?

端午节即将来临,计划节前完成的图赶出来了吗?别着急,可以找个AI绘画工具做帮手,让你在短时间内完成高质量的设计。 恰逢端午佳节,相比其他装修风格,新中式显然与端午节更般配,那么我们就用AI绘画的新中式风…