当前位置: 首页 > news >正文

【C++】42道面试经典问题总结

  1. C++ this指针是干什么用的?
    假如一个类型定义了很多对象,类里面有很多定义的私有成员变量,共享一套成员方法。通过this指针这可以区分方法、变量是操作的哪个对象的。

  2. C++的new和delete,new[]和delete[]可以混用吗?
    一般来说operator new 对应 operator delete
    new[] 对应 delete[]ptr ,对于内置类型四者相互混用也行。
    但是,如果是自定义类型。而且提供了析构函数,那么用new[] 就一定要用delete[]ptr,不能够混用。
    delete相对于free,1.调用析构函数2.释放内存

  3. C++的static关键字的作用?
    从面向过程角度来说:static可以修饰全局变量,函数,局部变量。
    对于static修饰全局变量,函数,添加static关键字后变成只当前文件可见,原因:再符号表中符号的作用域就从global变成了local)
    对于static修饰局部变量-变量初始化并且初始化不为0的放在了.data段,没有初始化或者初始化为0的放在了.bss端(局部变量不产生符号,在栈上通过ebp-偏移量来访问的)
    从面向对象角度来说:static可以修饰成员变量,成员方法(从私有变成共享)修饰成员方法时不会再生成this指针了,直接通过类作用域调用即可。

  4. C++的继承有什么好处?
    继承属于类和类之间的关系(除了继承还有组合)
    继承是 a kind of关系 一种
    组合是 a part of关系 一部分
    继承好处:
    代码复用
    通过继承,在基类里面给所有派生类可以保留统一的纯虚函数接口,等待派生类进行重写,通过使用多态,可以通过基类指针访问不同派生类对象的同名覆盖方法(做到开闭原则)

  5. 讲一下C++ 的继承多态
    多态:静态多态和动态多态,静态多态是指编译时期的多态,比如函数重载和模板
    动态多态是指运行时期的多态,比如虚函数和通过基类指针/引用指向派生类对象

  6. C++ 空间配置器是什么?
    空间配置器allocator:给容器使用的,主要作用就是把内存开辟与对象构造分开,把对象析构和内存释放分离开。
    分开原因:当我们去初始化一个容器时,底层应该是空的,只有内存,没有对象,但是如 果在容器构造时直接用new,不仅会开辟内存还会构造很多无用的对象 。当容器删除一个元素时不应该进行内存释放(后面可能会继续使用),只用把对象析构掉即可。

  7. vector和list的区别?
    vector底层数据结构是数组,list底层数据结构是链表。
    vector底层内存可以做二倍扩容的数组(内存是连续的),提供了尾部的增加删除操作,时间复杂度都是O(1),适合做随机访问时间复杂度是O(1)(优先级队列是基于vector实现)
    list是一个循环的双向链表,适合增加、删除节点,时间复杂度都是O(1)。

  8. map和多重map?
    map:映射表【key-value】底层是由红黑树实现
    multimap:唯一一点不同之处就是允许key重复
    红黑树:5个性质(每个节点都要有颜色,根节点必须为黑色,叶子节点必须是黑色,从根节点到每一个叶子节点的路径上,不能出现连续的红色节点,不允许出现两个连续的红色节点)插入的3种方式(最多旋转2次),删除的4种情况(最多旋转3次)

  9. C++如何防止内存泄漏?智能指针详述?
    内存泄漏:分配到堆内存(没有名字,只能用指针来指向)没有释放,也再没有机会去释放了
    智能指针有:
    auto_ptr/scoped_ptr/unique_ptr
    shared_ptr和weak_ptr
    (待补充)

  10. C++如何调用C语言语句?
    C和C++生成符号的方式不同,C和C++语言之间的API接口是无法直接调用的
    C语言的函数必须扩在extern"C"{}

