自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 深入理解C++文件操作

所谓流,是对数据传输过程的一种高度抽象,流就像一根数据管道,数据就像管道中的水流一样,具有方向性、有序且连续地从一端流向另一端。从底层来看,流本质上是一个类。

2026-05-07 19:59:43 205

原创 C++数据结构--AVL树

AVL树,也叫二叉平衡搜索树,就是在BST树的基础上加了平衡操作(平衡的定义是任意节点的左右子树的高度差不超过1)。

2026-05-07 18:10:29 87

原创 深入理解C++设计模式

C++ 设计模式是软件工程中应对复杂系统设计的方法,它总结了一系列在软件开发中反复出现的问题及其优雅的解决方案。掌握设计模式能显著提升代码的可读性、可维护性和可扩展性。

2026-05-06 19:33:45 377

原创 c++数据结构--BST树

BST树称作(Binary Search Tree)或者(Binary Sort Tree),它或者是一颗空树;或者是具有下列性质的二叉树:1、若左子树不为空,则左子树上所有节点的值均小于它的根节点的值2、若右子树不为空,则右子树上所有节点的值均大于它的根节点的值3、左右子树也分别满足二叉搜索树性质:每一个节点都满足 左孩子的值(不为空)<父节点的值<右孩子的值(不为空)

2026-05-06 13:01:23 365

原创 深入理解C++绑定器与函数对象

std::function 是 C++ 标准库提供的一个模板类(定义在 <functional> 头文件中)。它本质上是一个“函数包装器”或“可调用对象的容器”,我们可以将其理解成一个功能更强大,更安全的函数指针,它能够将我们函数/函数对象的类型保留下来。

2026-05-05 15:06:47 705

原创 深入理解C++多线程编程

CAS 是 Compare-And-Swap(比较并交换) 的缩写。它是一种非常底层的原子操作,也是现代 C++ 实现无锁(Lock-Free)并发编程的基石。简单来说,CAS 就像是给内存更新加了一个“防篡改”的安检机制。它包含三个核心要素:内存地址(V)、预期原值(A) 和 新值(B)。CAS与互斥锁同样都能处理多线程的竞态条件问题,CAS并不是无锁,而是不在语言层面实现。

2026-05-05 13:10:46 1066

原创 C++数据结构--大数据查重

哈希表在大数据查重中可以查找重复或统计重复出现的数字,但是其。

2026-05-05 10:25:18 396

原创 深入理解C++智能指针

我们都知道,当我们使用new与delete管理动态内存时,我们使用的是int* p=new int(val),这样的指针,我们称这种指针为裸指针,对于这种指针,我们需要自己管理堆内存的释放,如果我们忘了delete,或者程序运行过程中直接退出了,delete没有运行到,就会导致程序出现内存泄漏,因此,我们需要一种能够自动管理内存释放的指针,这就是智能指针。智能指针实际上就是对普通裸指针的封装,核心就是利用栈上的对象出作用域后会自动析构。

2026-05-04 10:05:28 606

原创 C++数据结构--哈希表

哈希表(Hash Table),也叫散列表,是一种根据关键码值(Key)直接访问记录的数据结构。在理想情况下,哈希表进行数据查找、插入和删除操作的时间复杂度接近 O(1),是目前计算机世界中查找速度最快的结构之一,当然其也存在缺点:空间利用率不高。

2026-05-04 08:43:56 406

原创 C++数据结构--队列

队列(Queue)是一种遵循先进先出(FIFO, First In First Out)原则的数据结构。队列通常有两种实现方式:顺序队列,环形队列与链式队列,各有优劣。但同时从底层来看队列并不是一种新的数据结构,环形队列的底层依靠数组,链式栈的底层依靠链表。(注意C++中的容器适配器queue,底层默认是deque(双向队列)是一个顺序队列,但是我们也可以将其设置成一个链式栈)

2026-05-03 09:00:38 334

原创 C++数据结构--排序算法

重复循环遍历,每次比较相邻的两个元素,如果前大于后就交换,这样每次最大的元素都会交换到最后,每次循环遍历时去掉最后的元素。

