自动驾驶-机器人-slam-定位面经和面试知识系列09之C++STL面试题(04)

news2024/11/15 18:59:05

这个博客系列会分为C++ STL-面经、常考公式推导和SLAM面经面试题等三个系列进行更新,基本涵盖了自己秋招历程被问过的面试内容(除了实习和学校项目相关的具体细节)。在知乎和牛客(某些文章上会附上内推码)也会同步更新,全网同号(lonely-stone或者lonely_stone)。
关于高频面试题和C++ STL面经,每次我会更新10个问题左右,每次更新过多,害怕大家可能看了就只记住其中几个点。(在个人秋招面试过程中,面试到后面,发现除了个人项目和实习经历外,个人所记录的内容基本能涵盖面试官能问到的)
(另外个人才疏学浅,如果所分享知识中出现错误,请大家指出,避免误导其他人)

1. thread线程中的join和detach方法

  • join:比如在主线程里申明了线程t1,现在调用t1.join()就是要等待该子线程t1终止
  • detach:作用是将子线程和主线程的关联分离,也就是说detach()后子线程在后台独立继续运行,主线程无法再取得子线程的控制权,即使主线程结束,子线程未执行也不会结束。当主线程结束时,由运行时库负责清理与子线程相关的资源。

2. 条件变量condition_variable

头文件<condition_variable>
condition_variable 类是同步原语,能用于阻塞一个线程,或同时阻塞多个线程,直至另一线程修改共享变量(条件)并通知 condition_variable
通知线程:

  • 获得 std::mutex (典型地通过 std::lock_guard )
  • 在保有锁时进行修改
  • 在 std::condition_variable 上执行 notify_one 或 notify_all (不需要为通知操作保有锁)

等待线程:

  • 获得 std::unique_lockstd::mutex ,在与用于保护共享变量者相同的互斥上
  • 执行 wait 、 wait_for 或 wait_until ,等待操作自动释放上一步中锁上的互斥mutex,并悬挂线程的执行,等待条件变量
  • condition_variable 被通知时,时限消失或虚假唤醒发生,线程被唤醒,且自动重获得互斥。之后线程应检查条件,若唤醒是虚假的,则继续等待。

std::condition_variable 只可与 std::unique_lockstd::mutex 一同使用;此限制在一些平台上允许最大效率。 std::condition_variable_any 提供可与任何基础可锁 (BasicLockable) 对象,例如 std::shared_lock 一同使用的条件变量。

3. c++:reserve和resize简介和区别

简介:首先要知道capacity和size的概念,举一个例子,这里有半瓶1L的矿泉水。那么1L就是我们说的容量,也就是capacity,表示指容器在内存中开辟的存储空间的总大小。 半瓶,也就是500ML,也就是size,表示已经使用的空间大小。

reserve:void reserve( size_type n) ;

  • 如果n>capacity,那么就在内存空间重新分配一块更大的连续空间,然后将容器内所有的有效元素从旧空间的位置全部复制到新空间相应的位置,然后释放旧空间,指向新空间。
  • 如果n值小于容器的现有容量,那么这个函数没有任何作用。
  • 所以说:所以reserve函数的结果只是capacity变大,原本元素个数即size并没有变化。

resize:void resize (size_type n, const T& c = T());这里n是元素的个数,c是元素默认初始化的值。

  • 如果n>size,则在容器的末尾插入n-size()个初始值为c的元素,若如果没有指定初始值,那就用元素类型的默认构造函数来初始化。这里有可能capacity变大。
  • 如果n<size,则删除末尾的size()-n个元素,这样会导致size变小。但是在这种类型的容器在删除元素后并不会释放元素本身的内存空间,所以容器的容量capacity并没有改变。(一般不用这个函数进行删除操作)
  • n值等于当前容器的大小时,什么也不做。

4. C++ 之 Lambda

表达式c++11引入了Lambda表达式,使得开发人员可以更方便的创建匿名函数。Lambda表达式是c++语言的一个重要特性,它可以作为函数对象使用,可以用来替代一些繁琐的函数声明和定义。
一般情况下 Lambda 表达式不会这样使用的,而是和 STL 的一些算法结合使用。C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。
使用 Lambda 表达式的两点优势:

  • 函数对象定义在调用的地方,直接看到上下文,可读性更强,方便修改;
  • Lambda 表达式可访问作用域内的任何变量,代码简洁。

