【C/C++笔试练习】sort排序、STL容器、vector的特性、一级容器、迭代器失效、异常捕获、动态转换、统计每个月兔子的总数、字符串通配符

文章目录

  • C/C++笔试练习
  • 选择部分
    • (1)sort是不稳定排序
    • (2)存放即有序的STL容器
    • (3)连续储存的STL容器
    • (4)vector的特性
    • (5)一级容器
    • (6)unordered_map和priority_queue的底层
    • (7)迭代器失效
    • (8)异常捕获
    • (9)动态转换
    • (10)多态的实现
  • 编程题 day18
    • 统计每个月兔子的总数
    • 字符串通配符

C/C++笔试练习

选择部分

(1)sort是不稳定排序

  以下关于STL的描述中,()是错的

  A. STL容器是线程不安全的
  B. 当容量不够时,STL的一个典型实现是vector内部内存扩展方式为翻倍
  C. std::sort是稳定排序
  D. std::bitset不是一个STL容器

  答案:C

  A.STL容器并不是线程安全的。 如果在多个线程中同时修改同一个STL容器,可能会导致未定义的行为。为了在多线程环境中安全地使用STL,需要处理同步,或者使用某些线程安全的STL变体。

  B.std::vector 的一个常见实现策略是当其容量不足以容纳更多元素时,会按2倍扩容(Linux下)或者1.5扩容(VS下)。 这样做的目的是为了减少重新分配和复制元素的次数,从而提高性能。

  C.std::sort 不是稳定的。sort的底层是插入排序和快速排序结合的算法,稳定排序意味着相等的元素在排序后保持其原始顺序,快排不满足稳定排序的特点。

  D.std::bitset是一个位集合,它只能存储二进制位, 所以不能叫做容器。

  

(2)存放即有序的STL容器

  以下STL的容器存放的数据,哪个肯定是排好序的()

  A. vector
  B. deque
  C. list
  D. map

  答案:D

  map的底层为平衡搜索树(红黑树),会默认根据数据的键对值排序。

  

(3)连续储存的STL容器

  以下哪种STL容器中的对象是连续存储的()

  A. list
  B. vector
  C. map
  D. set

  答案:B

  list是一个双向链表,它的元素是通过链表节点连续存储的,但这种连续不是物理内存上的连续。vector是一个动态数组,它的元素在物理内存中是连续存储的。

  map是一个关联容器,它使用红黑树(或某些其他平衡二叉搜索树)来存储元素。元素在物理内存中不是连续存储的。set和map 类似。

  

(4)vector的特性

  STL中的哪种结构在增加成员时可能会引起原有成员的存储位置发生改变()

  A. map
  B. set
  C. list
  D. vector

  答案:D

  list是一个双向链表。在链表中增加一个新元素时,不会改变已有元素的存储位置。vector是一个动态数组。当向vector 中添加一个新元素时,它可能需要重新分配内存并移动所有元素到新的内 存位置,从而改变它们的存储位置。

  map是一个关联容器,它使用红黑树(或某些其他平衡二叉搜索树)来存储元素。在增加一个新元素时,可能会引起树结构的调整,但不会改变已有元素的存储位置。set和map 类似。

  

(5)一级容器

  STL中的一级容器有:

  A. vector, deque, list, set, multiset, map, multimap.
  B. 序列容器,关联容器,容器适配器
  C. set, multiset, map, multimap.
  D. vector, deque, list.

  答案:D

  一级容器:数据类型不能是组合类型,只能是内置类型的容器。
  如:vector<int>; vector<vector<int>>;

  注意:pair,key-value值对结构也是组合类型:map<int,string>;

  所以属于STL一级容器的是vector, deque, list。

  

(6)unordered_map和priority_queue的底层

  STL中的unordered_map和priority_queue使用的底层数据结构分别是什么()

  A. rbtree,queue
  B. hashtable,heap
  C. rbtree,heap
  D. hashtable,queue

  答案:B

  unordered_map: 使用哈希表(hashtable)作为其底层数据结构。

  priority_queue: 使用堆(heap)作为其底层数据结构。

  

(7)迭代器失效

  下面关于迭代器失效的描述哪个是错误的()

  A. vector的插入操作不会导致迭代器失效
  B. map的插入操作不会导致迭代器失效
  C. vector的删除操作只会导致指向被删除元素及后面的迭代器失效
  D. map的删除操作只会导致指向被删除元素的迭代器失效

  答案:A

  A. 当在vector中进行插入操作时,迭代器可能失效。特别是当插入发生在容器中间或末尾时,它可能会导致需要重新分配内部存储,从而让指向向量中间元素的迭代器变得无效。

  B.map的插入操作不会使迭代器失效,因为map的内部是平衡树结构。

  C.当从vector中删除一个元素时,指向被删除元素和其后面的元素的迭代器会失效,但是前面的元素不会失效。

  D.map的删除操作只会使指向被删除元素的迭代器失效。

  