#ifdef __cplusplus
extern "c"
{
#endifint sum(int,int); //在C语言下只会根据函数名生成符号,在C++下会根据函数名+参数列表生成符号
#ifdef __cplusplus
}
#endif
  1. C++什么时候会出现访问越界?
    系统给我们分配了既定大小的内存,但是在访问内存的时候如果超过了既定内存的大小,就是越界访问了
    1.访问数组元素越界
    2.vector容器访问-vectorwec; wec[2]越界
    3.string str;str[2]
    4.array内存不可扩容的数组
    5.字符串处理,没有添加’\0’字符,导致访问字符串的时候越界·
    6.使用类型强转,让一个大类型(派生类)的指针指向一块小内存(基类对象),然后指针解引用,访问的内存就会越界
  2. C++中的类的初始化列表?
    可以指定对象成员变量的初始化方式,尤其是指定成员对象的构造方式 (初始化先后顺序与定义顺序有关,与在初始化列表里出现的顺序无关)
  3. C和C++的区别?C和C++的内存分布有什么区别?
    1.C++有引用,引用是一种更安全的指针
    2.C++支持函数重载
    3.C++有new/delete与malloc/free有区别
    4.C++有const、inline、带默认值参数的函数
    5.C++支持模板,泛型编程
    6.C++有类和对象,是OOP语言,可以采用很多设计模式
    7.C++支持STL标准模板库,使解决问题更加方便
    8.C++有异常机制、智能指针、运算符重载(使对象的运算表现的和内置类型一样)

C和C++的内存分布没有区别,usr space (reserve、.text、.rodata、.bss、heap stack 命令行参数和环境变量)+kernal space(ZONE_DMA 、ZONE_NORAMAL、ZONE_HIGHMEM)

  1. int* const p和const int* p区别?
    const在* 的 右边,右定向 p不能修改,p可以修改
    const在
    的左边,左定值 p可以修改,*p不能修改

  2. malloc和new的区别?
    1.malloc按字节开辟内存 new底层也是通过malloc开辟内存,但是还可以提供初始化操作
    2.malloc开辟内存失败,会返回NULL、new开辟内存失败,会抛出bad_alloc类型的异常
    3.malloc实际上是一个C的库函数,operator new是运算符重载函数
    4.malloc对于单个或者数组内存开辟方法都一样

  3. map和set容器的实现原理?
    set称作集合,里面只存储、key
    map称作映射表,存储【key、value】键值对
    两者底层数据结构都是红黑树,

  4. shared_ptr引用计数存放在哪里?

  5. 18.STL底层
    STL包括标准容器:顺序容器(vector、deque、list)、容器适配器(stack、queue、priority_queue)、关联容器(有序(set、map’)和无序(un))
    近容器:数组、string、bitset
    迭代器
    泛型算法
    deque底层是动态开辟的二维数组

  6. STL中迭代器失效问题?
    迭代器是不允许一边读一边修改的
    当通过迭代器插入一个元素,所有迭代器就都失效了
    当通过迭代器删除一个元素,当前删除位置后面所有元素的迭代器就都失效了
    当通过迭代器更新容器元素以后,要及时对迭代器进行更新,insert/ erase方法都会返回新位置的迭代器

  7. struct和class的区别?
    1.定义类的时候,struct默认是公有的,class默认是私有的
    2.继承时,如果不写明继承方式,class默认继承方式是私有继承,struct默认是公有继承
    3.在C++中struct空结构体是0 struct空类是1
    4.C++11初始化可以写成 stuct Data{int ma,int mb} Data data={10,20};
    5.class在template还可以定义模板类型参数

  8. 编译链接全过程?
    编译:预编译、编译、汇编、生成二进制可重定位obj文件*.o
    链接:合并段,符号解析、符号的重定向生成可执行文件

  9. 初始化全局变量和未初始化全局变量有什么区别?
    初始化而且初始值不为0的放在了.data段
    未初始化,初始化位0的放在了.bss段

  10. 堆和栈的区别?
    1.内存大小不同:堆内存的大小远远大于栈内存
    2.内存分配方式不同:堆内存是通过malloc和new开辟的,必须手动释放内存free和delete
    栈内存是函数的运行在栈上分配栈帧,系统自动分配自动回收内存
    3.内存增长方向不同:堆的内存分配是从低地址到高地址
    栈内存分配是从高地址到低地址
    4.生存周期不同

  11. 构造函数和析构函数可不可以是虚函数?
    构造函数不可以使虚函数,析构函数可以是虚函数
    构造函数不能是虚函数,因为对象还没有构造出来,也就没有虚函数指针,没有虚函数指针也就无法指向虚函数表。
    虚析构函数,把基类的析构函数实现成虚析构函数,则对析构函数的调用进行动态绑定,基类、派生类的析构函数就都可以调用到

  12. 构造函数和析构函数中能不能抛出异常?
    构造函数不能抛出异常,如果可以抛出异常的话,假如对象创建失败,则就不会调用析构函数了,从而造成内存泄漏(可以进行代码分离,保证对象创建是成功的,析构函数也就可以正常执行)
    析构函数也不能抛出异常,抛出异常后,析构函数后面资源释放的代码就不会执行了,也会造成造成内存泄漏
    所以一般把堆内存用智能指针来代替,确保资源内存正常释放

  13. 宏和内联函数的区别?
    #define和inline
    宏是预编译阶段处理(字符串替换)的,宏没有办法进行调试,可以定义常量,代码块,函数块…
    内联函数是编译阶段处理(在函数调用点,通过函数的实参把函数代码直接展开调用,节省了函数的调用开销)的,inline函数可以调试(debug版本下inline就和普通函数一样,有标准的函数调用过程),只能用来修饰函数

  14. 局部变量存放在哪里?
    局部变量存放stack上,通过ebp指针偏移-4来访问的,不会产生符号

  15. 拷贝构造函数,为什么传引用不传值?
    传值会直接产生编译错误
    比如:

