C++面试常见八股分享

在这里插入图片描述

1.unordered_set和set,unordered_map和map的区别

setmap 是 C++ STL 中的两种关联容器,而 unordered_setunordered_map 是 C++11 新增的基于哈希表的关联容器。它们之间的主要区别在于底层的数据结构和操作复杂度。

  1. setunordered_set

    • set 是一个基于红黑树实现的有序集合,其中的元素按照一定的排序规则进行排列。
    • unordered_set 是基于哈希表实现的无序集合,元素没有特定的顺序,但插入、查找和删除操作的平均时间复杂度为 O(1)。
    • 因此,如果对集合中的元素有顺序要求,可以使用 set;如果不需要顺序,并且对查找性能有较高要求,可以选择 unordered_set
  2. mapunordered_map

    • map 是一个基于红黑树实现的有序键值对容器,其中的键值对按照键的大小进行排序。
    • unordered_map 是基于哈希表实现的无序键值对容器,键值对没有特定的顺序,但插入、查找和删除操作的平均时间复杂度为 O(1)。
    • 类似地,如果对键值对有顺序要求,可以使用 map;如果不需要顺序,并且对查找性能有较高要求,可以选择 unordered_map

总的来说,unordered_setunordered_map 在插入、查找和删除操作的平均时间复杂度上具有更好的性能,但不保证元素的顺序;而 setmap 则提供了有序的元素访问。在选择使用时,可以根据实际需求和性能要求来进行选择。

2.哈希表和红黑树

哈希表和红黑树是两种常见的数据结构,用于实现集合、映射等关联容器。它们在实际应用中具有不同的特点和适用场景。

  1. 哈希表(Hash Table):

    • 哈希表是一种通过哈希函数将键映射到数组索引的数据结构。它的特点是可以实现快速的插入、查找和删除操作,时间复杂度接近 O(1)。
    • 哈希表的核心是哈希函数,它能够将键映射到数组的索引位置。理想情况下,哈希函数能够将键均匀地映射到数组中,避免产生冲突。
    • 哈希表在实际应用中广泛使用,例如 C++ STL 中的 unordered_setunordered_map 就是基于哈希表实现的。
  2. 红黑树(Red-Black Tree):

    • 红黑树是一种自平衡的二叉搜索树,它保持了良好的平衡性质,因此能够保证插入、删除和搜索操作的最坏情况时间复杂度为 O(log n)。
    • 红黑树通过维护节点的颜色和执行旋转操作来保持平衡,确保树的高度保持在一个较小的范围内。
    • 红黑树在实际应用中常被用作关联容器的底层实现,例如 C++ STL 中的 setmap 就是基于红黑树实现的。

总的来说,哈希表适合于需要快速插入、查找和删除操作的场景,并且不要求元素有序;而红黑树适合于有序元素访问,并且需要保证插入、删除和搜索操作的稳定性和较低时间复杂度的场景。在实际使用中,根据具体应用的需求和特点,选择合适的数据结构来实现相应的功能。

3.B+树

B+树是一种常见的平衡树数据结构,被广泛应用于数据库和文件系统中。它相对于B树有一些特殊的设计,使得在磁盘上进行范围查询等操作时效率更高。

下面是关于B+树的详细介绍:

  1. 结构:

    • B+树由根节点、内部节点和叶子节点组成,其中内部节点用于索引和导航,叶子节点存储实际数据。
    • 所有叶子节点通过指针连接成一个有序链表,方便范围查询和遍历。
  2. 特点:

    • 所有数据条目都存储在叶子节点中,内部节点只包含索引信息,这样可以使得范围查询更加高效。
    • 叶子节点之间通过指针连接,形成有序的双向链表,方便范围查询和顺序遍历。
    • 内部节点的子节点数与索引数相同,提高了空间利用率。
  3. 操作:

    • 查找:从根节点开始,根据键值进行比较,沿着内部节点逐层搜索,直到找到对应的叶子节点。
    • 插入:首先按照查找操作找到要插入的位置,然后插入到叶子节点中,并保持树的平衡。
    • 删除:类似于插入操作,找到要删除的数据所在的叶子节点并删除,同时保持树的平衡。
  4. 优点:

    • B+树在磁盘存储和范围查询方面具有优势,因为每个节点存储的数据更多,减少了磁盘I/O次数。
    • 叶子节点之间有序连接,可以快速进行范围查询和遍历操作。

