当前位置: 首页 > news >正文

【C++ 系列文章 -- 程序员考试 201811 下午场 C++ 专题 】

1.1 C++ 题目六

阅读下列说明和C++代码,填写程序中的空(1) ~(5),将解答写入答题纸的对应栏内。

【说明】
以下C++代码实现一个简单乐器系统,音乐类(Music)可以使用各类乐器(Instument)进行演奏和调音等操作。对部分乐器进行建模,其类图如图6-1所示,包括:乐器(Instrument)、打击乐器(Perussion)、 弦乐器(Stringed)、 管乐器( Wind)、木管乐器(Woodwind)、铜管乐器(Brass )。
在这里插入图片描述

#include<iostream>
#include<vector>
using namespace std;
enum Note{     /*枚举各种高调*/MIDDLE_C,C_SHARP,B_FLAT //其它略
}class Instrument {     /*抽象基类,乐器*/public:( 1 )    ; //纯虚函数playvirtual void adjust()=0; //adjust函数接口
};class Wind:( 2 ) {public:void play(Note n){cout<< "Wind.play() "<<n<<endl; }void adjust(){cout<< "Wind.adjust() "<<endl; }
}/*类Percussion 和Stringed实现代码略*/class Brass: (  3  ) {public:void play(Note n){cout<< "Brass.play() "<<n<<endl: }void adjust(){cout<< "Brass.adjust() "<<endl; }
};class Woodwind:public Wind {public:void play(Note n){cout<< "Woodwind.play() "<<n<<endl: }
};class Music{public:void tune(Instrument*i){ i->play(MIDDLE_C); }void adjust(Instrument*i){ i->adjust(); }void tuneAll( ( 4 ) v  )        {      /*为每个乐器定调*/vector<Instrument*>::iterator it;for(it=v.begin();it!=v.end();it++)  {this->adjust(*it);this->tune(*it);}}
}int main()
{( 5 )   music=new Music();vector<Instrument*>orchestra;orchestra.push_back(new Wind());music->tuneAll(orchestra);
} 

1.1.1 填空(1)

由于空(1)已经注释为 存虚函数,所以我们知道,这个函数肯定会在它的子类中实现,所以只需要到子类中找到该该函数的参数类型及返回值类型即可。

class Instrument{     /*抽象基类,乐器*/public:( 1 )    ; //纯虚函数playvirtual void adjust()=0; //adjust函数接口
};class Wind:   ( 2 )    {public:void play(Note n){cout<< "Wind.play() "<<n<<endl; }void adjust(){cout<< "Wind.adjust() "<<endl; }
}

所以空(1)virtual void plya(Note) { }=0;,因为类Wind 基层基类Instrument

1.1.2 填空(2)

由于类Wind 中实现了 类Instrucment 中定义的存虚函数,所以我们可以知道,WindInstrucment 的子类,所以空(2)应该填继承方式:public Instrument

1.1.3 填空(3)

有题目总中给出的图,我们也可以知道 BrassWind子类,所以空(3)也应该填写继承方式public Wind

class Wind:   ( 2 )    {public:void play(Note n){cout<< "Wind.play() "<<n<<endl; }void adjust(){cout<< "Wind.adjust() "<<endl; }
}/*类Percussion 和Stringed实现代码略*/class Brass:    (  3  )    {public:void play(Note n){cout<< "Brass.play() "<<n<<endl: }void adjust(){cout<< "Brass.adjust() "<<endl; }
};

1.1.4 填空(4)

代码中可以看到Music 是一个基类,tuneAll((4)v)是一个成员函数,无法从上面代码得到有用信息,所以只能从函数内容获取有用信息,函数内部用到了类Instrument

class Music {public:void tune(Instrument*i){ i->play(MIDDLE_C); }void adjust(Instrument*i){ i->adjust(); }void tuneAll( ( 4 ) v  )        {      /*为每个乐器定调*/vector<Instrument*>::iterator it;for(it=v.begin();it!=v.end();it++)  {this->adjust(*it);this->tune(*it);}}
}