(8)异常捕获

  如何捕获异常可以使得代码通过编译?

class A {
public:A(){}
};void foo(){throw new A;
}

  A. catch (A && x)
  B. catch (A * x)
  C. catch (A & x)
  D. 以上都是

  答案:B

  A.catch (A && x)这是一个右值引用捕获,它捕获的是对象(例如new A返回的指针)的移动语义。但是,throw new A;语句抛出一个动态分配的A类型的对象,而不是移动语义。因此,此选项是错误的。

  B. catch (A * x)这是一个指针捕获,它能够捕获动态分配的对象,如new A。这是正确的捕获方式。

  C. catch (A & x)这是一个引用捕获,它通常用于捕获基本数据类型或静态分配的对象。对于动态分配的对象,引用捕获是不适用的,因为它们不能被移动或复制。因此,此选项是错误的。

在这里插入图片描述

  

(9)动态转换

  有如下程序段:

#include <iostream>
using namespace std;class A {
public:~A() {cout << "~A()";}
};class B{
public:virtual ~B() {cout << "~B()";}
};class C: public A, public B {
public:~C() {cout << "~C()";}
};int main() {C * c = new C;B * b1 = dynamic_cast<B *>(c);A * a2 = dynamic_cast<A *>(b1);delete a2;
}

  则程序输出:

  A. ~C() ~B() ~A()
  B. ~C() ~A() ~B()
  C. A)B)都有可能
  D. 以上都不对

  答案:D

int main() {C* c = new C;//1.构造对象C,C是由A,B继承得来的B* b1 = dynamic_cast<B*>(c);//2.B类型指针b1动态转换为c,这里没有问题,父类指针指向子类A* a2 = dynamic_cast<A*>(b1);//3.A类型指针a2动态转换为B类型的指针b1delete a2;//4.释放子类C,但是A类型和B类型没有任何继承关系,导致程序崩溃
}

在这里插入图片描述

  

(10)多态的实现

  以下程序输出结果是____

class A
{
public:A ():m_iVal(0){test();}virtual void func() { std::cout<<m_iVal<<‘ ’;}void test(){func();}
public:int m_iVal;
};class B : public A
{
public:B(){test();}virtual void func(){++m_iVal;std::cout<<m_iVal<<‘ ’;}
};int main(int argc ,char* argv[])
{A*p = new B;p->test();return 0;
}

  A. 1 0
  B. 0 1
  C. 0 1 2
  D. 2 1 0
  E. 不可预期
  F. 以上都不对

  答案:C

class A
{
public:A() :m_iVal(0) { test(); }//1.1先构造父类对象,调用test(),此时的m_iVal为0virtual void func() { std::cout << m_iVal << ' '; }//1.3打印m_iVal,打印0    					  //1.5虚函数调用子类的func()  void test() { func(); }//1.2调用func()   //1.4此时虚表生成,调用func()    //2.1同理调用子类虚函数,打印2
public:int m_iVal;
};class B : public A
{
public:B() { test(); }//1.3再构造子类对象,调用父类的test()virtual void func()//1.6m_iVal++,打印1{++m_iVal;std::cout << m_iVal << ' ';}
};int main(int argc, char* argv[])
{A* p = new B;//1.创建子类对象B,A父类指针p指向子类对象,多态的信号p->test();//2.父类指针调用函数test()return 0;
}

在这里插入图片描述

            

编程题 day18

统计每个月兔子的总数

统计每个月兔子的总数

  解题思路:第n个月的兔子数量由两部分组成,一部分是上个月的兔子f(n-1),另一部是满足3个月大的兔子,会生一只兔子f(n-2)。所以第n个月兔子总数: f(n) = f(n - 1) + f(n - 2)。本题是在变相考察斐波那契数列。

#include<iostream>
using namespace std;/*
//迭代法求解
int Fib(int n)
{if(n <= 2)return 1;int f, f1=1, f2=1;for(int i=3; i<=n; ++i){f = f1 + f2;f1 = f2;f2 = f;}return f;
}
*///递归法求解
int Fib(int n) 
{if (n <= 2)return 1;elsereturn Fib(n - 1) + Fib(n - 2);
}int main() 
{int month;int sum = 0;while (cin >> month) {sum = Fib(month);cout << sum << endl;}return 0;
}

  

字符串通配符