当然,使用 Lambda 表达式的前提是 函数体足够简单,只有一两行。当函数体复杂时,还是推荐使用常规函数。
[captures](params) -> return_type { body }; [捕获列表] (函数参数) mutable 或 exception 声明 -> 返回值类型 {函数体}

捕获列表是 Lambda 表达式最有意思的地方,这里重点介绍下捕获列表。
捕获列表,用来说明外部变量的访问方式,外部变量访问方式说明符可以是 = 或 & ,表示函数体中用到的、定义在外面的变量在函数体中是否允许被改变。= 表示值传递,不允许改变。& 表示引用传递,允许改变。
包括下面几种形式:

  • 中括号[ ] 表示不捕获任何变量
  • [=] 表示按值传递的方法捕获父作用域的所有变量
  • [&] 表示按引用传递的方法捕获父作用域的所有变量
  • [=, &a] 表示按值传递的方法捕获父作用域的所有变量,但按引用传递的方法捕获变量a
  • [&, a] 表示按引用传递的方法捕获父作用域的所有变量,但按值传递的方法捕获变量a

比如,生成一个 vector,里面是随机数,一种是使用常规函数 my_rand()

5. C++智能指针

智能指针不是指针,是一个管理指针的类,用来存储指向动态分配(堆)对象的指针,负责自动释放动态分配的对象,防止堆内存泄漏。用于生存期的控制,能够确保在离开指针所在作用域时,自动地销毁动态分配的对象,防止内存泄露。
智能指针的核心实现技术是引用计数,每使用它一次,内部引用计数加1,每析构一次内部的引用计数减1,减为0时,删除所指向的堆内存。
C++11中提供了三种智能指针,使用这些智能指针时需要引用头文件
在这里插入图片描述

6. 面试手撕~局部窗口滑动求中位数

原本的算法题是局部窗口滑动求最大值,变成了局部窗口滑动求中位数

在求最大值的时候是采用deque的方法,现在在求中位数的时候是在自定义类里面采用两个multiset实现的,大家可以自己模拟做一做。

7. 父类的私有成员可以被继承吗?

父类中的私有属性其实在子类中是可以继承的,因为在子类的对象中,实例数据也加载了父类中的私有属性,只是我们不能访问而已。

8. 如何防止内存泄露

内存泄露指的是在程序运行过程中,由于某种原因导致程序无法释放已经不再使用的内存,从而导致系统内存资源的浪费。防止内存泄露的方法包括:
使用引用计数机制:在程序中维护对象的引用计数,当引用计数为 0 时,表示对象不再被使用,可以将其回收。

  • 使用垃圾回收机制:在程序中使用垃圾回收器,定期扫描内存中的对象,并回收不再使用的对象。
  • 注意内存管理:在使用动态内存分配时,要记得在使用完后及时释放内存,避免出现内存泄露。
  • 使用内存池:在程序中使用内存池,可以有效的避免内存泄露的问题。
  • 使用调试工具:在程序开发过程中,使用调试工具(如 Valgrind)可以帮助我们检测内存泄露的问题。

9. 简述对原子变量了解

原子变量是一种特殊的变量,它可以在多线程环境中提供原子操作的保障。也就是说,在执行原子变量的操作时,不会被中断,从而保证操作的原子性。原子变量通常用于多线程环境中的计数器、计时器等场景,可以避免竞争条件的出现。

10. unordered_map桶大小相关

调用 rehash 函数会使 unordered_map 的桶数量增加,我们可以自己调用。
但是有几个注意事项:

  • 调用rehash可能会使迭代器失效,需要重新进行获取迭代器
  • 手动指定桶大小时,一般是选择2的幂次方,因为过小会导致哈希冲突过多,过大会导致内存浪费。
  • rehash可以多次调用,但是频繁调用会影响性能。