vector<Instrument*>::iterator it定义了一个迭代器it,这个迭代器用于遍历一个存储了Instrument指针vector容器。下面是对这个表达式的详细解释:

  • vector<Instrument*>:这是一个存储了 Instrument 类型指针的 vector容器。Instrument*是指向 Instrument类型对象的指针。
  • iterator:这是 vector 容器的一个内置类型,它是一个迭代器类型,用于遍历vector容器中的元素。
  • it:这是迭代器的实例的名称。

迭代器提供了一个统一的接口,用于访问容器中的元素,和这些元素的读取、修改等操作。在很多方面,迭代器的行为类似于指针。

由上面内容可以知道空(4)应该是一个向量指针,向量的类型为Instrument , 所以空(4)应该填 vector<Instrument*>

1.1.4.1 C++ vector

学习向量之前先了解下 什么是STL?

  • 1、STL(Standard Template Library),即标准模板库,是一个高效的C++程序库包含了诸多常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。

  • 2、从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming)。在这种思想里,大部分基本算法被抽象,被泛化,独立于与之对应的数据结构,用于以相同或相近的方式处理各种不同情形。

  • 3、从实现层次看,整个STL是以一种类型参数化(type parameterized)的方式实现的,基于模板(template)。

STL有六大组件,但主要包含容器迭代器和算法三个部分。

  • 容器(Containers):用来管理某类对象的集合。每一种容器都有其优点和缺点,所以为了应付程序中的不同需求,STL 准备了七种基本容器类型。
  • 迭代器(Iterators):用来在一个对象集合的元素上进行遍历动作。这个对象集合或许是个容器,或许是容器的一部分。每一种容器都提供了自己的迭代器,而这些迭代器了解该种容器的内部结构。
  • 算法(Algorithms):用来处理对象集合中的元素,比如 Sort,Search,Copy,Erase 那些元素。通过迭代器的协助,我们只需撰写一次算法,就可以将它应用于任意容器之上,这是因为所有容器的迭代器都提供一致的接口。

STL
的基本观念就是将数据和操作分离。数据由容器进行管理,操作则由算法进行,而迭代器在两者之间充当粘合剂,使任何算法都可以和任何容器交互运作。这一篇博客暂时只介绍容器,下一篇介绍迭代器。

容器用来管理某类对象。为了应付程序中的不同需求,STL 准备了两类共七种基本容器类型

  • 序列式容器(Sequence containers),此为可序群集,其中每个元素均有固定位置—取决于插入时机和地点,和元素值无关。如果你以追加方式对一个群集插入六个元素,它们的排列次序将和插入次序一致。STL提供了三个序列式容器
    • 向量(vector)、
    • 双端队列(deque)、
    • 列表(list),
    • 此外你也可以把 string 和 array 当做一种序列式容器。
  • 关联式容器(Associative containers),此为已序群集,元素位置取决于特定的排序准则以及元素值,和插入次序无关。如果你将六个元素置入这样的群集中,它们的位置取决于元素值,和插入次序无关。STL提供了四个关联式容器:集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)。
1.1.4.2 vector(向量)

它是一种序列式容器,事实上和数组差不多,但它比数组更优越。一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界。而 vector 正好弥补了这个缺陷,当内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝。

