八股总结-----C++、数据结构、算法

1.内存基础

11.内存分区

代码区:存储可执行代码(程序指令)。

全局区:存储全局变量和静态变量(已初始化和未初始化)。

堆区:用于动态内存分配,由程序员管理。

栈区:存储函数调用中的局部数据(局部变量、参数、返回地址)。

12.堆和栈有什么区别

堆和栈是用来内存分配和释放的两种不同的内存区域,内存管理就是内存分配和释放。栈的存储空间比较小,用于存储局部变量、函数参数、返回值,适合小数据结构的存储,内存分配和释放速度快,自动管理(自动分配、自动销毁)。堆的存储空间较大,用于动态内存分配,适合大型数据结构存储,内存分配和释放速度较慢,手动管理(malloc、new、free、delete)。

2.指针

21.智能指针

智能指针是C++标准库中的一种工具,用于自动管理动态内存,避免内存泄漏和指针悬挂问题。智能指针主要有以下几种类型:

1. std::unique_ptr

  • 独占所有权unique_ptr表示独占的所有权,即一个指针对象在任何时刻只有一个所有者。
  • 不可复制unique_ptr不能被复制,只有通过std::move转移所有权。
  • 场景:适合用于需要严格的所有权语义的场合,如资源管理。

2. std::shared_ptr

  • 共享所有权shared_ptr允许多个智能指针共享同一块内存。当最后一个shared_ptr释放时,内存才会被释放。
  • 引用计数:每个shared_ptr都有一个引用计数,用于记录有多少shared_ptr共享该内存块。
  • 场景:适用于需要在多个地方共享资源的情况。

3. std::weak_ptr

  • 弱引用weak_ptr不会影响引用计数,不能直接访问资源,需要先提升为shared_ptr
  • 防止循环引用:常用于打破shared_ptr之间的循环引用,避免内存泄漏。
  • 场景:适用于需要观察但不拥有资源的场景,如缓存或观察者模式中。

智能指针的作用

  • 自动内存管理:智能指针在离开作用域时自动释放资源,避免了手动释放内存的麻烦和错误。
  • 防止内存泄漏:通过智能指针的自动内存管理机制,减少了忘记释放内存导致的内存泄漏问题。
  • 简化代码:智能指针封装了内存管理细节,简化了资源管理的代码。

22.常量指针和指针常量有什么区别?

看const后面跟的什么,跟的int就是修饰数据,数据不可变,指针指向可变,称为指针变量const int *p。跟的p就是修饰指针,指针指向不可变,数据可变,称为变量指针int * const p。

23.define 和 const 的区别?

作用:用于记录程序中不可更改的数据
C++定义常量两种方式
1. #define 宏常量: #define 常量名 常量值
==通常在文件上方定义==,表示一个常量
2. const修饰的变量 const 数据类型 常量名 = 常量值
==通常在变量定义前加关键字const==,修饰该变量为常量,不可修改

24.static的作用

静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员,可以通过对象和类名两种方式访问。静态成员分为:

静态成员变量:1.所有对象共享同一份数据;2.在编译阶段分配内存;3.类内声明,类外初始化;
静态成员函数:1.所有对象共享同一个函数;2.静态成员函数只能访问静态成员变量。(因为静态属于类,非静态属于对象 ,静态成员变量是由类调用的,不用区分是类中的哪个对象调用,但是非静态成员变量是由对象调用的,这时候用静态成员函数去调用非静态成员变量,无法区分到底是哪个对象调用的变量)

静态成员是指属于类本身而不是类的实例的成员。静态成员有以下意义:
共享性:静态成员被所有类的实例共享,可以在不创建类的实例的情况下访问和修改静态成员。
保存状态:静态成员可以用来保存类的状态信息,例如计数器、配置信息等,这些信息可被所有实例共享和访问。
简化访问:可以通过类名直接访问静态成员,无需创建类的实例。这样可以简化代码并提高代码的可读性。
与类相关联:静态成员通常与类本身相关联,而不是与类的实例相关联。这样可以更好地表达类的特性和行为。

3.虚函数

31.什么是虚函数?什么是纯虚函数?

  • 虚函数 用于在基类中声明,并允许在派生类中重写,以实现多态性。
  • 纯虚函数 是没有实现的虚函数,存在于抽象类中,必须在派生类中实现,否则派生类也将成为抽象类。纯虚函数常用于定义接口,强制派生类提供特定的功能。

析构函数可以是虚函数吗?

4.vector容器