字符串通配符

  解题思路:本题可以通过递归求解。从前向后一次匹配,遇到相同字符,都向后移动一个字符,如果通配符遇到"?“,则不需匹配,自动跳过一个字符,如果通配符遇到”*",则可以匹配任意多个字符,包括0个,此时可以有三种选择,1,匹配0个,通配符向后移动一个字符,字符串不动。2,匹配1个,通配符和字符串都向后移动一个字符。3,匹配多个,通配符不动,字符串向后移动一个字符。递归的终止条件:通配符或者字符串遇到’\0’。当他们同时结束。

#include<iostream>
#include<string>
#include<vector>
#include<ctype.h>
using namespace std;bool Match(const string& patter, const string& str, int i, int j)
{if(i == patter.size() && j == str.size()){   return true;}if(i == patter.size() || j == str.size()){return false;}if(patter[i] == '?'){if(!isdigit(str[j]) && !isalpha(str[j])){return false;}return Match(patter, str, i + 1, j + 1);}else if(patter[i] == '*'){while(patter[i] == '*'){i++;}i--;if(!isdigit(str[j]) && !isalpha(str[j])){return Match(patter, str, i + 1, j);}return Match(patter, str, i + 1, j) //匹配0个|| Match(patter, str, i + 1, j + 1)//匹配一个|| Match(patter, str, i, j + 1)//匹配n个;}else if(tolower(patter[i]) == tolower(str[j])){return Match(patter, str, i + 1, j + 1);}else {return false;}
}int main()
{string s1;getline(cin, s1);string s2;getline(cin, s2);if(Match(s1, s2, 0, 0)) cout<<"true"<<endl;elsecout<<"false"<<endl;return 0;
}

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

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

相关文章

PLC-IoT 网关开发札记(1):存档和分发 Android App

开篇记 PLC-IoT 网关是作者开发的产品&#xff0c;根据客户需求&#xff0c;立项开发手机 App&#xff0c;为用户提供一种方便、直观、友好的设备操控方式。网关运行的是嵌入式 Linux 操作系统&#xff0c;计划通过某一种通信协议&#xff08;例如 HTTP&#xff0c;MQTT或者 T…

大数定律中心极限定理

1.切比雪夫不等式 切比雪夫不等式可以对随机变量偏离期望值的概率做出估计&#xff0c;这是大数定律的推理基础。以下介绍一个对切比雪夫不等式的直观证明。 1.1 示性函数 对于随机事件A&#xff0c;我们引入一个示性函数 I A { 1 , A发生 0 , A不发生 I_A\begin{cases} 1&…

Chrome浏览器进程工作原理和机制

Chrome浏览器进程工作原理和机制 Chrome架构&#xff1a;一个页面四个进程进程和线程单进程浏览器多进程浏览器多进程浏览器解决的问题Chrome的进程模式 TCP协议&#xff1a;如何保证页面文件被完整送达浏览器IP&#xff1a;把数据包送达目的主机UDP&#xff1a;把数据包送达应…

vivado CDC约束-约束总线偏移

CDC限制 关于CDC约束 时钟域交叉&#xff08;CDC&#xff09;约束适用于具有不同启动和捕获时钟。根据发布和捕获时钟关系以及在CDC路径上设置的定时异常。例如同步时钟之间但被错误路径约束覆盖的CDC路径不定时&#xff0c;并且因此被视为异步CDN。异步CDC路径可以是安全的&…

vue 导出 HTML 结构为 Word 文档(.docx)-支持表格、css样式、图片

在 Web 开发中&#xff0c;有时我们希望用户能够将网页上的 HTML 内容保存为 Word 文档&#xff0c;以便更方便地分享和打印。本文将介绍如何使用 html-docx-js 和 file-saver 这两个 JavaScript 库&#xff0c;实现将 HTML 结构导出为 Word 文档的功能。 工具简介 1. html-d…

lv13 内核模块参数和依赖

1 模块传参 1.1 模块参数设置 将指定的全局变量设置成模块参数 module_param(name,type,perm);//将指定的全局变量设置成模块参数 /* name:全局变量名 type&#xff1a;使用符号 实际类型 传参方式bool bool insmod xxx.ko 变量名0 …

进阶学习——Linux系统磁盘管理与文件系统

目录 一、磁盘 1.认识磁盘 2.分区 2.1MBR&#xff08;Master Boot Record&#xff09;——主引导记录 2.2GPT分区 2.3磁盘分区结构 3.文件系统 3.1文件系统组成 3.1.1XFS ext4 3.1.2swap 3.1.3FAT16、FAT32 3.1.4NTFS&#xff08;xfs&#xff09; 3.1.5EXT4 3…

[Angular] 笔记 9:list/detail 页面以及@Output

1. Output input 好比重力&#xff0c;向下传递数据&#xff0c;list 传给 detail&#xff0c;smart 组件传给 dumb 组件&#xff0c;父组件传给子组件。input 顾名思义&#xff0c;输入数据给组件。 output 与之相反&#xff0c;好比火箭&#xff0c;向上传递数据或事件。ou…

云计算IaaS、PaaS和SaaS之

提供的服务来比较如下两图 示例图 示例图

整数规划-割平面法

整数规划-割平面法 割平面法思想Gomorys割平面法原理实例 谨以此博客作为学习期间的记录。 割平面法思想 在之前&#xff0c;梳理了分支定界法的流程:分支定界法 除了分支定界法&#xff0c;割平面法也是求解整数规划的另一个利器。 我们已经知道&#xff0c;线性规划的可行域…

vscode软件安装步骤

目录 一、下载软件安装包 二、运行安装包后 一、下载软件安装包 打开vscode官方网址&#xff0c;找到下载界面 链接如下&#xff1a;Download Visual Studio Code - Mac, Linux, Windows 我是windows电脑&#xff0c;各位小伙伴自己选择合适的版本&#xff0c;点击下载按钮…

基于虚拟机ubuntu的linux和shell脚本的学习,以及SSH远程登陆实战

简介 特点 是一款操作系统,跟windows,macos一样,有下面的特点 简单和高效,一切皆文件,所有配置都通过修改文件解决,不需要繁琐的权限和设置 权限高,把所有细节都交给用户,可完全自定义 安全,所有程序只有自己执行才会启动 分类 1、debian系主要有Debian&#xff0c;Ubun…

ESP32入门六(读取引脚的模拟信号[3]:信号出现误差的原因[硬件篇])

在之前的文章中&#xff0c;我们介绍了ESP32在读取模拟信号时出现的误差的软件方面原因&#xff0c;在这一篇中&#xff0c;将会介绍并测试由于硬件或其它方面导致数据出现误差的原因。 一、厂商原因 首先&#xff0c;我们需要知道&#xff0c;在每块EPS32中&#xff0c;在出…

海凌科HLK-V2语音识别模块更新词条

简介 HLK-V20 是海凌科的离线语音识别模块, 中英文不同时支持, 只支持中文/英文, 具体识别看每次的SDK更新设置;资料下载 可以在微信公众包搜索海凌科或HI-LINK, 下载资料 感知模块->HLK-V20 模块限制 中英文被限制, 需要根据你在官网设置的SDK信息进行确定;可以仅设置3…

goframe v2 模板引擎的用法

这里用的goframe v2框架 提醒&#xff1a;下面的import 引入的控制器和api&#xff0c;根据自己实际项目路径 main函数 import ("context""github.com/gogf/gf/v2/net/ghttp""github.com/gzdzh/dzhgo/modules/dzhCms/controller/web""gith…

STM32移植LVGL图形库

1、问题1&#xff1a;中文字符keil编译错误 解决方法&#xff1a;在KEIL中Options for Target Flash -> C/C -> Misc Controls添加“--localeenglish”。 问题2&#xff1a;LVGL中显示中文字符 使用 LVGL 官方的在线字体转换工具&#xff1a; Online font converter -…

深入浅出理解TensorFlow的padding填充算法

一、参考资料 notes_on_padding_2 二、TensorFlow的padding算法 本文以TensorFlow v2.14.0版本为例&#xff0c;介绍TensorFlow的padding算法。 1. 引言 tf.nn.conv2d and tf.nn.max_pool2d 函数都有padding参数&#xff0c;在执行函数之前&#xff0c;都需要进行填充padd…

数字资产学习笔记

附&#xff1a;2023年数据资源入表白皮书下载&#xff1a; 关注WX公众号&#xff1a; commindtech77&#xff0c; 获得数据资产相关白皮书下载地址 1. 回复关键字&#xff1a;数据资源入表白皮书 下载 《2023数据资源入表白皮书》 2. 回复关键字&#xff1a;光大银行 下载 光…

基于 Vue3 和 WebSocket 实现的简单网页聊天应用

首先附上项目介绍,后面详细解释技术细节 1. chat-websocket 一个基于Vue3和WebSocket的简易网络聊天室项目&#xff0c;包括服务端和客户端部分。 项目地址 websocket-chat 下面是项目的主要组成部分和功能&#xff1a; 项目结构 chat-websocket/ |-- server/ # WebSocket 服…

二分查找(非朴素)--在排序数组中查找元素的第一个和最后一个位置

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 本题链接 输入描述 输出描述 算法分析 1.算法一&#xff1a;暴力求解 2.算法二&#xff1a;朴素二分算法 3.算法三&#xff1a;二分查找左右端点 3.1查找左端点 3.1.1细节一&#xff1a;循环条件 3.1.2细节二…