class Test
{
public:Test(const Test t);
}
Test t1;
Test t2(t1);
//实际上是 t2.Test(t1)->先用t1拷贝构造形参t const Test t(t1)->t.Test(t1).......无限循环
  1. 内联函数和普通函数的区别?
    函数的调用开销
    push ebp压入实参
    mov ebp esp
    sub esp 4Ch开辟栈帧
    rep stos 0×CCCCCCCC(Windows)
    注意在GCC(gcc/g++下不会做初始化操作)
    释放栈
    mov esp,ebp esp从栈顶指向栈低
    pop ebp epb指向调用方函数的栈低
    ret 把下一行指令地址放入寄存器的地址里
  2. 如何实现一个不可以被继承的类?
    派生类的初始化过程是:基类构造然后是派生类构造。所以可以把基类的构造函数私有化
  3. 什么是纯虚函数?为什么要有纯虚函数?虚函数表放在哪里?
    virtual void func()=0; -》纯虚函数(抽象类)不能够实例化对象,但是可以定义指针和引用。
    一般定义在基类里面。基类不代表任务实体·,它的主要作用之一就是给所有的派生类保留统一的纯虚函数接口,让派生类进行重写方便多态机制使用。因为基类不需要实例化,它的方法也就不知怎么去实现。
    虚函数表是在编译阶段产生的,虚函数表运行时加载到.rodata段(只读数据段)
  4. 手写单例模式
  5. C++中const,const与static的区别?
    const定义的叫做常量,它的编译方式是:编译过程中,把出现常量名字的地方,用常量的值进行替换
const int a = 10;
int *p = (int*)&a;
*p = 20;
cout<<"a = "<<a<<"*p= "<<*p<<endl;
//结果是 a = 10 *p = 20 
int b =3;
const int a = b; //此时a叫做常变量
int *p = (int*)&a;
*p = 20;
cout<<"a = "<<a<<"*p= "<<*p<<endl;
//结果是 a = 20 *p = 20 

