【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.xdnf.cn/news/823870.html

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

相关文章

DES加密算法优缺点大揭秘:为何它逐渐被取代?

一、引言 DES&#xff08;Data Encryption Standard&#xff09;加密算法作为一种历史悠久的对称加密算法&#xff0c;自1972年由美国国家标准局&#xff08;NBS&#xff09;发布以来&#xff0c;广泛应用于各种数据安全场景。本文将从算法原理、优缺点及替代方案等方面&#…

在线电路仿真分析 : CircuitJS + EveryCircuit + 嘉立创EDA

CircuitJS CircuitJS是一款免费的在线电路仿真工具。绿色&#xff1a;正电压&#xff0c;红色&#xff1a;负电压&#xff0c;黄色&#xff1a;电流。 EveryCircuit EveryCircuit 是一个易于使用、高度交互的电路模拟器和 原理图捕获工具。其用户社区创建了数百万个电路设计。动…

{MySQL}索引事务和JDBC

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、索引1.1索引是什么1.2作用1.3代码 二、事务2.1什么是事务2.2使用 三.JDBC总结 前言 接着上次&#xff0c;继续讲下MySQL 提示&#xff1a;以下是本篇文章正…

行人重识别(ReID)基础知识入门

这里写目录标题 1、ReID技术概述1.1 基本原理1.2 实现流程1.3 重识别存在的技术挑战 2、训练数据格式介绍 1、ReID技术概述 1.1 基本原理 ReID&#xff0c;全称Re-identification&#xff0c;目的是利用各种智能算法在图像数据库中找到与要搜索的目标相似的对象。ReID是图像检…

ubuntu下编译obs-studio遇到的问题记录

参考的是这篇文档&#xff1a;Build Instructions For Linux obsproject/obs-studio Wiki GitHub 在安装OBS dependencies时&#xff0c; sudo apt install libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev libswresample-dev libswscale-d…

【Kubernetes】什么是 kubectl ?

什么是 kubectl &#xff1f; 1.什么是 kubectl &#xff1f;2.Kubernetes 内部结构3.Kubernetes API 的作用 1.什么是 kubectl &#xff1f; 在学习如何更有效地使用 kubectl 之前&#xff0c;您应该对它是什么以及它如何工作有一个基本的了解。从用户的角度来看&#xff0c;…

软件设计师——数据库系统(三)

&#x1f4d1;前言 本文主要是【数据库系统】——软件设计师——数据库系统的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1…

设计模式(4)--对象行为(8)--状态

1. 意图 允许一个对象在其内部状态改变时改变它的行为。 2. 三种角色 上下文环境(Context)、抽象状态(State)、具体状态(Concrete State) 3. 优点 3.1 将与特定状态相关的行为局部化&#xff0c;并且将不同状态的行为分割开来。 3.2 使得状态转换显式化。 3.3 State对象可被共…

探索 3D 图形处理的奥秘

最近一年多来&#xff0c;在 3Dfx、Intel 们的狂轰滥炸中&#xff0c;在 Quake、古墓丽影们的推波助澜下&#xff0c;三维图形已经成为计算机迷眼中的又一个热点。3D 世界到底是怎样的神奇&#xff0c;我们又是怎样享受它的乐趣呢&#xff1f;就让我们来一探究竟吧。 图形基础…

Halcon纹理分析texture_laws/trans_from_rgb

Halcon纹理分析 文章目录 Halcon纹理分析1. 纹理滤波器2. 织物折痕检测 纹理是图像表面的一种灰度变化。有的纹理很规则&#xff0c;会以局部小区域为单元重复出现&#xff0c;而有的纹理则呈现出随机性。对于规则的纹理&#xff0c;可以很容易地从中分辨出重复的区域&#xff…

二级路由的配置以及注意项

