【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
中定义的存虚函数,所以我们可以知道,Wind
是Instrucment
的子类,所以空(2)
应该填继承方式:public Instrument
。
1.1.3 填空(3)
有题目总中给出的图,我们也可以知道 Brass
是Wind
子类,所以空(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代码,填写程序中的空(1) ~(5),将解答写入答题纸的对应栏内。 【说明】 以下C代码实现一个简单乐器系统,音乐类(Music)可以使用…...

javaEE -15( 13000字 JavaScript入门 - 2)
一:JavaScript(WebAPI) JS 分成三个大的部分 ECMAScript: 基础语法部分DOM API: 操作页面结构BOM API: 操作浏览器 WebAPI 就包含了 DOM BOM,这个是 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电脑,从macos转像windows不容易啊,因为键盘快捷键经常弄错,这篇文章就是修改Typora中字体显示的问题。 正文内容 我发现在windows中,字体非常的难看,微软雅黑也太丑了…...

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

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

outlook是什么软件outlook邮箱撤回邮件方法
Outlook是微软公司开发的一款邮件客户端,也是Office办公套件的一部分。它可以与多个电子邮件服务提供商(如Outlook.com、Exchange、Gmail等)集成,用户可以使用Outlook来发送、接收和管理电子邮件、日历、联系人、任务等信息。本篇…...

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

vue使用百度富文本
🔥博客主页: 破浪前进 🔖系列专栏: Vue、React、PHP ❤️感谢大家点赞👍收藏⭐评论✍️ 1、下载UEditor 链接已放到文章中了 2、上传到项目目录中 一般上传到public下,方便到时候打包进去,以免…...

【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、配置各个模块(微服务)的 Dockerfile 2、配置 docker-compose.yml 文件 3、Maven 打包 4、文件整合并传输 三、微服务部署 1、部署至 Docker 2、访问微服务 四…...

阿里面试:让代码不腐烂,DDD是怎么做的?
说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: 谈谈你的高并发落地经验? 谈谈你对DDD的理解…...

NoSQL数据库使用场景以及架构介绍
文章目录 一. 什么是NoSQL?二. NoSQL分类三. NoSQL与关系数据库有什么区别四. NoSQL主要优势和缺点五. NoSQL体系框架 其它相关推荐: 系统架构之微服务架构 系统架构设计之微内核架构 鸿蒙操作系统架构 架构设计之大数据架构(Lambda架构、Kap…...

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

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

vue3中,使用html2canvas截图包含视频、图片、文字的区域
需求:将页面中指定区域进行截图,区域中包含了图片、文字、视频。 第一步,先安装 npm install html2canvas第二步,在页面引入: import html2canvas from html2canvas;第三步,页面使用: 1&…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...