总的来说,B+树是一种高效的平衡树数据结构,特别适合在数据库和文件系统中应用,能够提高范围查询和顺序访问的效率,并且保持了良好的平衡性质和空间利用率。

4.虚函数和纯虚函数的区别

在C++中,虚函数和纯虚函数是面向对象编程中重要的概念,它们在面向对象设计中起着关键作用。下面是它们的区别:

  1. 虚函数(Virtual Function):

    • 虚函数是在基类中声明为虚函数的成员函数。当派生类继承并重写了这个虚函数时,在运行时将根据对象的实际类型来调用相应的函数。
    • 基类中的虚函数可以被派生类覆盖,即在派生类中重新定义同名的虚函数,这样在调用时会根据对象的实际类型来选择调用哪个版本的函数。
  2. 纯虚函数(Pure Virtual Function):

    • 纯虚函数是在基类中声明但没有实现的虚函数,通常在声明时使用“= 0”来表示。它要求任何继承自该基类的派生类都必须实现这个纯虚函数。
    • 含有纯虚函数的类称为抽象类,不能被实例化,只能作为基类来派生新的类。派生类必须实现基类中的纯虚函数,否则派生类也会变成抽象类。

总的来说,虚函数是在基类中声明为虚函数的成员函数,可以被派生类覆盖;而纯虚函数是没有实现的虚函数,要求派生类实现,并且含有纯虚函数的类是抽象类,不能被实例化。这两种函数在多态性和面向对象设计中起着非常重要的作用。

5.多态是如何实现的

在C++中,多态性通过虚函数来实现。当基类中的成员函数被声明为虚函数时,派生类可以覆盖这些虚函数,并在运行时根据对象的实际类型来调用相应的函数。这种机制称为动态多态性。

6.深拷贝和浅拷贝

下面是C++中深拷贝和浅拷贝的区别:

  1. 浅拷贝(Shallow Copy):

    • 浅拷贝是指将一个对象的值复制到另一个对象,包括对象中的基本数据类型和指针。如果对象中有指针指向堆内存,浅拷贝只会复制指针的地址,而不会复制指针指向的具体内容。
    • 当进行浅拷贝时,两个对象会共享同一块内存空间,如果其中一个对象修改了堆内存中的数据,另一个对象也会受到影响。
  2. 深拷贝(Deep Copy):

    • 深拷贝是指将一个对象的值以及其指向的动态分配的内存复制到另一个对象,包括对象中的基本数据类型和指针指向的动态内存。
    • 当进行深拷贝时,会创建一个新的内存空间,并将原对象中的数据复制到新的内存空间中,这样两个对象之间互不影响。

在C++中,如果类中包含指向动态分配内存的指针,通常需要实现深拷贝构造函数和赋值运算符重载函数,以确保在对象复制时不会出现内存访问问题。深拷贝会创建新的内存空间,从而避免了浅拷贝可能引起的指针悬挂和内存泄漏问题。

7.sort快排源码

快速排序的算法思想是分治思想,具体可以通过三步来实现;

  1. 确定分界点x:
    常用的取值分界点是: q[l] q[(l+r)/2] q[r];
  2. 调整区间(核心步骤):
    使分界点以左区间全部<=x,分界点以右区间全部>=x;
  3. 递归左右区间;
void quick_sort(int q[],int l,int r)
{
    if(l>=r)return;
    int x=q[l],i=l-1,j=r+1;
    while(i<j)
    {
        do i++;while(q[i]<x);
        do j--;while(q[j]>x);
        if(i<j)swap(q[i],q[j]);
    }
    quick_sort(q,l,j);
    quick_sort(q,j+1,r);
}

快速排序是一种常见的排序算法,其基本思想是通过选择一个基准值,将数组分割成小于基准值和大于基准值的两部分,然后对这两部分分别进行递归排序,最终完成整个数组的排序。

