- 博客(62)
- 收藏
- 关注
原创 动态规划:第一弹(第N个泰波那契数列、使用最小花费爬楼梯、解码方法)
本文主要从三个Leetcode算法题入手,图文并茂的讲解如何使用动态规划解决算法题目。如何定义动态规划表,如何对具体问题分析出状态转移方程,这两个问题是动态规划的核心,本问都会详细说明。
2025-04-02 21:36:39
570
3
原创 计算机网络:Socket编程 Tcp协议 第二弹
下面是往期文章链接,往期文章主要讲解socket编程的许多预备知识,还详细介绍了socket和bind等网络接口函数的用法。如果不是很了解socket套接字,可以先阅读往期博客。
2025-03-12 23:18:10
944
1
原创 计算机网络:Socket网络编程 Udp与Tcp协议 第一弹
unix域间套接字,作用于本地通信,在16地址类型后,还有108字节的路径名字段。但是在网络通信过程中,传输一个点分十进制的IP地址,需要十几个字符,字节数太大,所以IP地址一般会转换成一个32位的整数,大小才4字节。第二个参数是sockaddr结构体指针,一般使用网络通信,会传sockaddr_in结构体指针,需要进行类型强制转换,第三个参数该结构体的字节数。可是在C语言中不能直接支持类型的继承和多态,但是规定不管是种套接字类型,开头的字段是2字节大小的16位地址类型,表示该套接字的种类。
2025-03-02 21:55:33
1123
原创 Linux:深入了解进程信号(上)
在我们的日常生活中,会遇到许多信号,比如红绿灯、铃声和乌云。看到红灯,我们知道需要停下来等待;绿灯亮起,我们可以安全通行。教室里的铃声响起,我们明白这是下课的信号。当看到天空中布满乌云,我们就知道应该把晾晒的衣服收回家了。这些信号帮助我们按照既定的规则和自然的指示来安排我们的行动。
2025-02-16 23:49:26
1172
1
原创 Linux进程间通信:匿名管道与命名管道的详解
当使用ps命令查看sleep指令相关进程信息,会发现两个sleep进程的ppid值相同,即有相同的父进程,并且pid值是相邻的,说明是兄弟进程。用新会话查看fifo管道,会发现此时文件大小还是0,说明命名管道虽然有文件属性,但是写入的内容不会刷新到磁盘中,只用于进程通信。命名管道和匿名管道的区别,是两个进程看到统一资源方式不同,前者是通过文件路径唯一性标识资源,后者是通过继承父进程文件描述符表获得资源。并且命名管道虽然有文件名,并且保存在磁盘上,但是加载到内存时,会有一块内存缓冲区,可供不同进程通信。
2025-02-07 15:30:52
998
1
原创 Linux:深入了解fd文件描述符
根据上面的讲解,我们知道文件描述符是个整数,并且从0开始,不断递增。碰巧的是数组下标也是从0开始的整数,不断递增。那么文件描述符和数组下标有什么关系呢?一个程序启动,被加载到内存中,操作系统会分配给一个task_struct结构体对象。如果有多个进程,那么操作系统会使用一张链表管理所有的进程的task_struct对象,这是进程管理。当CPU执行到open函数,打开log.txt文件,那么需要将磁盘上的文件加载到内存中。
2025-01-10 19:48:13
1135
2
原创 计算机网络:TCP/IP网络协议
老人会询问他的出发地和目的地,张三回答是从香港出发,目的地是北京。然而,随着网络规模的扩大,主机数量增多,多台主机同时发送消息时,数据冲突和碰撞现象频发,这导致了数据传输的丢失和效率低下。然而,如果使用摩斯电码传输的是中文和英文这两种不同的语言,因为上层通信语言协议不相同,编码和解码参照系不同,即便有摩斯电码的辅助,信息的传递也会遇到障碍。计算机普遍遵循冯诺依曼架构设计,CPU和内存通过总线直接进行数据交互,而磁盘,网卡等外设,则无法直接与CPU进行通信,它们必须通过内存作为中介来完成数据的传输。
2024-12-25 13:39:55
1222
2
原创 Linux:深入理解进程控制(进程终止、等待和替换)
而execv函数中的“v”指的是vector,就是数组的意思,将在命令行输出的指令按空格分割好填到数组中,再传入函数中。运行结果如下,一般来说回收子进程不会失败,在使用ps指令展示process进程的相关信息中,当子进程运行5秒结束后,子进程会立马被父进程回收,只剩下父进程的相关信息,没有显示子进程的僵尸状态。因为execlp函数中的“p”指的是环境变量PATH,不要忘了子进程会继承父进程的环境变量表,而环境变量PATH会带有指令的可执行文件路径,该函数会在PATH变量提供的路径中寻找可执行程序。
2024-12-07 12:02:03
971
1
原创 Linux: 进程地址空间(理解虚拟地址和页表)
假如我们写char *buff = “helloworld”,字符“helloworld”保存在代码区里面,而代码区是只读的,当我们写下*buff = “byte”代码时,编译器是检查不出来的,只有操作系统查看页表,发现你准备对只读代码区进行写操作,操作系统才会阻拦你,杀掉进程。因为进程pcb和物理内存通过虚拟地址空间和页表隔开,物理内存根本不用关心进程申请的空间要做什么,而进程通过虚拟地址空间认为自己可以支配整个物理内存,他在虚拟地址开辟的空间,只有进程被调度执行时,才会在物理空间上申请。
2024-11-24 16:32:28
874
4
原创 Linux:命令行参数、环境变量与本地变量
如果在命令行中加上第二个参数,再判断该参数是否跟"-opt1"、"-opt2"、"-opt3" 三个字符串中的任意一个相等,相等的话,就会实现某种功能,不过这里使用打印来替代。shell拿到命令行的参数,会按照空格打散,形成一张字符串列表,并记录参数个数,就是我们所说的argv和argc变量。而所有在命令行启动的程序,都是shell进程的子进程。我们定义一个指针变量,用来接受getenv函数返回的指针,如果该进程有ISRUNNING环境变量,那么isrunning指针就不为空,会打印else下的语句。
2024-11-09 16:18:41
1201
4
原创 Linux:进程优先级 进程调度切换 调度算法
在active队列中,执行时间到达时间片的进程会放到expired指向的队列,而新进程也会放到expired指向的队列,那么说明active指向队列中的进程结构体对象,只会越来越少。做了这个操作后,CPU通过current指针找到新进程的代码,覆盖掉原来的ir寄存器的指令,重新计算pc指针的地址,写入新地址。上图是runqueue结构体内部的变量,其中又包含一个queue结构体对象,queue结构体中有task_struct结构体指针数组,里面的元素用于指向进程的task_struct对象。
2024-10-23 18:10:26
989
6
原创 Linux:进程状态
相对应地,在Windows操作系统中,当用户将一个耗时的任务,如下载大文件,最小化其窗口后,该任务便在后台运行。当CPU要调度pid为1的进程时,我们假设使用最简单的FIFO(先进先出)调度算法,那么CPU会到runqueue队列中找到第一个task_struct对象,获取该进程main函数地址和数据,放到CPU的寄存器中,并执行该进程。但是由于处于运行状态的进程太多而导致内存资源不足,而运行队列尾部的进程一段时间都不会被调度,操作系统就会将这些进程放到磁盘中的swap分区,此时进程状态叫做运行挂起状态。
2024-10-16 22:28:24
1441
3
原创 Linux:进程入门(进程与程序的区别,进程的标识符,fork函数创建多进程)
最后一行语句中,pid值是29448,ppid值是29447,它的父进程就是myproc程序启动后的进程,说明这是fork函数创建出来的子进程,并且pid值是连续的。因为fork函数内部再返回值之前,会先创建子进程,创建进程会先在内核中创建task_struct结构体对象,用于管理进程的属性,然后代码共享,数据拷贝父进程的。而子进程会私有一份数据,因为两个进程间数据互相修改,可能会触发某些条件导致程序崩溃,所以进程之间具有很强的独立性,一个进程崩溃不会影响另外一个进程。,该对象详细记录了进程的各种属性。
2024-10-06 22:15:02
1276
5
原创 Linux:深入理解冯诺依曼结构与操作系统
在上图中展示的系统中,硬件资源的调度是通过驱动程序来实现的。操作系统扮演着中介的角色,接收用户的指令,并通过调用相应设备的类对象来激活驱动程序。用户无法直接与操作系统交互,而是需要通过用户操作接口和系统调用(system call)来传达其请求。系统调用充当了用户与操作系统之间的桥梁。那么,为什么不允许用户直接调用操作系统呢?我们做个类比。银行不仅仅拥有设备、桌椅板凳和仓库等硬件资源,更重要的是,它还需要工作人员进行管理和维护人员进行定期检修。银行的日常运营包括提供存取款和贷款服务,从这个角度来看,
2024-10-02 18:57:21
1913
7
原创 滑动窗口算法第一弹(长度最小的子数组,无重复字符的最长子串 最大连续1的个数III)
本文将深入剖析三道LeetCode题目,从基础的暴力解法出发,逐步阐述如何通过逻辑推理和算法优化,过渡到高效的滑动窗口算法。文章将配备图文并茂的解析,助您深入理解每一步的优化过程。
2024-09-24 22:24:29
1223
4
原创 C++11:lambda表达式和包装器(function bind)
而是function拿到该函数的位置,并将其存储到function的成员变量中,在调用函数时,先调function中的operator(),再调该函数。placeholder有占位符的意思,该命名空间中有许多的占位符,_1可以替代传入的可调用函数的第一个参数,_2可以替代传入的可调用函数的第二个参数,_N可以替代传入的可调用函数的第N个参数。一般情况下,排序的结果是升序的。下面代码中,先定义了名为Rate的类,重载了()函数,使用Rate对象r1,使用类似函数的操作,完成对利率的计算,实际上。
2024-09-16 10:57:02
1134
4
原创 C++11: 智能指针(unique_ptr,shared_ptr和weak_ptr的使用及简单实现)
内存泄漏是指在程序运行过程中,由于疏忽或错误而未能释放不再使用的内存,导致这部分内存得不到回收。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,从而造成了内存的浪费。内存使用量增加:随着内存泄漏的累积,程序占用的内存会越来越多。程序性能下降:频繁的内存分配和释放可能导致内存碎片化,进而影响程序性能。系统资源耗尽:长时间运行的程序可能会耗尽系统内存,特别是对于操作系统游戏服务器数据库系统和客户端应用程序等关键任务程序,会导致响应越来越满,最终卡死。
2024-09-06 12:51:24
1084
1
原创 Linux: make指令与Makefile文件
Linux操作系统中,我们每编写一个C/C++代码,都要手动使用gcc/g++指令,对代码进行编译并生成可执行程序。如果对该代码有所改动,需要再次使用指令,形成新的可执行程序,删除之前的可执行程序。如下面的场景,创建一个code.c文件,写了一个简单的打印程序,通过gcc指令直接生成code可执行程序,执行该程序,打印出一句话。如果对该份代码还有改动,就要像下面一样删除刚生成的可执行程序,并重复刚刚的操作。这样的操作十分麻烦,有什么解决办法吗?此时就要使用make指令,搭配上MakeFile文件。
2024-08-31 21:51:22
1991
2
原创 C++11:右值引用、移动语义和完美转发
C++11作为一次重大的更新,引入了许多革命性的特性,其中之一便是右值引用和移动语义。本文将深入探讨其中引入的右值及其相关概念,帮助读者更好地理解这一特性,从而在编程实践中更有效地利用它。经过长篇累牍的讲解,相信大家对右值引用和移动语义的概念有了初步的认识。通过对这些特性的学习,我们可以编写出更加高效和精炼的代码。如果亲自上手敲写上述示例代码,会有更加深刻的理解。创作不易,希望这篇文章能给你带来启发和帮助,如果喜欢这篇文章,请留下你的三连,你的支持的我最大的动力!!!
2024-08-20 22:28:15
1117
1
原创 数据结构: 哈希表(C++简单实现)
本文将深入探讨一种高效且实用的数据结构——哈希表。虽然红黑树以其平衡的特性确保了查找次数与树的高度成正比,但当追求极致的检索效率,希望无需经过层层比较便能直接定位目标元素时,哈希表便成为了我们的不二之选。哈希表相比于红黑树在查找、插入和删除操作上通常能够提供更快的性能。然而,哈希表的这一优势是以牺牲顺序遍历能力为代价的,因为哈希表中的元素是无序存储的。两种数据结构各有所长,它们的应用场景也因此而异。
2024-08-12 13:40:03
1268
原创 数据结构:红黑树(C++简单实现)
红黑树在实际中应用更广,本文将深入探讨这一数据结构的特点,同时通过详细的步骤分析红黑树的插入操作。红黑树的插入操作虽然相对复杂,但其核心思想是通过调整树的结构来保持红黑树的五大性质。在插入过程中,我们主要涉及到颜色变换和树的旋转。通过这些操作,我们能够确保红黑树的平衡,从而保证其查找、插入和删除操作的时间复杂度为O(log n)。虽然删除操作更为繁琐,但掌握了插入操作的精髓,删除操作的理解就会相对简单,所以本文暂不介绍删除操作。
2024-08-02 00:55:04
640
1
原创 C++ set、map、multiset和multimap容器
本文将重点探几种种基于树形结构的关联式容器set、multiset、map和multimap。这这四种容器在C++标准库中占据着重要地位,它们不仅提供了强大的数据存储和检索功能,还各自具备独特的特性,如自动排序、键值对的存储以及多键值的支持。接下来,我们将详细介绍他们的特性和用法,帮助读者更好地理解和运用树形结构关联式容器。集合是按照特定顺序存储唯一元素的容器。在set中,元素的值也标识它(值本身就是键,类型为T),并且每个值必须是唯一的。set中元素的值在容器中。
2024-07-30 22:21:29
976
原创 数据结构:AVL树(C++实现)
本文延续前文二叉搜索树,开启平衡二叉搜索树的篇章。在这一篇章中,我们将重点关注AVL树,这是一种严格平衡的二叉搜索树。AVL树通过精巧的平衡机制,确保了树的高度始终保持在对数级别,从而大大提升了查找、插入和删除操作的性能。本文将详细介绍AVL树的原理、平衡调整方法以及性能分析。通过对AVL树的学习,我们不仅深入理解了平衡二叉搜索树的原理和操作,还掌握了如何通过旋转来维护树的平衡性。这一过程加深了我们对平衡二叉树重要性的认识。
2024-07-27 00:31:11
1020
原创 数据结构:二叉搜索树(简单C++代码实现)
本文将深入探讨二叉搜索树这一重要的数据结构。二叉搜索树不仅是一个功能强大的数据结构,而且在实际应用中展现出了极高的实用性。它以其独特的组织方式,使得查找、插入和删除操作都能在平均对数到线性时间内完成,从而大大提高了数据处理的效率。为了更好地理解二叉搜索树的工作原理,我们使用C++语言实现了一个简单的二叉搜索树。通过本文的阐述,相信你应该对二叉搜索树的基本概念、特性以及操作方法已经有了一定的了解。不过想要掌握这个数据结构,还需要亲自上手编写一个二叉搜索树的代码。通过编码实践,才能更深刻体会到内部的工作机制。
2024-07-22 10:31:31
971
原创 Linux之旅:常用的指令,热键和权限管理
本文将开启我的Linux之旅,主要讲述Linux中常用的指令,热键和权限管理。内容丰富,干货满满,适合新手学习!通过本文,可以学习到一些Linux的皮毛知识。前路漫漫,任重道远!创作不易,希望这篇文章能给你带来启发和帮助,如果喜欢这篇文章,请留下你的三连,你的支持的我最大的动力!!!
2024-07-20 15:27:17
860
原创 C++ 多态第一弹
本文讲解C++三大特性之一多态。多态是C++的灵魂所在,它使得程序设计更加抽象、灵活,能够处理更为复杂的问题。接下来,让我们一起揭开多态的神秘面纱,探索它的应用。被virtual修饰的类成员函数称为虚函数。public:两个函数在同一个作用域下。函数名相同,参数类型,个数不同。两个函数分别在基类和派生类的作用域中。两个函数必须是虚函数。函数名,参数,返回值都必须相同(除了两个例外)。两个函数分别在基类和派生类的作用域中。函数名相同即可。
2024-07-15 19:37:42
1095
1
原创 C++ 继承第一弹
本篇文章主要讲解C++的继承。继承是C++的三大特性之一,重要程度不必多说。本文配有代码示例进行细致讲解,内容丰富。继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。继承定义的格式如下,在派生类后面加上冒号,再添加继承方式和基类。
2024-07-11 17:50:33
720
原创 C++ 模版进阶
本篇文章主要讲解的是模版进阶的内容,其中有模版更深入的应用,内容丰富,干货多多!一个程序(项目)有若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。模版复用代码,节省资源,提高开发效率。增强代码的灵活性。模版会导致代码膨胀问题,使得编译时间变长。出现模版编译错误时,错误信息非常凌乱,难以定位错误进行纠正。通过这篇文章,对于模版的使用有了更深入的了解,如果还有某些地方不够熟悉,可以自己动手敲敲代码。
2024-07-07 18:23:51
847
原创 双指针算法第二弹(查找总价格为目标值的两个商品-和为s的两个数字 三数之和 四数之和)
本篇文章开启双指针算法第二弹,一起来感受双指针算法的魅力。这三道OJ题思路相似,难度由易到难,可以按照下面顺序自己挑战一下。每道题目中都带有链接,不用再去Leetcode寻找了!通过这三道题目的锻炼,想必对双指针算法有自己的理解,尽量捋顺思路后,自己动手实现代码,看看有哪些坑点。多说无益,自己动手吧!创作不易,希望这篇文章能给你带来启发和帮助,如果喜欢这篇文章,请留下你的三连,你的支持的我最大的动力!!!
2024-06-27 17:48:23
1067
原创 双指针算法第一弹(移动零 复写零 快乐数)
本文是讲解三道双指针相关的OJ题目,我会慢慢深入,一般的题目从暴力解法讲起,再进行优化,使用双指针。本文附有详细的图文示例,干货多多。如果认真做这三道题,并且通过画图来熟悉整个流程,对与双指针算法的理解更深入,不知可以使用指针,还可以使用变量函数来记录信息,从而提高效率。创作不易,希望这篇文章能给你带来启发和帮助,如果喜欢这篇文章,请留下你的三连,你的支持的我最大的动力!!!1。
2024-06-23 15:40:16
1062
原创 C++ string字符串的使用和简单模拟实现
本文讲解string串的使用和一些简单的模拟实现,内容丰富,干货多多!C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数和字符串是分离的。不符合面向对象程序设计的思想,而且底层空间需要用户自己管理,如果不细心,容易访问越界。所以C++标准库以string类来表示字符串,更加简单,方便。字符串是表示字符序列的对象。标准string类通过类似于标准字节容器的接口提供了对此类对象的支持,但添加了专门设计用于操作单字节字符串的特性。
2024-06-15 22:59:05
912
原创 C++ list链表的使用和简单模拟实现
这篇文章讲述常用容器list的使用和一些重要部分的简单模拟实现,仅仅只是了解一些实现方法。内容丰富,干货多多。list是序列容器,允许在序列内的任何位置进行常量时间的插入和删除操作,以及两个方向的迭代。列表容器被实现为双链表;双链表中每个元素存储在互不相关的几点钟,在节点中通过指针指向其前一个元素和后一个元素。它们与forward_list非常相似:主要区别在于forward_list对象是单链表,因此它们只能向前迭代,让其更简单高效。
2024-06-05 21:51:28
974
3
原创 C++ vector的使用和简单模拟实现(超级详细!!!)
今天将开启对C++STL的学习,STL作为强大的模版库,十分值得我们学习!在此途中,提升自己的C++代码能力。vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。因为vector内部实现没有使用具体类型,而是给出模版,所以实例化一个vector变量时需要给出具体类型。记得包含头文件。
2024-05-29 23:36:11
1146
2
原创 八种排序 (希尔排序 堆排序 快速排序 归并排序 计数排序,配上超详细的图例讲解 C语言版)
本文主要讲解八大排序,直接插入排序,希尔排序,直接选择排序,堆排序,冒泡排序,快速排序,归并排序和计数排序。内容相当丰富,较难的排序算法有详细的画图讲解,话不多说,学起来!学习排序算法是为了锻炼自己的梳理问题的能力,并提升写代码的能力。八大排序其中的希尔排序,快速排序和归并排序是比较复杂,都需要深层次理解其中的思想,并多敲代码。多多重复,百炼成钢!创作不易,希望这篇文章能给你带来启发和帮助,如果喜欢这篇文章,请留下你的三连,你的支持的我最大的动力!!!
2024-05-16 21:56:21
764
2
原创 C++初识内存管理和模版
本文今天要浅浅的讲解C++内存管理和模板,关于C++是如何进行动态管理内存,C++中的模板的作用是什么,类型有哪些。虽然比较粗浅,但这是每个小伙伴学C++的必经之路,一起学起来吧!int main()// new/delete 和 malloc/free最大区别是// new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数free(p1);delete p2;
2024-04-25 20:10:16
935
1
原创 C++类和对象第三弹(运算符重载,赋值运算符重载,取地址操作符重载,日期类的实现)
本文主要内容是关于类中生成的三个默认成员函数,还有日期类的实现。干货满满,一起学起来吧!实现一个日期类,先创建三个文件Date.h,Date.cpp和test.cpp。Date.h文件存放类的声明部分。Date.cpp存放类成员函数的实现部分。test.cpp用于写测试代码通过日期类的实现,对C++中类和对象的了解更加深入,开始上手C++。学习编程语言需要不断的练习,多多重复,百炼成钢!创作不易,希望这篇文章能给你带来启发和帮助,如果喜欢这篇文章,请留下你的三连,你的支持的我最大的动力!!!
2024-04-21 18:30:18
896
原创 C++类和对象第二弹(构造,析构和拷贝构造函数)
本文主要讲解类中构造函数、析构函数和拷贝构造函数。关于这三个类中默认成员函数的知识点很多,有许多代码示例,干货满满!这篇文章对三个默认成员函数进行了详细的解析,看完的小伙伴不要忘记亲自上手写代码,进行练习,多多重复,百炼成钢!创作不易,希望这篇文章能给你带来启发和帮助,如果喜欢这篇文章,请留下你的三连,你的支持的我最大的动力!!!
2024-04-16 20:11:11
777
原创 C++类和对象第一弹
类和对象是C++区分于C语言的开始,由面向过程编程走向面向对象编程,更加符合人们对事物的认知,可以处理更复杂的问题。本篇文章将一步步带你了解类和对象的核心,一起学起来吧!上面的结构体的定义,C++中更多使用class来替代。// 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字ClassName为类的名字{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。
2024-04-10 11:33:01
989
原创 C++入门语法(命名空间&缺省函数&函数重载&引用&内联函数&nullptr)
这一篇文章开始了我与C++这门语言的相遇,我会持续更新有关C++的文章,既是我对学习C++之后的复习与总结,也是一种分享知识的方式。这篇的主要内容围绕的是C++入门语法讲解,许多语法都是本博士C++之父,对C语言的改进。C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想。
2024-04-06 23:08:23
860
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人