C++的初始化方法很多,各种初始化方法有一些不同。

  • (1): vector<int> ilist1;
    默认初始化,vector为空, size为0,表明容器中没有元素,而且 capacity 也返回 0,意味着还没有分配内存空间。这种初始化方式适用于元素个数未知,需要在程序中动态添加的情况。

  • (2): vector<int> ilist2(ilist);
    vector<int> ilist2 = ilist;
    两种方式等价 ,ilist2 初始化为ilist 的拷贝,ilist必须与ilist2 类型相同,也就是同为int的vector类型,ilist2将具有和ilist相同的容量和元素

  • (3): vector<int> ilist = {1,2,3.0,4,5,6,7};
    vector<int> ilist {1,2,3.0,4,5,6,7};
    ilist 初始化为列表中元素的拷贝,列表中元素必须与ilist的元素类型相容,本例中必须是与整数类型相容的类型,整形会直接拷贝,其他类型会进行类型转换。

  • 4): vector<int> ilist3(ilist.begin()+2,ilist.end()-1);
    ilist3初始化为两个迭代器指定范围中元素的拷贝,范围中的元素类型必须与ilist3 的元素类型相容,在本例中ilist3被初始化为{3,4,5,6}

  • 5): vector<int> ilist4(7);
    默认值初始化,ilist4中将包含7个元素,每个元素进行缺省的值初始化,对于int,也就是被赋值为0,因此ilist4被初始化为包含7个0。

  • (6):vector<int> ilist5(7,3);
    指定值初始化,ilist5被初始化为包含7个值为3的int

1.1.5 填空(5)

从下面代码中可以看到,在main 函数中创建了一个类型为Instrument*的向量orchestra, 然后通过push_back(new Wind())它向向量orchestra中插入元素。再调用成员函数tuneAll,由于这个函数只在Music 类中实现的,所以空(5)应该填Music *

int main()
{( 5 )   music=new Music();vector<Instrument*>orchestra;orchestra.push_back(new Wind());music->tuneAll(orchestra);
} 

pop_back()&push_back(elem)实例在容器最后移除和插入数据,如下:

#include <string.h>
#include <vector>
#include <iostream>
using namespace std;int main()
{vector<int>obj;//创建一个向量存储容器 intfor(int i=0;i<10;i++) // push_back(elem)在数组最后添加数据 {obj.push_back(i);cout<<obj[i]<<",";    }for(int i=0;i<5;i++)//去掉数组最后一个数据 {obj.pop_back();}cout<<"\n"<<endl;for(int i=0;i<obj.size();i++)//size()容器中实际数据个数 {cout<<obj[i]<<",";}return 0;
}

输出结果为

0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,

相关文章:

【C++ 系列文章 -- 程序员考试 201811 下午场 C++ 专题 】

1.1 C 题目六 阅读下列说明和C代码&#xff0c;填写程序中的空&#xff08;1&#xff09; &#xff5e;&#xff08;5&#xff09;&#xff0c;将解答写入答题纸的对应栏内。 【说明】 以下C代码实现一个简单乐器系统&#xff0c;音乐类&#xff08;Music&#xff09;可以使用…...

javaEE -15( 13000字 JavaScript入门 - 2)

一&#xff1a;JavaScript(WebAPI) JS 分成三个大的部分 ECMAScript: 基础语法部分DOM API: 操作页面结构BOM API: 操作浏览器 WebAPI 就包含了 DOM BOM&#xff0c;这个是 W3C 组织规定的. (和制定 ECMAScript 标准的大佬们不是一伙人). 前面学的 JS 基础语法主要学的是 …...

AWS SAP-C02教程11-解决方案