下面是代码中的快速排序的实现流程:

  1. 选择基准值x为数组q的第一个元素q[l]。
  2. 设置两个指针i和j,分别指向数组的左边界l和右边界r。
  3. 在while循环中,不断移动指针i和j,使得i指向第一个大于等于基准值x的元素,j指向第一个小于等于基准值x的元素。
  4. 如果i < j,则交换q[i]和q[j]的值,将大于基准值的元素放到右边,小于基准值的元素放到左边。
  5. 经过上述操作后,数组被基准值x分成两部分,[l, j]区间内的元素都小于等于x,(j, r]区间内的元素都大于x。
  6. 对左右两部分分别递归调用quick_sort函数,对左半部分排序quick_sort(q, l, j),对右半部分排序quick_sort(q, j+1, r)。

快速排序的时间复杂度为O(nlogn),其中n为数组的长度。它是一种高效的排序算法,在平均情况下表现较好。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

黑马程序员——接口测试——day05——Request库、Cookie、Session、UnitTest框架

目录&#xff1a; Requests库 Requests库安装和简介设置http请求语法应用案例 案例1案例2案例3案例4Cookie Cookie简介CookieSession认证方式案例5-看演示&#xff0c;此代码不需实现Session Session简介Session自动管理Cookie案例6面试题Cookie和Session区别获取指定响应数据…

云原生架构技术揭秘:探索容器技术的奥秘

云原生的概念和演进都是围绕云计算的核心价值展开的&#xff0c;比如弹性、自动化、韧性&#xff0c;所以云原生所涵盖的技术领域非常丰富。 随着云计算技术的不断发展&#xff0c;云原生架构已经成为了新一代软件开发的重要趋势。本文将为您介绍云原生架构的相关技术&#xf…

单片机精进之路-9ds18b20温度传感器

ds18b20复位时序图&#xff0c;先将b20的数据引脚拉低至少480us&#xff0c;然后再将数据引脚拉高15-60us&#xff0c;再去将测传感器的数据引脚是不是变低电平并保持60-240us&#xff0c;如果是&#xff0c;则说明检测到温度传感器&#xff0c;并正常工作。需要在240us后才能检…

鸿蒙真有前景吗?是真是假?

直到“纯血鸿蒙”发布&#xff0c;才看清华为真正的布局&#xff0c;这一招实在是高明&#xff01; “纯血鸿蒙”发布之前&#xff0c;国内大批人唱衰华为&#xff0c;唱衰鸿蒙系统的生态&#xff0c;认为大概率会走诺基亚和微软的老路&#xff0c;没想到“纯血鸿蒙”一经推出…

高质 智能 绿色低碳棒线材轧制 智能测径仪等亦起关键作用

第十一届棒线材会议围绕推动轧钢装备数字化、智能化、绿色化转型升级&#xff0c;实现高质量发展&#xff0c;高质量、智能化、绿色低碳主题&#xff0c;将于4月22-24日在贵州省六盘水市召开。这也是轧钢生产近几年的发展趋势。 在线棒材生产中&#xff0c;蓝鹏测控可提供三种类…

每天十条linux知识点-24-0226(1)

文章目录 1.在哪下载linux内核源码&#xff1f;2.linux文件夹都有哪些文件&#xff1f;arch&#xff1a;包含和硬件体系结构相关的代码&#xff0c;每种平台占一个相应的目录&#xff0c;如i386、arm、arm64、powerpc、mips等。block&#xff1a;块设备驱动程序I/O调度。certs&…

又降价啦!2024年腾讯云服务器优惠价格表,不看后悔!

腾讯云服务器多少钱一年&#xff1f;62元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器218元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;8核32G22M服务器115元1个月、345元3个月&#xff0c;腾讯云服务器网txyfwq.co…

高级语言期末2010级B卷(软件学院)

1.编写程序根据如下公式计算X的值&#xff08;精确到1e-5&#xff09;。 #include <stdio.h>int main(){int i1;double flag1.0/(2*i-1)*2.0*i/(2*i-1);double sum0;while(flag>1e-5){sumflag;i;flag1.0/(2*i-1)*2.0*i/(2*i-1);}printf("%lf",sum);return 0…

千兆单口(百兆双口)小体积 24PIN 网络变压器 H82409S 特点

Hqst华轩盛(石门盈盛)电子导读&#xff1a;千兆单口&#xff08;百兆双口&#xff09;小体积 24PIN 网络变压器 H82409S 特点 大家好&#xff0c;石门盈盛电子科技有限公司工程盛先生&#xff0c;今天向大家介绍石门盈盛电子科技有限公司的一款优势产品 - 千兆单口&#xff08;…

