自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Qt 01】cmake搭建Qt VS2019开发环境

PDB文件(Program Database File)是Microsoft Visual Studio编译生成的调试信息文件,主要用于存储程序的符号信息(如函数名、变量名、行号等),使调试器能将机器代码与源代码对应,从而辅助开发人员定位问题。(如果打开失败,原因估计是找不到Qt Desinger,右键 --> 打开方式,自己配置一个Qt Desinger,这里是Qt Desinger需要自己去官网或其他地方下载)在开发过程中,如果想通过断点进入到 qt 源码中,我们可以配置pdb文件。

2025-03-25 10:18:13 738

原创 【C++】类型转换

RTTI 使得你可以查询对象的动态类型(即对象在运行时的实际类型),并在多态的情况下执行类型转换。在 C++ 中,虚函数表(vtable)与 RTTI 密切相关,因此只有包含虚函数的类才能启用 RTTI。这四种转换方式提供了强类型检查的转换机制,分别适用于不同场景,避免了 C 风格转换的隐患。在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与。RTTI 允许你在运行时检查对象的实际类型,特别是在使用基类指针或引用时。对象,可以用于比较类型或获取类型的名字。

2024-11-06 23:33:38 814

原创 【算法】排序算法总结

排序方法时间复杂度空间复杂度稳定性平均情况最坏情况最好情况直接插入排序O(n2n^2n2O(n2n^2n2O(nnnO(1)稳定折半插入排序O(n2n^2n2O(n2n^2n2O(nnnO(1)稳定希尔排序O(n1.3n^{1.3}n1.3O(1)不稳定简单选择排序O(n2n^2n2O(n2n^2n2O(n2n^2n2O(1)不稳定堆排序O(nlog2nnlog_2{n}nlog2​nO(n。

2024-10-30 23:42:49 898 1

原创 【问题】栈区地址分配之谜:为什么局部变量的地址会递增?

在大多数操作系统中,进程的栈是向下增长的。这意味着栈的起始地址通常是高地址,而随着数据的推入(如函数调用、局部变量等),栈指针会向低地址移动。这种设计有助于栈和堆之间的空间利用,因为堆是向上增长的。,当我们调用函数时,栈区会开辟一块空间给函数使用。而函数内的局部变量是在函数栈帧中开辟空间。怎么linux栈区的地址是向上增长的呢?

2024-10-30 23:15:06 386

原创 【数据结构】树(堆、哈夫曼树、二叉排序树、AVL树、)(更新中....)

但是如果要对AVL树做一些结构修改的操作,性能非常低下,比如:插入时要维护其绝对平衡,旋转的次数比较多,更差的是在删除时,有可能一直要让旋转持续到根的位置。若二叉树中最多只有最下面两层的结点的度数可以小于2,并且最下面一层的叶子结点都依次排列在该层最左边的位置上,则这样的二叉树称为完全二叉树(complete binary tree)注意:由于变化前C的平衡因子不一定为0,可能是0,-1,1,3种情况下,A,B的最终平衡因子有所不同。插入某个节点后,如果该节点的父节点的平衡因子==0,则它的爷爷一定平衡。

2024-10-30 22:53:33 587

原创 【C++】结构体、enum、union回顾

怎样即节省空间又节省时间呢?- 调整变量顺序/修改默认对齐数。

2024-10-30 11:39:35 1094

原创 【C++】C++11

RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源。在C++98中auto是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以auto就没什么价值了。在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。如果p1是将亡值,这没什么问题,但p1不一定是将亡值,可能是左值,不能随便的转移资源。

2024-10-25 11:26:52 732

原创 【linux系统】文件系统

通过上面的例子可以看出:test.txt的inode(1050440)与hard_link的inode(1050440)相同,而我们知道,每个文件的inode是唯一的,因此可以推断hard_link不是一个独立的文件,反之,soft_link是一个独立的文件,因为它有独立的inode.假如我们删去test.txt,与文件inode:105040的文件名减少一个,因此引用计数减1,由2变为1,因此下方hard_link前面的数字变为1。它是一个权限的反向屏蔽值,掩码中的位会关闭(去除)文件或目录的默认权限。

2024-10-16 13:39:12 737

原创 【linux网络】传输层

虽然TCP有了滑动窗口这个大杀器, 能够高效可靠的发送大量的数据. 但是如果在刚开始阶段就发送大量的数据, 仍然可能引发问题. 因为网络上有很多的计算机, 可能当前的网络状态就已经比较拥堵. 在不清楚当前网络状态下, 贸然发送大量的数据,是很有可能引起雪上加霜的. 因此TCP引入了。**序号的增长是根据发送的数据量而定的,每发送一个字节,序号就增加一个。6位标志位:TCP报文是有类型的,比如一个TCP报文可能是通信报文,也可以是建立连接的报文,也可以是关闭连接的报文,因此需要用标志来区分。

2024-10-14 10:01:05 1022

原创 【linux系统】进程(进程PCB + 进程地址空间+进程控制)

僵尸进程虽然不会直接对系统造成严重影响,但长时间存在的僵尸进程会对系统的正常运行产生一些间接的危害,包括:可能导致资源耗尽,影响进程管理,降低系统稳定性。这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行所以,调整进程优先级,在Linux下,就是调整进程nice值。子进程更改数据后,会发生写时拷贝,因此子进程和父进程的g_val值不一样,符合预期,但是为什么发生了写时拷贝,父子进程的g_val地址还是相同?僵尸进程是子进程结束,但父进程未结束。

2024-10-11 18:49:56 1286

原创 【linux网络】socket编程(TCP/UDP)

在函数内部,函数会解析local的前2个字节,如果是AF_INET就表示使用IPv4的网络通信,如果AF_UNIX就表示使用本地通信。当客户端调用 socket() 函数创建套接字时,操作系统会为该套接字分配一个未使用的端口号(通常是一个临时端口号),并在后续的通信过程中,该端口号会被动态地绑定到套接字上。连接的可靠性是有代价的,需要维护可靠性,这意味TCP更复杂,而不可靠意味UDP很简单。sin_addr的类型是in_addr的结构体,地址保存在in_addr的成员s_addr中,使用时要注意。

2024-04-13 14:59:32 1372

原创 【linux系统】线程(线程TCB+线程同步和互斥+线程安全)

需要注意的是,__thread 关键字是 GCC 的扩展语法,虽然在大多数情况下可以正常工作,但并不是 C 标准的一部分,因此在一些不支持 GCC 扩展语法的编译器中可能无法使用。在 C11 标准中引入了 _Thread_local 关键字,用于实现线程局部存储,具有类似的功能,而且是标准化的语法。

2024-04-02 11:26:35 951

原创 【linux系统】环境变量

环境变量是操作系统中存储的一组键值对,用于指定进程的运行环境。每个进程都会继承父进程的环境变量,并可以在此基础上进行修改或扩展。环境变量通常包含了诸如路径、默认编辑器、语言设置等信息不同的环境变量有不同的用户,通常有全局属性。在linux系统中,使用命令env可以查看环境变量某些环境变量的意义PATH:linux下的默认指令搜索路径路径与路径之间使用分隔我们日常定义的程序,运行时需要./, 而像ls却不需要加上./,原因就在于PATH,ls的路径存储在PATH变量里面,即/usr/bin。

2024-03-21 19:27:00 773

原创 【linux】进程1 -- 状态和优先级

它的作用是创建一个与当前进程几乎完全相同的子进程,这个子进程有着与父进程相同的代码、数据和上下文,但是有着独立的内存空间。僵尸进程虽然不会直接对系统造成严重影响,但长时间存在的僵尸进程会对系统的正常运行产生一些间接的危害,包括:可能导致资源耗尽,影响进程管理,降低系统稳定性。这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行所以,调整进程优先级,在Linux下,就是调整进程nice值。linux下,我们使用的命令,如ls等,运行起来就是一个进程。

2024-03-21 16:48:24 1020

原创 【linux系统】进程间通信1--管道

在多任务操作系统中,不同的进程可能同时运行,它们之间可能需要进行数据共享、协作完成某项任务等操作,这就需要进程间通信。对于一个文件,我们普遍印象如下图,进程打开文件,通过写(读)操作,写入(读取)文件缓冲区,再由文件缓冲区刷新到磁盘里。上面讲到的匿名管道应用于具有血缘关系的管道,如果我们要让俩个不相干的进程进行通信,就要使用命名管道。管道是Unix中最古老的进程间通信的形式,所谓的“管道”,指的是从一个进程连接到另一个进程的一个。命名管道和匿名管道的性质一样,是一种特殊的文件形式,不存储数据,只传递数据。

2024-03-18 20:55:55 905

原创 【linux系统】动静态库

在这个目录下,可以放置一系列以 .conf 结尾的文件,这些文件包含了动态链接器的库文件搜索路径配置。此时我们用ldd命令来查看,会看到not found,找不到库,可我们明明已经告诉编译器库在哪里,为什么还是找不到?当程序运行时,dy.so会被加载到内存里,然后通过页表,映射到进程1和进程2的进程地址空间里的。原因是你只告诉了.h的路径,并没有告诉.a文件的路径.静态库:程序在编译链接的时候把库的代码链接到可执行文件中。动态库:程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

2024-03-11 19:43:49 1138 1

原创 【C++】面向对象的三大性质——多态,从使用到底层。

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。举例:对于买票的这个行为来说,成年人买票全价,儿童买票半价,学生买票打折,军人优先买票……不同的人虽然都是进行买票的行为,但买票过程的细节不完全相同。而为了让不同的对象,进行同一行为,产生不同的状态。我们则需要采用面向对象的三大特性之一:多态。Student st;//普通人买票ppn = &st;//学生买票。

2023-09-26 12:03:09 236

原创 【多态】虚函数表存储在哪个区域?

思路:比较虚函数表内存储的地址与其他存储区域的地址进行对比,看谁更接近。通过上面的结果可以看出:虚表的地址 与 常量区的地址最为接近。C:代码段(常量区)D:数据段(静态区)

2023-09-24 19:44:50 808

原创 【问题】为什么析构函数的名称统一处理为destructor?

对于析构函数,我们需要的就是函数名相同,因此将析构函数的名称统一处理为destructor.此时我们已经满足多态构造的2个条件的其中之一:基类的指针或引用, 剩下的我们需要满足。析构函数的名称统一处理为destructor的目的是为了解决。而根据指针(引用)指向的对象类型来选择对应的函数,这不就是。而这又引出了一个问题:为什么要进行析构函数的重写?

2023-09-23 22:13:33 239

原创 【C++】继承

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用public:public:int id;基类(父类)继承方式派生类(子类)很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱。

2023-09-20 20:21:25 164

原创 【STL容器】list

list本质是一个双向带头循环链表

2023-09-16 11:19:27 298

原创 【STL容器】vector

vector是STL的容器,它提供了动态数组的功能。注:文章出现的代码并非STL库里的源码,只是对源码的简单化处理vector的成员变量是3个迭代器,用来管理一段线性连续空间。

2023-09-15 21:27:59 138

原创 【C++】STL之string

本文将介绍如何实现string,从而提高对string类的理解。

2023-09-12 20:26:30 117

原创 【C++】模板

C++中的模板(template)是一种强大的语言特性,它可以让程序员编写可以适用于不同数据类型的通用代码。通过使用模板,我们可以避免重复编写几乎相同的代码,并增强代码的可重用性和灵活性。本文将介绍C++模板的基本语法、用途和示例。

2023-06-02 22:29:48 477 2

原创 【C++】C/C++内存管理

c++内存管理

2023-05-26 19:03:54 1012

原创 【C++】类和对象(3)

c++类和对象3

2023-05-23 14:49:24 498

原创 【C++】类和对象详解(2)

类和对象中:6个默认成员函数

2023-05-16 12:50:22 447 1

原创 【C++】7. auto和nullptr(c++11)

p1中:const修饰的是p1,等价于 char * const p1,则指针本身无法改变,但你并没有给p1初始化,p1又无法改变,这意味着它指向一个未定义的内存位置。在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。p2中:const是p2指向的内容,即 char* const * p2,则指针本身可以改变,但指针指向的内容无法改变,因此即使你不初始化也可以。可以看出NULL本质是宏,但这里的定义其实是有问题的。

2023-04-29 11:12:31 1318

原创 【C++】类和对象(1)

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题.比如洗衣服这件事:C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

2023-04-26 16:38:20 615 1

原创 【C++】6. 内联函数

当我们调用函数时,是有很多消耗的。其中最大的销毁就是为函数开辟空间 - 函数栈帧。如果我们有一个函数,很短,而且要调用很多次,比如Swap()。它所造成消耗就比较大,那有没有一种方式来减少消耗?内联函数可以帮我们解决这个问题。内联函数是在c++98引入,现在c语言的C99版本也引入了内联函数。

2023-04-23 12:44:22 253

原创 【C++】5. 引用

C语言中什么最难学?那当然就是指针了。不但使用起来麻烦,时不时还会产生一些意料之外的错误。C++提供了一种方式,能做到指针的作用,但比指针用起来更容易。这种方式称为引用。

2023-04-21 00:17:54 367 2

原创 【C++】4. 重载函数

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!

2023-04-18 19:06:17 618 2

原创 【C++】3. 缺省参数

在c语言中,我们使用一个函数时,必须要传对应的参数,少一个都不可以。难道函数的参数就不能有个默认值吗?于是C++对c做出了改良,创造了缺省参数。

2023-04-16 12:16:07 775 3

原创 【C++】2.C++的输入与输出

c语言中我们使用scanf,printf等来进行输入、输出操作,在C++中我们是否有其他方式呢?答案是有的,下面我们来介绍c++的输入&输出。

2023-04-14 09:34:16 1898 2

原创 【C++】1. 命名空间

命名空间是C++中用来避免命名冲突的一种机制。

2023-04-13 16:25:33 479

原创 7种排序算法,C语言代码实现与常见陷阱,采用动图演示让你彻底搞懂排序的奥秘!

排序算法,是每个程序员免不了要面对的一道坎。它们像一只无情的怪兽,总是在不断地折磨着我们的思维。特别是在我们的代码出现了性能问题时,这个怪兽就像是从脑海中跳出来,对我们狠狠地扑了一记。那么,如何驯服这只怪兽,让它乖乖服从我们的命令呢?其实,只需要熟练掌握一些排序算法的实现细节,加上一点幽默的心态,我们就可以轻松地应对这个怪兽了!这里采用都是基础版本来比较。

2023-04-11 19:47:00 643 8

原创 【数据结构】二叉树的分治

在【数据结构】二叉树的遍历中,我们学习了二叉树的遍历,并通过动图演示加深了印象。在文章最后,我提到了二叉树的其他操作,列如求二叉树的节点个数等,这些操作采用的算法思想并非遍历,而是分治。本文将为你介绍二叉树的分治。二叉树的分治是一种常用的算法思想,它利用二叉树的递归结构,将复杂的问题分解为两个或多个相同或相似的子问题,然后递归地求解子问题,最后合并子问题的解得到原问题的解。二叉树的分治可以有效地降低时间复杂度和空间复杂度,提高算法的效率和可读性。

2023-04-01 09:27:43 877 9

原创 【数据结构】二叉树的遍历 - 动图演示

如果你还不知道树及二叉树的概念,请先看这篇文章树和二叉树的介绍对于二叉树,我们学习的重点是二叉树的结构,而想要学好二叉树的结构,则离不开二叉树的基本操作-二叉树的遍历,二叉树的遍历则离不开递归。因此本文将为你介绍如何进行二叉树的遍历,以及如何更好的理解与使用递归。

2023-03-31 15:15:05 2161 1

原创 【数据结构】堆排序

堆排序是一种非常高效的排序算法,它可以在O(n log n)的时间内对任意序列进行排序。它的原理是利用数据结构,堆的性质,将序列构建成一个大根堆或小根堆,然后不断地交换堆顶元素和最后一个元素,并调整堆的结构,直到堆为空。如果你对数据结构,堆还不太熟悉,或者你想复习一下它的基本概念和操作,请先阅读我之前写的一篇文章【数据结构】堆,你可以在我的博客中找到它。如果你已经掌握了数据结构,堆的知识,那么请继续阅读这篇文章,我将为你详细地介绍算法,堆排序的过程和代码实现。我会不定期地分享更多有趣和实用的内容。

2023-03-26 15:32:57 527 3

原创 【数据结构】堆

嗨,各位程序猿和程序媛们!今天我要跟大家聊一聊一个有趣的话题——堆(heap)。别误会,我可不是在讲垃圾堆,虽然有时候我们的代码也可能像一堆垃圾一样令人头疼。堆其实是一种非常有用的数据结构,它可以帮助我们高效地解决很多问题,比如找出最大或最小的元素,构建优先队列等等。如果你还不了解堆,那么赶紧跟我来一起探索这个神奇的数据结构吧!由于堆是特殊的二叉树,如果你还未曾了了解树、二叉树的概念。建议你先去阅读我的这一篇博客【数据结构】树和二叉树的介绍堆的概念。

2023-03-26 14:01:48 675

空空如也

空空如也

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

TA关注的人

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