const还可以定义常成员方法 -this指针从Test* this =》 const Test * this普通对象和常对象就都可以调用了
const和static的区别
从面向过程来说:
const只能修饰全局变量、局部变量、形参变量
static可以修饰全局变量、局部变量
const:不能修饰函数
static 可以修饰函数,改变符号的作用域,改成只本文件可见
从面向对象来说:
const修饰的叫常方法(普通对象和常对象就都可以调用,但是只能进行读操作,不能进行写操作)/常成员变量(不能别修改的变量,必须在构造函数初始化列表中定义)都依赖于对象
static修饰的叫静态方法(本质是this指针没有了,不依赖于对象,通过类作用域访问)/静态成员变量

  1. 四种强制类型转换?
    const_cast:去掉常量属性
    static_cast: 类型安全转换
    reinterpret_cast:C风格类型转换
    dynamic_cast:支持RTTI信息识别的类型转换
  2. 详细解释deque的底层原理
    底层是动态开辟的二维数组
    #define MAP_SIZE 2 //MAP_SIZE (T*)一维数组的大小
    #define QUE_SIZE(T) 4096/sizeof(T) //二维数组开辟的大小
    deque是双端队列,两端都有对头和队尾。两端都可以插入删除,时间复杂度是O(1)

扩容:第一维数组按照2倍方式进行扩容2-4-8…
扩容以后会把原来的第二维的数组,从新一维数组的oldsize/2 开始存放,也就是从中间开始存放,为了首尾插入方便。
deque的内存利用率比较好,刚开始就有一段内存可以提供使用

  1. 虚函数?
    一个类如果有虚函数,那么在编译阶段就要产生一张虚函数表,在运行的时候加载到.rodata段
    用指针或者引用时,来调用虚函数时,通过指针访问对象的头四个字节·vfptr去相应的vftable中取虚函数的地址进行动态绑定调用

  2. 一个类,写一个构造函数,又写了一个虚构造函数,可不可以?会发生什么?
    虚函数的调用前提是对象存在,
    一个派生类的构造要先调用基类构造函数,如果基类是虚构造函数则会无限循环
    在构造函数中,是不会进行动态绑定的,虚构造函数本身也不能实现成虚函数。

  3. 异常是怎么回事?

try
{
可能会抛出的异常代码
}
catch(const string& err)
{
捕获相应异常类型对象,进行处理,完成后,继续向下运行
}

异常的栈展开:
在当前函数栈帧上没有找到相应的catch块处理,就会把异常抛给调用方函数,调用方依然安装这样的逻辑来处理,如果捕获相应异常类型对象,则进行处理,完成后,继续向下。如果还没有找到,依然会抛给调用方,反复判断处理,直到到达main主函数,再抛给系统,直接终止进程。
可以把代码中所有的可能发生的异常抛出到同一的地方进行处理,不会出现问题就随时exit(0);

  1. 早绑定和晚绑定?
    早绑定(静态绑定): 编译时期的绑定,普通函数的调用,用对象调用虚函数,在Call编译阶段就已经知道调用的那个函数了
    晚绑定(动态绑定):用指针/引用调用虚函数的时候,都是动态绑定
    p->vfptr->vftable->virtual addr->call eax

  2. 指针和引用的区别?
    从反汇编角度分析:

int a =10;
int* p = &a;
int &q  = a;
//前面两句在汇编指令上完全一致的 把a的内存拿出来放在寄存器,再把寄存器的值放在底层的4字节的指针变量 
lea eax,[a] mov dword ptr[ebp-8],eax
lea eax,[a] mov dword ptr[ebp-0Ch],eax
*p = 20;
q = 20;
//指令也一样,先从底层4字节的指针里面拿出来引用内存的地址,再把20写到4字节内存的地址里面
mov eax,dword ptr[ebp -8] mov dword ptr[eax],14H
mov eax,dword ptr[ebp -0Ch] mov dword ptr[eax],14H
  1. 智能指针交叉引用问题怎么解决?

定义对象的时候使用强智能指针shared_ptr
引用对象的时候用弱智能指针weak_ptr
当通过weak_ptr访问对象成员时,需要先调用weak_ptr的lock提升方法,把weak_ptr提升成shared_ptr智能指针,再进行对象成员的调用

  1. 重载的底层实现?
    C++生成函数符号,是依赖于函数名字+参数列表
    当我们编译到函数调用点时,根据函数名字和传入的实参(类型,个数)和某一个函数重载匹配的话,就直接调用相应的函数重载版本(静态多态,都是在编译阶段处理的)