Docker(第四部分)

Docker微服务实战 通过IDEA新建一个普通微服务模块 把包放到linux机器里 pwd 通过dockerfile发布微服务部署到docker容器 dockerfile的内容 防火墙 Docker网络 网络主机 是什么&#xff1f; 网桥virbr0 常用基本命令 能干嘛 网络模式 最后都和u3一样了 结论&#xff1a;doc…

【Java程序设计】【C00329】基于Springboot的高校实习管理系统(有论文)

基于Springboot的高校实习管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的高校实习管理系统&#xff0c;本系统有管理员、公司、老师和学生四种角色&#xff1b; 管理员&#xff1a;个人中心、公司管理、…

故障排除:Failed to load SQL Modules into database Cluster

PostgreSQL 安装和故障排除 重新安装前的准备工作 在重新安装 PostgreSQL 之前&#xff0c;确保完成以下步骤&#xff1a; 重新卸载 PostgreSQL 并重启电脑。 删除以下目录&#xff1a; C:\Program Files\PostgreSQL\13C:\Users\admin\AppData\Roaming\pgadmin 重启安装过…

CentOS7——主机动态地址修改为静态地址

目录 1、查看本机的网络配置&#xff08;vmnet8网关&#xff09; 2、修改虚拟机主机网络信息配置文件 3、重启network服务使生效 4、测试 1、查看本机的网络配置&#xff08;vmnet8网关&#xff09; windows&#xff1a;“网络图标”——>“属性”——>“网络和共享中…

认识内部类

成员内部类 静态内部类 局部内部类 匿名内部类&#xff01;&#xff01;&#xff01;&#xff08;重点&#xff09; 匿名内部类在开发中常见的使用场景&#xff1a;通常作为一个参数传输给方法。

推荐系统经典模型YouTubeDNN代码

文章目录 前言数据预处理部分模型训练预测部分总结与问答 前言 上一篇讲到过YouTubeDNN论文部分内容&#xff0c;但是没有代码部分。最近网上教学视频里看到一段关于YouTubeDNN召回算法的代码&#xff0c;现在我分享一下给大家参考看一下&#xff0c;并附上一些我对代码的理解…

微信小程序真机调试:连接局域网失败ws://********:8001/失败,已切换回广域网模式的解决方式

这个问题大多数是由于系统上安装了虚拟网卡造成&#xff0c;只要禁用虚拟网卡即可查询方式&#xff1a;windx - 选择设备管理器 - 查看网络适配器&#xff0c;找到虚拟网卡禁用 重新勾选局域网模式进行调试即可

Go 互斥锁的实现原理?

Go sync包提供了两种锁类型&#xff1a;互斥锁sync.Mutex 和 读写互斥锁sync.RWMutex&#xff0c;都属于悲观锁。 概念 Mutex是互斥锁&#xff0c;当一个 goroutine 获得了锁后&#xff0c;其他 goroutine 不能获取锁&#xff08;只能存在一个写者或读者&#xff0c;不能同时…

Parallels Desktop安装虚拟机要执行此操作,您必须输入主机操作系统管理员认证凭据;执行该操作失败

弹窗1️⃣&#xff1a;执行此操作&#xff0c;您必须输入主机操作系统管理员认证凭据 桌面顶部点击《操作》点击《配置》 很多小伙伴在这一步又退回去重装了&#xff0c;其实不用&#xff0c;在配置里面设置就好了 弹窗2️⃣&#xff1a;执行该操作失败 设置如图&#xff1…

我写了个ImageWindow应用

文章目录 0 引言1 应用简介2 主要功能和特点2.1 多图像同/异步像素级对比2.2 支持多达30种图像格式2.3 高效率的图像处理性能 3 简明使用教程3.1 软件下载安装与更新3.1.1 软件下载与安装3.1.2 软件更新 3.2 多视窗添加并自动最优排列3.3 多样化图像导入方式3.4 自动切换显示模…

tinymce在vue3中的用法以及文本流式输出

一、版本 "tinymce/tinymce-vue": "4.0.5", "tinymce": "5.10.2", 二、步骤 具体步骤可以参考tinymce在vue2中的用法中的步骤 三、在项目index.html-body中引入tinymcejs <script src"tinymce/tinymce.min.js">&…