二级路由 比如说LayOut组件是父亲&#xff0c;LayOut和ArtComp是儿子&#xff0c;那我们怎么给儿子配路由呢&#xff1f; 1、首先在router下的index.js导入组件&#xff0c;配置规则&#xff0c;详细如下 // 导入路由相关组件 import LayOut from /views/LayOut import UserC…

C#中使用as关键字将对象转换为指定类型

目录 一、定义 二、示例 三、生成 使用as关键字可以将对象转换为指定类型&#xff0c;与is关键字不同&#xff0c;is关键字用于检查对象是否与给定类型兼容&#xff0c;如果兼容则返回true&#xff0c;如果不兼容则返回false。而as关键字会直接进行类型转换&#xff0c;如果…

【VS】NETSDK1045 当前 .NET SDK 不支持将 .NET 6.0 设置为目标。

问题描述 报错 NETSDK1045 严重性代码说明项目文件行禁止显示状态错误NETSDK1045当前 .NET SDK 不支持将 .NET 6.0 设置为目标。请将 .NET 5.0 或更低版本设置为目标&#xff0c;或使用支持 .NET 6.0 的 .NET SDK 版本。RCSoftDrawMicrosoft.NET.TargetFrameworkInference.ta…

【每日一题】一周中的第几天

文章目录 Tag题目来源解题思路方法一&#xff1a;模拟 写在最后 Tag 【模拟】【数学】【2023-12-30】 题目来源 1185. 一周中的第几天 解题思路 方法一&#xff1a;模拟 思路 题目中的日期是在 1971 到 2100 年之间的有效日期&#xff0c;即 1971-01-01 到 2100-12-31 范围…

精致旅游公司Treker网页设计 html模板

一、需求分析 旅游网站通常具有多种功能&#xff0c;以下是一些常见的旅游网站功能&#xff1a; 酒店预订&#xff1a;旅游网站可以提供酒店预订服务&#xff0c;让用户搜索并预订符合其需求和预算的酒店房间。 机票预订&#xff1a;用户可以通过旅游网站搜索、比较和预订机票…

前端 js 基础(2)

js For In for in 循环遍历 person 对象每次迭代返回一个键 (x)键用于访问键的值键的值为 person[x] 如果索引顺序很重要&#xff0c;请不要在数组上使用 for in。 索引顺序依赖于实现&#xff0c;可能不会按照您期望的顺序访问数组值。 当顺序很重要时&#xff0c;最好使用 f…

c++哈希表——超实用的数据结构

文章目录 1. 概念引入1.1 整数哈希1.1.1 直接取余法。1.1.2 哈希冲突1.1.2.1 开放寻址法1.1.2.2 拉链法 1.2 字符串哈希 3.结语 1. 概念引入 哈希表是一种高效的数据结构 。 H a s h Hash Hash表又称为散列表&#xff0c;一般由 H a s h Hash Hash函数(散列函数)与链表结构共同…

[电磁学]猴博士不挂科

1 利用表格求场强 2 利用叠加求场强 3 利用积分求场强 电场立库仑力 球的面积公式是4πr&#xff0c;其中r为球的半径。 球的体积公式是(4/3)πr&#xff0c;其中r为球的半径。 带电物体有体积:

数据采集遇到验证码校验的一般破解方式简述

背景 百度自动采集是一种高效的数据采集方法&#xff0c;但是在采集过程中经常会遇到图片验证码的问题&#xff0c;从而导致采集失败。那么有没有什么方法可以绕过图片验证呢&#xff1f;本文将为您详细介绍。 解决方案 一、使用OCR技术识别验证码 OCR技术可以识别图片中的…

【AI生活】“智能家居:要便利,也要隐私保护“

智能家居&#xff1a;要便利&#xff0c;也要隐私保护 在数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;已经深入到我们的生活中&#xff0c;为我们带来了极大的便利。从智能家居到自动驾驶&#xff0c;从智能医疗到智能金融&#xff0c;AI正以前所未有的速度和规…