2026-05-03 08:59:52 642

原创 C++数据结构--二分搜索

二分搜索(Binary Search),是一种在中查找特定元素的高效算法。二分搜索算法,实际上就是对一颗BST树从root根节点开始搜索的过程,每一次搜索只会沿着一条路径搜索下去:是每次定义索引left与right,每次找一个mid,比较mid索引的值与应找值val,之后缩小查找范围,循环操作,直到找到val或者循环结束。

2026-05-02 17:28:18 190

原创 深入理解C++--STL

1.需要随机访问,只在尾部进行插入/删除,使用vector2.需要随机访问,既需要在头部插入,也需要在尾部插入,使用deque3.不关心随机访问,需要在容器的任意位置频繁插入/删除,使用list。

2026-04-29 19:55:36 1219

原创 C++数据结构--链表

每一个节点都是在堆内存上独立new出来的,节点内存不连续内存利用率高,不需要大块连续内存插入和删除节点不需要移动其它节点,时间复杂度O(1)不需要专门进行扩容操作内存占用量大,每一个节点多出存放地址的空间节点内存不连续,无法进行内存随机访问链表搜索效率不高,只能从头节点开始逐节点遍历:一般链表都有头节点(头节点不存储具体数据),但是leetcode上链表都没有头节点。每一个节点除了数据域,还有next指针域,指下一个节点(存储了下一个节点的地址)未尾节点的指针域是nullptr。

2026-04-27 21:26:08 513

原创 C++数据结构--数组

内存是连续的下标访问(随机访问)时间复杂度是O(1)末尾位置增加删除元素时间复杂度是O(1)访问元素前后相邻位置的元素非常方便非末尾位置增加删除元素需要进行大量的数据移动无序数组-线性搜索O(n)有序数组-二分搜索O(logn)数组扩容消耗比较大。

2026-04-27 21:25:26 149

原创 深入理解C++继承与多态

如图,假如我们定义了A,B两个类,而类B同时也拥有包含了类A的ma,mb,mc三个成员变量,直接一点,我们可以在类B中再定义ma,mb,mc三个成员变量,但这样不仅会导致代码的大量重复,而且这样也并不能表示B中包含的是A中的三个成员变量。为了解决这种问题,面向对象的编程设计了继承操作(如图class B:public A)表示B类继承了A类,A称为,B称为。

2026-04-26 15:01:34 940

原创 深入理解C++语言提供的四种类型转换

在C语言中我们一般使用()进行类型转换,而在C++中,提供了四种方式的类型转换(这四种都是语言级别,不会产生额外的指令),都可以认为是类模板,实现了更为安全的类型转换。

2026-04-26 15:01:11 351

原创 深入理解C++运算符重载

时就出现了问题,自带的加号逻辑无法处理,编译器不知道该如何处理,这时就需要使用运算符的重载函数了。

2026-04-23 19:44:27 137

原创 深入理解C++模板

中,在源文件中直接#include(##include导入的头文件直接在预编译阶段展开)。当然,这种情况也是有办法解决的(不过并不推荐),我们可以在函数模板定义后,直接告诉编译器进行指定类型的模板实例化(如:templete bool compare<int>(int,int))。

2026-04-23 18:37:49 468

原创 深入理解C++--类和对象

但需要在方法名前加上类的作用域(否则就成了全局方法了,同时定义的类外的成员方法不会自动内联,需要手动加inline):接下来,我们来看一个问题,我们知道类通过实例化为对象后,对象是在内存中占有空间的,那么对于一个类,既有成员属性,又有成员方法,这个类所占的空间大小如何计算呢?实际是。

2026-04-22 18:04:38 731

原创 C++数据结构--栈

栈(Stack)是一种遵循“后进先出”(LIFO, Last In First Out)原则的线性数据结构。栈通常有两种实现方式:顺序栈与链式栈,两者各有优劣。但同时从底层来看栈并不是一种新的数据结构,顺序栈的底层依靠数组,链式栈的底层依靠链表。(注意C++中的容器适配器stack,底层默认是deque(双向队列))