相关文章:

【C++】42道面试经典问题总结

C this指针是干什么用的&#xff1f; 假如一个类型定义了很多对象&#xff0c;类里面有很多定义的私有成员变量&#xff0c;共享一套成员方法。通过this指针这可以区分方法、变量是操作的哪个对象的。 C的new和delete&#xff0c;new[]和delete[]可以混用吗&#xff1f; 一般来…...

php 实现JWT

在 PHP 中&#xff0c;JSON Web Token (JWT) 是一种开放标准 (RFC 7519) 用于在各方之间作为 JSON 对象安全地传输信息。JWT 通常用于身份验证系统&#xff0c;如 OAuth2 或基于令牌的身份验证。 以下是一个基本的 PHP 实现 JWT 生成和验证的代码示例。 JWT 的组成部分 JWT …...

vue table id一样的列合并

合并场景&#xff1a;如果id一样&#xff0c;则主表列合并&#xff0c;子表列不做合并&#xff0c;可实现单行、多行合并&#xff0c;亲测&#xff01;&#xff01;&#xff01; 展示效果如图示&#xff1a; 组件代码&#xff1a; // table组件 :span-method"objectSpa…...

xshell密钥方式连接阿里云Linux

前提条件 有阿里云ECS linux实例安装好xshell工具 步骤 创建密钥对并绑定ECS实例 浏览器登录阿里云-->控制台-->ECS服务器-->网络与安全-->密钥对-->创建密钥对 根据提示填写密钥名称-->选中默认资源组-->创建 创建完成&#xff0c;会自动下载密钥对的…...

Wni11 下 WSL 安装 CentOS

Wni11 下 WSL 安装 CentOS 方法一、安装包安装下载包安装安装打开 CentOS1. 从 Windows 终端 打开2. 从 PowerShell 打开 方法二、导入 CentOS 的 tar 文件进行安装0. 查看版本&#xff08;可选&#xff09;1. 导出 Docker 容器到 tar 文件2. 将 tar 文件导入 WSL2.1. 导入 tar…...

ROADM(可重构光分插复用器)-介绍

1. 引用 https://zhuanlan.zhihu.com/p/163369296 https://zhuanlan.zhihu.com/p/521352954 https://zhuanlan.zhihu.com/p/91103069 https://zhuanlan.zhihu.com/p/50610236 术语&#xff1a; 英文缩写描述灰光模块彩光模块CWDM&#xff1a;Coarse Wave-Length Division …...

HarmonyOS开发之路由跳转

文章目录 一、路由跳转模式与实例1.router.pushUrl2.router.replaceUrl3.router.back 一、路由跳转模式与实例 跳转模式 有点类似于vue的路由跳转 router.pushUrl 保留路由栈&#xff0c;保留当前的页面&#xff1b;router.replaceUrl 销毁当前页面&#xff0c;跳转一个新的页…...

怎么使用ai 免费生成ppt?这4个工具可以帮忙

随之AI工具的流行&#xff0c;网络上也涌现了一批 AIPPT 工具&#xff0c;可以在办公上帮助我们节省很多制作PPT的时间。通常它们的操作也比较简单&#xff0c;所以适合很多人使用。为了可以帮助大家提高办公效率&#xff0c;我在这里跟大家分享4款可以免费使用的AIPPT制作工具…...

Android主副屏显示-Android13

Android主副屏显示-Android13 1、DisplayDeviceInfo屏幕信息2、每个屏幕对应LogicalDisplay2.1 LogicalDisplay添加对应DisplayContent2.2 configureDisplayLocked刷新 DisplayManagerService启动及主屏添加-Android13 1、DisplayDeviceInfo屏幕信息 DisplayManagerService启动…...

什么是 SMB 服务器以及它如何工作?

在本文中&#xff0c;您将了解 SMB 服务器以及它们如何促进网络文件共享。 我们将介绍它们的基本功能、主要特性以及如何安全地设置它们。无论您是新手还是需要复习&#xff0c;本指南都将帮助您更好地了解 SMB 服务器。 什么是 SMB 服务器&#xff1f; SMB&#xff08;服务器…...