本章中,会根据一些常见场景的解决方案或者AWS的某一方面的总结,带你了解AWS各个组件之间的配合使用、如何在解决方案中选择组件以及如何避开其本身限制实现需求。 目录 1 处理高并发解决方案(Handing Extreme Rates)2 日志管理(AWS Managed Logs)3 部署解决方案(Deploy…...

ClickHouse Java多参UDF

一、环境版本 环境版本docker clickhouse22.3.10.22 docker pull clickhouse/clickhouse-server:22.3.10.22二、XML配置 2.1 配置文件 # 创建udf配置文件 vim /etc/clickhouse-server/demo_function.xml<functions><function><type>executable</type&…...

修改Typora默认微软雅黑字体

修改Typora字体 写在前面 我最近在折腾windows电脑&#xff0c;从macos转像windows不容易啊&#xff0c;因为键盘快捷键经常弄错&#xff0c;这篇文章就是修改Typora中字体显示的问题。 正文内容 我发现在windows中&#xff0c;字体非常的难看&#xff0c;微软雅黑也太丑了…...

ESP32网络开发实例-Web服务器显示LM35传感器数据

Web服务器显示LM35传感器数据 文章目录 Web服务器显示LM35传感器数据1、LM35介绍2、软件准备3、硬件准备4、代码实现4.1 LM35与ADS1115驱动4.2 Web服务器显示LM35传感器数据本文将介绍有关如何在ESP32的Web服务器中显示LM35 温度传感器数据。 1、LM35介绍 LM35 用于测量物体或…...

ATFX汇市:美联储11月利率决议再暂停加息,紧缩货币政策或已接近尾声

ATFX汇市&#xff1a;11月美联储利率决议结果在今日2:00公布&#xff0c;其中提到&#xff1a;美联储寻求以2%的速度实现最大的就业和通胀率&#xff0c;为了达成这些目标&#xff0c;美联储决定将联邦基金利率的目标区间维持在5.25%~5.5%&#xff1b;委员会将会考虑货币政策的…...

g.Grafana之Gauge的图形说明

直接上操作截图 1. 创建一个新的Dashboard 2.为Dashboard创建变量 【General】下的Name与Label的名称自定义 【Query options】 下的Group可以填写Zabbix内的所有组/.*/ , 然后通过Regex正则过滤需要的组名 3.设置Dashboard的图形 我使用文字来描述下这个图 1.我们在dash…...

MySQL笔记--Ubuntu安装MySQL并基于C++测试API

目录 1--安装MySQL 2--MySQL连接 3--代码案例 1--安装MySQL # 安装MySQL-Server sudo apt install mysql-server# 设置系统启动时自动开启 sudo systemctl start mysql # sudo systemctl enable mysql# 检查MySQL运行状态 sudo systemctl status mysql# 进入MySQL终端 sudo…...

与AI对话的艺术:如何优化Prompt以获得更好的响应反馈

前言 在当今数字化时代&#xff0c;人工智能系统已经成为我们生活的一部分。我们可以在智能助手、聊天机器人、搜索引擎等各种场合与AI进行对话。然而&#xff0c;要获得有益的回应&#xff0c;我们需要学会与AI进行有效的沟通&#xff0c;这就涉及到如何编写好的Prompt。 与…...

outlook是什么软件outlook邮箱撤回邮件方法

Outlook是微软公司开发的一款邮件客户端&#xff0c;也是Office办公套件的一部分。它可以与多个电子邮件服务提供商&#xff08;如Outlook.com、Exchange、Gmail等&#xff09;集成&#xff0c;用户可以使用Outlook来发送、接收和管理电子邮件、日历、联系人、任务等信息。本篇…...

电脑如何录制小视频

如果你想在你的电脑上录制视频分享给你的朋友或者亲人&#xff0c;无论你的电脑是win还是mac&#xff0c;都可以在本篇文章中找到电脑录制视频的详细教程。小编为你们整理了2种不同系统电脑的录制详细流程&#xff0c;继续阅读查看吧&#xff01; 第一部分&#xff1a;windows…...

vue使用百度富文本

&#x1f525;博客主页&#xff1a; 破浪前进 &#x1f516;系列专栏&#xff1a; Vue、React、PHP ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 1、下载UEditor 链接已放到文章中了 2、上传到项目目录中 一般上传到public下&#xff0c;方便到时候打包进去&#xff0c;以免…...

【Springboot】集成Swagger

引入依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version> </dependency> 浏览器 启动项目后 在浏览器中输入地址 localhost:端口号/swagger-ui/ 使…...

[SpringCloud | Linux] CentOS7 部署 SpringCloud 微服务

目录 一、环境准备 1、工具准备 2、虚拟机环境 3、Docker 环境 二、项目准备 1、配置各个模块&#xff08;微服务&#xff09;的 Dockerfile 2、配置 docker-compose.yml 文件 3、Maven 打包 4、文件整合并传输 三、微服务部署 1、部署至 Docker 2、访问微服务 四…...

阿里面试:让代码不腐烂,DDD是怎么做的?

说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 谈谈你的高并发落地经验&#xff1f; 谈谈你对DDD的理解&#xf…...

NoSQL数据库使用场景以及架构介绍

文章目录 一. 什么是NoSQL&#xff1f;二. NoSQL分类三. NoSQL与关系数据库有什么区别四. NoSQL主要优势和缺点五. NoSQL体系框架 其它相关推荐&#xff1a; 系统架构之微服务架构 系统架构设计之微内核架构 鸿蒙操作系统架构 架构设计之大数据架构&#xff08;Lambda架构、Kap…...

RFID系统提升物流信息管理效率应用解决方案

一、物流仓储管理方法 1、在仓库的进出口处安装RFID读写器&#xff0c;当粘贴RFID标签的电动叉车和货物进入装载区时&#xff0c;RFID读写器会自动检索并记录信息&#xff0c;当它们离开物流配送中心时&#xff0c;入口处的RFID读写器会读取标签信息&#xff0c;并生成出货单&…...

ONNX的结构与转换

ONNX的结构与转换 1. 背景2. ONNX结构分析与修改工具2.1. ONNX结构分析2.2. ONNX的兼容性问题2.3. 修改ONNX模型 3. 各大深度学习框架如何转换到ONNX&#xff1f;3.1. MXNet转换ONNX3.2. TensorFlow模型转ONNX3.3. PyTorch模型转ONNX3.4. PaddlePaddle模型转ONNX3.4.1. 简介3.4…...

vue3中,使用html2canvas截图包含视频、图片、文字的区域

需求&#xff1a;将页面中指定区域进行截图&#xff0c;区域中包含了图片、文字、视频。 第一步&#xff0c;先安装 npm install html2canvas第二步&#xff0c;在页面引入&#xff1a; import html2canvas from html2canvas;第三步&#xff0c;页面使用&#xff1a; 1&…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献

Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译&#xff1a; ### 胃肠道癌症的发病率呈上升趋势&#xff0c;且有年轻化倾向&#xff08;Bray等人&#xff0c;2018&#x…...

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因 为了实现在报销流程中&#xff0c;发票不能重用的限制&#xff0c;发票上传后&#xff0c;希望能读出发票号&#xff0c;并记录发票号已用&#xff0c;下次不再可用于报销。 基于上面的需求&#xff0c;研究了OCR 的方式和读PDF的方式&#xff0c;实际是可行的&#xff…...

中国政务数据安全建设细化及市场需求分析

(基于新《政务数据共享条例》及相关法规) 一、引言 近年来,中国政府高度重视数字政府建设和数据要素市场化配置改革。《政务数据共享条例》(以下简称“《共享条例》”)的发布,与《中华人民共和国数据安全法》(以下简称“《数据安全法》”)、《中华人民共和国个人信息…...

深度学习学习率优化方法——pytorch中各类warm up策略

warm-up具体原理以及为什么这么做在之前的博客有介绍&#xff0c;这里直接介绍如何直接使用pytorch中的warm-up策略&#xff0c;在pytorch中对于warm-up所有支持的方法都有描述&#xff0c;可以直接阅读1。 深度学习中各类学习率优化方法(AdaGrad/RMSprop/Adam/Warm-UP)原理及其…...

从入门到实战:AI学习路线全解析——避坑指南

分享一下阿里的人工智能学习路线,为感兴趣系统学习的小伙伴们探路。 一、谁适合学这门AI课程?五类人群的精准定位 无论你是零基础小白还是职场转型者,这套系统化课程都能为你量身定制成长路径: 零基础爱好者(无编程/数学背景) 课程提供Python和数学前置学习建议,先补基…...

nginx部署

配置阿里云yum源 安装如下编译工具 yum install -y gcc gcc-c autoconf automake make #安装使用nginx还得安装nginx所需的一些第三方系统库的支持&#xff0c;比如nginx的静态资源压缩功能所需的gzip lib库&#xff0c;nginx需要支持URL重写&#xff0c;所需的pcre库&…...