2026-04-21 13:06:04 568

原创 深入理解C++new与delete

c++中的new,delete与c这的malloc与free都是开用于辟动态内存。两者虽然作用相同,但是有着很大的区别。首先:malloc和free属于c语言的库函数,而new与delete属于c++的运算符。在具体使用上:malloc以字节开辟空间,返回void*类型的指针(需要强转),开辟失败返回空指针,不进行初始(需要自己再进行初始化),通过free释放空间。

2026-04-20 19:41:47 19

原创 C++数据结构--回溯算法

算法思想:在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根节点出发深度搜索解空间树。当搜索到某一节点时,要先判断该节点是否包含问题的解;如果包含就从该节点出发继续深度搜索下去,否则逐层向上回溯。一般在搜索的过程中都会添加相应的剪枝函数,避免无效解的搜索,提高算法效率。解空间:解空间就是所有解的可能取值构成的空间,一个解往往包含了得到这个解的每一步,往往就是对应解空间树中一条从根节点到叶子节点的路径。

2026-04-19 15:12:33 240

原创 C++数据结构--并查集

首先,我们需要定义一个数组来表示整个森林,这个数组需要记录每个节点的父节点的编号,我们定义为parent。(需要的数组大小根据具体问题分析)

2026-04-19 13:49:50 718

原创 深入理解c++--const与引用用法

C++中由const修饰的变量,不能再作为左值被修改(不是不能被修改),如定义了const int a=10;那么就不能再写a=20了。我们这里着重分析c语言与c++中const的区别:在c语言中const修饰的量可以不进行初始化(虽然这样会导致之后无法在对其赋值,无实际意义,但c++中必须要初始化,由此可见c中的const与c++中的const并不相同)。实际上c语言中的const修饰的变量称作常变量(除了不能作为左值外没有太大区别),而c++中const修饰的变量是真正的常量。

2026-04-16 20:07:25 566

原创 深入理解C++的函数相关内容

我们以上述简单的函数为例,这里的三个sum函数中,后两个的形参都有默认值,那么我们再传值的过程中就可以不传那些具有默认值的形参。注意事项:1:函数的默认值需要从右向左给,即这里要先给b默认值才能给a。2:如果函数有默认形参,但仍旧进行了传值,那么传进来的值会将默认值覆盖。3:函数形参给默认值可以在定义时,也能在声明时,但是不能在重复给(即同一个形参只能给一个默认值)。之后我们从汇编代码上看看,形参带默认的函数与不带的函数之间的效率有什么区别。

2026-04-15 19:50:38 588

原创 C++--编译链接原理

在工程中,我们所创建的每一个 .cpp文件都要单独进行编译,生成对应的目标文件,但这些文件都是零散的,链接的过程就是将这些零散的目标文件合并在一起,生成可执行文件(即windows下的 .exe文件,Linux的a.out文件)。链接分为两种静态链接,与动态链接。静态链接:在编译时,程序需要的所有库代码都会被完整地复制一份,并打包进最终生成的可执行文件(如 .exe)里。程序不再依赖外部库文件。动态链接:在编译时,程序只记录下它需要哪些库。

2026-04-14 19:30:38 821

原创 C++--函数栈帧的创建与销毁

函数栈帧,是程序在运行时为每一次函数调用在栈内存中分配的一块独立的内存空间,它在函数调用时创建,在函数运行结束后销毁。

2026-04-09 20:31:34 623

原创 C++——虚拟地址空间区域划分

对于任何一个计算机程序来说,其在内存中运行时主要由指令与数据组成,对于任意一个编程语言,再编译链接后都会生成可执行文件,如windows下的.exe文件,这一可执行文件通常放在磁盘上,而在程序无法在磁盘上直接运行,实际运行时要先加载到内存中,但并不会加载到物理内存中,而是虚拟内存,操作系统会为这个进程创建一个独立的虚拟地址空间。

2026-04-07 20:49:17 385

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除