std::vector 是 C++ 标准库中的动态数组,它会根据需要自动调整其容量以容纳更多的元素。std::vector 会在内部维护一个存储空间的容量(capacity),这个容量通常会大于或等于当前元素的数量(size)。当向 std::vector 中添加元素并且元素的数量超过当前容量时,vector 会重新分配更大的内存空间来容纳这些元素。这个过程包括:

  1. 分配新的内存块vector 会分配一个更大的内存块以容纳更多的元素。
  2. 复制现有元素:将旧内存块中的元素复制到新的内存块中。
  3. 释放旧内存块:释放旧的内存块以释放内存。

std::vector 的初始容量和扩容策略取决于具体的实现,但一般来说,std::vector 的初始容量为 0。也就是说,当你创建一个空的 vector 对象时,它通常没有分配任何内存用于存储元素。

初次扩容

std::vector 的初次扩容通常发生在以下几种情况:

  1. 添加元素:当你向一个空的 vector 中添加第一个元素时,vector 会进行初次扩容。此时,它会分配一个足够容纳至少一个元素的内存块。许多实现将初始容量设置为较小的值,比如 1 或 4,以提高性能。

  2. 构造函数:如果你使用特定构造函数创建 vector,比如 vector(size_type count, const T& value)vector(std::initializer_list<T> init)vector 会根据提供的初始元素数量预分配内存,以减少后续的扩容次数。

扩容策略

在添加更多元素并超过当前容量时,std::vector 会进行扩容。扩容通常遵循以下策略:

  • 容量增加:每次扩容时,vector 的容量通常会增加到当前容量的两倍,这样可以减少扩容的次数和内存分配的开销。(2倍策略通常在性能和内存利用之间提供了一个好的折衷)
  • 策略实现:不同的标准库实现可能会有不同的策略,但大多数都遵循类似的增量规则以确保高效的内存管理。

扩容过程中,std::vector 需要重新分配内存,复制现有元素到新的内存块中,并释放旧的内存块。这个过程是自动进行的,用户不需要手动处理。

5.介绍几种常用的排序算法

冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序

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

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

相关文章

python:reportlab 生成PDF文件,生成基因图谱

reportLab是 python的一个第三方库&#xff0c;它能够用来生成PDF文件。这个库提供了一系列的工具&#xff0c;允许用户从简单的文档到复杂的多列布局进行PDF的创建和编辑。 使用 reportLab&#xff0c;你可以执行以下功能&#xff1a; 创建文本块、图片、图表等元素。 利用绘…

JS中【浅克隆】和【深克隆】方法解读

在JavaScript中&#xff0c;“克隆”指的是创建一个对象或数组的副本。克隆可以分为浅克隆和深克隆两种方式。了解这两种克隆的差异对编程非常重要。 浅克隆&#xff08;Shallow Clone&#xff09; 浅克隆会复制对象或数组的第一层属性&#xff0c;但对于嵌套的对象或数组&am…

如何通过rsync+sersync 实现同步备份

该文档是在很早之前写的&#xff0c;一直存在草稿箱中&#xff0c;最近在整理其它学习资料时发现还没有发布&#xff0c;内容和方法有可能和现在的操作系统版本有些不符合了&#xff0c;但处理思路没有变化&#xff0c;大家可以根据最新版本要求&#xff0c;参照该文档进行配置…

JVM调优原理

文章目录 引言I 调整JVM的默认堆内存配置1.1 java命令启动jar包时配置JVM 的内存参数1.2 基于Tomcat服务器部署的java应用,配置JVM 的内存参数II JVM GC 调优基本概念: 应用程序的响应时间(RT)和吞吐量(QPS)JVM调优原理调优思路调优方法JVM调优技巧建议引言 内存参数:ht…

南阳施工企业资质续期成本详解与节省策略

南阳施工企业资质续期费用涉及多个方面&#xff0c;包括官方收取的费用、咨询与代办费用、材料准备与审核费用等。以下是对这些费用的详细解析以及相应的节省方法&#xff1a; 一、费用详述 1. 官方收取的费用 延期申请费&#xff1a;这是办理资质续期时必须缴纳的费用&…

闲置物品|基于SprinBoot+vue的校园闲置物品交易平台(源码+数据库+文档)

校园闲置物品交易平台 目录 基于SprinBootvue的校园闲置物品交易平台 一、前言 二、系统设计 三、系统功能设计 5.1系统功能实现 5.2管理员模块实现 5.3用户模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xf…

项目:基于TCP的文件传输系统

项目介绍: 模拟FTP原理&#xff1a;客户端连接服务器后&#xff0c;向服务器发送一个文件。文件名可以通过参数指定&#xff0c;服务器端接收客户端传来的文件&#xff08;文件名随意&#xff09;&#xff0c;如果文件不存在自动创建文件&#xff0c;如果文件存在&#xff0c;…

PsConvertToGuiThread函数调用前传