11. c++性能优化手段

  • 使用const:可以告诉编译器一个变量的值不应该被改变,这样可以提高性能,编译器可以进行一些优化,同时不变也能避免一些错误。
  • 使用inline关键字:如果一个函数被内联,那么每次调用这个函数的时候,就会用函数体来替换调用语句,而不是跳转到函数所在的内存位置进行调用,这样减少函数调用的开销。
  • 避免频繁进行内存分配和释放:对象池技术,是在内存中预先分配一块区域,用于存储特定类型的对象,当需要新的对象时,直接从对象池里获取,而不是用new分配新内存,当对象不再使用可以将其返回到对象池,而不是使用delete立即释放。这样可以减少内存分配时释放的频率,提高性能。
  • 在某些情况下,使用引用而非直接的值:
    • 如果函数要接受一个大的对象作为参数,那么使用引用而不是按值传递可以避免复制这个对象,提高性能。
    • 此外,在函数要返回一个大的对象的时候,也使用引用的话可以避免复制这个对象
  • 某些情况下,使用迭代器可能比使用指针更优:使用编译器自带的优化选项

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

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

相关文章

鸿蒙(API 12 Beta3版)【HDR Vivid视频录制】 音视频编码

开发者可以调用本模块的Native API接口&#xff0c;实现在视频录制中支持HDR Vivid标准。 视频录制的主要流程是“相机采集 > 编码 > 封装成mp4文件”。 HDR Vivid视频编码 应用创建H265编码器&#xff0c;配置profile(main 10)相机底层包含HDR Vivid的surfacebuffer内…

Airtest 的使用

Airtest 介绍 Airtest Project 是网易游戏推出的一款自动化测试框架&#xff0c;其项目由以下几个部分构成 Airtest : 一个跨平台的&#xff0c;基于图像识别的 UI 自动化测试框架&#xff0c;适用于游戏和 App &#xff0c; 支持 Windows, Android 和 iOS 平台&#xff0c…

蛋白质基础

氨基酸:必需氨基酸 条件必需氨基酸和非必需氨基酸 必需氨基酸:机体需要但自身不能合成&#xff0c;必须从食物中获取的氨基酸。共有八种&#xff0c;对婴儿&#xff0c;组氨酸也是必需氨基酸。 条件必需氨基酸:半胱氨酸和酪氨酸在体内分别由蛋氨酸和苯丙氨酸转变而来。若膳食中…

HTML 列表和容器元素——WEB开发系列10

HTML 提供了多种方式来组织和展示内容&#xff0c;其中包括无序列表、有序列表、分区元素 ​​<div>​​ 和内联元素 ​​<span>​​、以及如何使用 ​​<div>​​​ 进行布局和表格布局。 一、HTML 列表 1. 无序列表 (​​<ul>​​) 无序列表用于展…

Java流程控制06:for循环详解

教学视频链接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p41&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p41&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Java中的‌for循环结构‌是一种基础…

Python与DIAdem联合开发

Python可以通过COM接口与NI的DIAdem软件集成&#xff0c;允许用户以编程方式自动生成和定制报告。这种方式使得报告生成更加灵活且可定制&#xff0c;尤其适用于需要定期生成大量报告或对报告内容有特定要求的场景。 1. 工作原理 Python与DIAdem的集成主要依赖于COM&#xff0…

二叉树的判断

二叉树的判断 判断一颗二叉树是不是搜索二叉树 &#xff08;左边的比根小&#xff0c;右边的比根大&#xff09; 中序遍历一下&#xff0c;如果是的话就一定是升序的 如何判断一颗二叉树是否是完全二叉树 1.遍历任意的节点时候&#xff0c;如果返回右孩子没有左孩子&#x…

【Linux学习】权限

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a;Linux学习 目录 &#x1f308;前言&#x1f525;Linux权限的概念&#x1f525;Linux权限管理01.文件访问者的分类02.文件类型和访问权限&#xff08;文件属性&#xff09;03.文件权限值得…

线程同步-条件变量

文章目录 引言条件变量初始化条件变量&#xff1a;pthread_cond_init销毁条件变量&#xff1a;pthread_cond_destroy条件等待&#xff1a;pthread_cond_wait唤醒等待&#xff1a;pthread_cond_signal、pthread_cond_broadcast认识条件变量接口使用 引言 有一个非常好的VIP自习…