【python计算机视觉编程——10.OpenCV】

python计算机视觉编程——10.OpenCV 10.OpenCV10.2 OpenCV基础知识10.2.1 读取和写入图像10.2.2 颜色空间10.2.3 显示图像及结果 10.3 处理视频10.3.1 视频输入10.3.2 将视频读取到NumPy数组中 10.4 跟踪10.4.1 光流10.4.2 Lucas-Kanade算法使用跟踪器使用发生器 10.5 更多示例…...

医学数据分析实训 项目二 数据预处理预备知识(数据标准化处理,数据离差标准化处理,数据二值化处理,独热编码处理,数据PCA降维处理)

文章目录 数据预处理预备知识任务一 数据标准化处理1. 数据准备2. 数据标准化 任务二 数据离差标准化处理任务三 数据二值化处理任务五 独热编码处理对数据进行“离散化处理”&#xff08;装箱&#xff09;将已经装箱的数据进行OneHotEncoder独热编码 任务六 数据PCA降维处理1.…...

MySQL查询执行(四):查一行也很慢

假设存在表t&#xff0c;这个表有两个字段id和c&#xff0c;并且我在里面插入了10万行记录。 -- 创建表t CREATE TABLE t (id int(11) NOT NULL,c int(11) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB;-- 通过存储过程向t写入10w行数据 delimiter ;; create procedure idat…...

【Obsidian】当笔记接入AI,Copilot插件推荐

当笔记接入AI&#xff0c;Copilot插件推荐 自己的知识库笔记如果增加AI功能会怎样&#xff1f;AI的回答完全基于你自己的知识库余料&#xff0c;是不是很有趣。在插件库中有Copilot插件这款插件&#xff0c;可以实现这个梦想。 一、什么是Copilot&#xff1f; 我们知道githu…...

Spring Cloud集成Gateaway

Spring Cloud Gateway 是一个基于 Spring 生态的网关框架&#xff0c;用于构建微服务架构中的API网关。它可以对请求进行路由、过滤、限流等操作&#xff0c;是Spring Cloud微服务体系中常用的组件之一。下面介绍 Spring Cloud Gateway 的核心概念、应用场景以及简单的示例。 …...

如何准备技术面试?

大家好&#xff0c;我是老三&#xff0c;好久没更新了&#xff0c;翻出之前的一篇旧稿&#xff0c;是一篇总纲性质的文章——如何准备一场技术面试。这篇文章原本的开头是写给金三银四的&#xff0c;转眼就“金九银十”了&#xff0c;每一年都是最差的一年&#xff0c;又是未来…...

Kafka原理剖析之「Topic创建」

一、前言 Kafka提供了高性能的读写&#xff0c;而这些读写操作均是操作在Topic上的&#xff0c;Topic的创建就尤为关键&#xff0c;其中涉及分区分配策略、状态流转等&#xff0c;而Topic的新建语句非常简单 bash kafka-topics.sh \ --bootstrap-server localhost:9092 \ // …...

Java 高级学习路线概要~

前言&#xff1a;恭喜你已经掌握了 Java 的基础知识&#xff01;现在&#xff0c;让我们踏上 Java 高级学习之旅&#xff0c;探索更强大的编程技巧和技术。学习前记得不要忘了巩固和加强基础的学习哦&#xff0c;高级学习也是建立在基础的学习之上。 1. 集合框架进阶 Map 接口…...

浏览器插件快速开启/关闭IDM接管下载

假设你已经为浏览器安装了IDM扩展&#xff0c;那么按下图的点击顺序&#xff0c;可以快速开启或关闭IDM的下载接管&#xff0c;而不必在IDM软件的设置->选项中&#xff0c;临时作调整。...

初识c++:入门基础

打字不易&#xff0c;留个赞再走吧~~ 目录 一.第一个c程序二.命名空间 namespace三.C输⼊&输出四.缺省参数 C兼容C语⾔绝⼤多数的语法&#xff0c;所以C语⾔实现的hello world依旧可以运⾏&#xff0c;C中需要把定义⽂件 代码后缀改为.cpp 一.第一个c程序 做好准备我们来写…...