PsConvertToGuiThread函数调用前传 第一部分&#xff1a;位置 chchenghaodeiMac base % grep "Kss_ErrorHandler" -nr ./ .//ntos/ke/i386/trap.asm:1026:Kss_ErrorHandler: .//ntos/ke/i386/trap.asm:1220: jae Kss_ErrorHandler ; if ae, try…

matlab 相位解缠

目录 一、功能概述1、相位解缠2、主要函数二、代码实现1、螺旋线的正确相位角2、使用不同阈值平移相位角3、将相移应用于矩阵三、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的抄袭狗。 一、功能概述 1、相位解缠 对…

FPGA实现多功能SDI视频采集卡,基于GTX+RIFFA架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案本博已有的 SDI 编解码方案 3、详细设计方案设计框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGBFDMA图像缓存RIFFA用户数据控制RIFFA架构详解Xilinx 7 Series Integrated Bloc…

C#面:ASP.NET MVC 中还有哪些注释属性用来验证?

在 ASP.NET MVC 中&#xff0c;除了常见的数据注解属性&#xff08;如Required、StringLength等&#xff09;&#xff0c;还有一些其他的注解属性用来验证数据。以下是一些常用的注解属性&#xff1a; Range&#xff1a;用于验证数字类型的属性值是否在指定的范围内。 [Range(…

中文乱码解决方案

解决程序中的中文乱码问题通常涉及到几个关键点&#xff1a;字符编码的设置、环境变量的配置以及程序内部处理方式。这里提供一些常见的解决方案&#xff1a; 1. 设置正确的输入输出流编码 如果你的应用程序是在读取或写入文件时出现乱码&#xff0c;确保设置了正确的文件编码…

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(XGBoost分类器)

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序&#xff08;XGBoost分类器&#xff09; 文章目录 一、基本原理鲸鱼智能优化特征选择流程 二、实验结果三、核心代码四、代码获取五、总结 智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序…

从地图信息实时检测路口的各向通行状况、红绿灯及溢出情况

高德地图、百度地图都能获得实时的道路信息。 C# 编写的路况信息爬虫可获得准实时&#xff08;1分钟间隔&#xff09;的路口的各向通行状况、红绿灯及溢出情况。 优势&#xff1a; 投入少&#xff0c;效果好&#xff0c;无需安装设备&#xff1b; 缺陷&#xff1a; 时间间隔…

人工智能在网络安全领域的应用探索

随着网络技术的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;成为制约数字化进程的重要瓶颈。人工智能&#xff08;AI&#xff09;作为一种变革性技术&#xff0c;正逐步在网络安全领域展现出其巨大的潜力和价值。本文旨在探讨人工智能在网络安全领域的应用现状、优势…

更新RK3588开发板的rknn_server和librknnrt.so【这篇文章是RKNPU2从入门到实践 --- 【5】的配套文章】

作者使用的平台有&#xff1a; 一台装有Windows系统的宿主机&#xff0c;在该宿主机上装有Ubuntu 20.04虚拟系统&#xff1b; 瑞芯微RK3588开发板&#xff0c;开发板上的系统为Ubuntu22.04系统&#xff1b; 更新板子的 rknn_server 和 librknnrt.so&#xff0c;rknn_server 和…

单HTML文件集成Vue2+axios的使用

1、下载vue2.js和axios.js到本地 2、建一个HTML文件&#xff0c;内容如下&#xff1a; <html> <head><meta charset"UTF-8"><script src"./js/vue2.js"></script><script src"./js/axios.js"></script&…

USART之串口发送+接收应用案例

文章目录 前言一、电路接线图二、应用案例代码三、应用案例分析3.1 USART模块初始化3.1.1 RCC开启时钟3.1.2 GPIO初始化3.1.3 配置USART3.1.4 开启中断、配置NVIC3.1.5 开启USART 3.2 USART串口收发模块3.2.1 Serial_SendByte&#xff08;发送一个字节数据&#xff09;3.2.2 US…

Array常用的函数

在JavaScript中&#xff0c;Array 对象提供了许多实用的方法来操作数组。以下是常用的几个函数及其简要说明&#xff1a; 1. Array.prototype.forEach forEach 用于遍历数组中的每个元素&#xff0c;并执行一个提供的函数。 语法 array.forEach(callback(currentValue[, in…

【蓝桥杯集训100题】scratch绘制扇子 蓝桥杯scratch比赛专项预测编程题 集训模拟练习题第28题

scratch绘制扇子 蓝桥杯集训100题第28题模拟练习解析 此题曾经作为第十届省赛的真题考过 一、题目要求 以坐标(0,0)点为中心绘制一把扇子;扇面和扇把都是三分之一圆,扇面的半径 为 100 左右,扇把的半径为 20 左右。 编程实现 每次点击绿旗后,舞台背景为白色,…