树莓派3B运行rasa init和rasa shell遇到的tensorflow报错总结

终于在我的树莓派上安装rasa-1.4.0版本成功&#xff08;见《树莓派智能语音助手之聊天机器人-RASA》&#xff09;。不过&#xff0c;在初始化rasa的时候还是遇到了很多报错&#xff0c;在此总结&#xff0c;供朋友们参考。 1. ModuleNotFoundError: No module named ‘tensorf…

合肥网站制作服务

合肥网站制作服务&#xff1a;为您的企业搭建数字化桥梁 随着互联网的迅猛发展&#xff0c;越来越多的企业意识到拥有一个专业的网站对于提升品牌形象和扩大市场影响力的重要性。合肥作为安徽省的省会&#xff0c;经济发展迅速&#xff0c;许多企业渴望通过优质的网站制作服务&…

Windows采用VS2019实现Open3D的C++应用

1、参考链接 https://blog.csdn.net/qq_31254435/article/details/137799739 但是&#xff0c;我的方法和上述链接不大一样&#xff0c;我是采用VS2019进行编译的&#xff0c;方便在Windows平台上验证各种算法。 2、创建一个VS2019的C Console工程 #include <iostream>…

Unity 6 预览版正式发布

Unity 6 预览版发布啦&#xff0c;正式版本将于今年晚些时候正式发布&#xff01; 下载链接&#xff1a; https://unity.com/releases/editor/whats-new/6000.0.0 Unity 6 预览版是 Unity 6 开发周期的最后一个版本&#xff0c;在去年 11 月 Unite 大会上&#xff0c;我们宣…

应急响应-DDOS-典型案例

某单位遭受DDoS攻击事件如下 事件背景 2019年2月17日&#xff0c;某机构门户网站无法访问&#xff0c;网络运维人员称疑似遭受DDoS攻击&#xff0c;请求应急响应工程师协助。 事件处置 应急响应工程师在达到现场后&#xff0c;通过查看流量设备&#xff0c;发现攻击者使用僵…

日拱一卒(4)——leetcode学习记录:路经总和

一、任务&#xff1a; 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 叶…

RCE与SQL漏洞的复现

eval长度限制突破 php eval函数参数限制在16个字符的情况下&#xff0c;如何拿到webshell呢 首先&#xff0c;我们还是先把环境搭好&#xff08;此次的所有漏洞环境我都部署在Ubuntu下,我的Ubuntu下的环境是nginxphp&#xff0c;至于Ubuntu下的nginxphp环境我也有博客也写到&a…

配置maven环境(全局)

全局设置 修改Maven 更改JRE 更改Java Compiler 修改完成后&#xff0c;Apply即可

一些有趣的XSS注入GAME

目录 1.ma,Spaghet 2.Jefff 3.Ugandan Knuckles 4.Ricardo Milos 5. Ligma 6.Ah Thats Hawt 7.Msfia 8.Ok,Boomer 1.ma,Spaghet innerHTML :设置 innerHTML 的值可以让你轻松地将当前元素的内容替换为新的内容。 HTML 5 中指定不执行由 innerHTML 插入的 <script&g…

【win/mac】矢量图形编辑软件Adobe Illustrator(AI) 2024版本下载与安装

一、Adobe AI 软件简介 什么是 Adobe AI 软件Adobe Illustrator&#xff08;简称 AI&#xff09;是一款功能强大的矢量图形编辑软件&#xff0c;广泛应用于平面设计、插画绘制、图标设计、包装设计等领域。它允许用户创建、编辑和处理各种复杂的矢量图形&#xff0c;具有极高的…

Metasploit 入门教程(非常详细)从零基础入门到精通,看完这一篇就够了!

一、引言 Metasploit 是一款强大的开源渗透测试工具框架&#xff0c;被广泛应用于网络安全领域。无论是安全研究人员、渗透测试工程师&#xff0c;还是对网络安全感兴趣的初学者&#xff0c;掌握 Metasploit 都是提升技能的重要一步。本教程将带您从零基础开始&#xff0c;逐步…