Java Exception 异常相关总结

1.简介 在Java中&#xff0c;当代码运行有问题时会抛出异常&#xff0c;主要分为两类&#xff1a; 1.可以通过try...catch来捕获解决的&#xff0c;不影响后续执行的RuntimeException。 2.不可以通过代码解决的Exception。 为了提高代码的健壮性&#xff0c;我们会选择去捕…...

HighCharts图表自动化简介

什么是分析数据? 在任何应用程序中捕获并以图形或图表形式显示的分析数据是任何产品或系统的关键部分,因为它提供了对实时数据的洞察。 验证此类分析数据非常重要,因为不准确的数据可能会在报告中产生问题,并可能影响应用程序/系统的其他相关领域。 什么是HighChart? …...

使用LDAP登录GitLab

使用LDAP登录GitLab gitlab.rb 配置如下 gitlab_rails[ldap_enabled] true #gitlab_rails[prevent_ldap_sign_in] false###! **remember to close this block with EOS below** gitlab_rails[ldap_servers] YAML.load <<-EOSmain:label: LDAPhost: 172.16.10.180port:…...

【2024】前端学习笔记5-表单标签使用

表单是网页提供的一种交互式操作手段,主要用于采集用户输入的信息。 学习笔记 1.表单框架:form标签1.1.action属性:目标指向1.2.method属性:提交方式1.3.id属性:唯一标识1.4.placeholder属性:提示文字2.input标签2.1.text类型:基本文本输入2.2.password类型:密码输入2.…...

数据结构--二叉树(C语言实现,超详细!!!)

文章目录 二叉树的概念代码实现二叉树的定义创建一棵树并初始化组装二叉树前序遍历中序遍历后序遍历计算树的结点个数求二叉树第K层的结点个数求二叉树高度查找X所在的结点查找指定节点在不在完整代码 二叉树的概念 二叉树&#xff08;Binary Tree&#xff09;是数据结构中一种…...

【将字符串变为空的编辑距离】

题目描述 求由s串变成t串的编辑距离 在s串的开头/末尾添加一个字符&#xff0c;花费p 在s串的开头/末尾添加一个s串的子串&#xff0c;花费q 每次作都是基于当前的s串 s串初始为空 分析 等价于将一个字符串变为空串的过程 第一层按照长度遍历&#xff08;如果按照下标i,j遍…...

卡特兰数的推理

卡特兰数&#xff08;Catalan number&#xff09;&#xff0c;又称卡塔兰数、明安图数&#xff0c;是组合数学中一种常出现于各种计数问题中的数列。它以比利时数学家欧仁查理卡特兰的名字命名&#xff0c;但值得注意的是&#xff0c;这一数列的首次发现可以追溯到1730年&#…...

高精度治具加工的重要性和优势

在现代工业制造中&#xff0c;高精度治具加工扮演着举足轻重的角色。它不仅关乎产品制造的精度与质量&#xff0c;还直接影响到生产效率和成本控制。因此&#xff0c;时利和将深入探讨高精度治具加工的重要性和优势&#xff0c;对于提升工业制造水平具有重要意义。 高精度治具加…...

新版IDEA提示@Autowired不建议字段注入

随着项目的复杂度的增加&#xff0c;我们通常会在一个业务类中注入其他过多的业务类。从而使当前的业务层扩充成一个大而全的功能模块。那么就容易出现一下问题 字段注入会让依赖关系变得不那么明显&#xff0c;因为你无法通过构造函数看到所有的依赖项。使用构造函数时&#…...

adb的安装和使用 以及安装Frida 16.0.10+雷电模拟器

.NET兼职社区 .NET兼职社区 .NET兼职社区 1.下载adb Windows版本&#xff1a;https://dl.google.com/android/repository/platform-tools-latest-windows.zip 2.配置adb环境变量 按键windowsr打开运行&#xff0c;输入sysdm.cpl&#xff0c;回车。 高级》环境变量》系统变量》…...