- 博客(57)
- 收藏
- 关注
原创 Linux基础开发工具——自动化构建Make/Makefile
本文介绍了自动化构建工具make/Makefile的基本使用方法和原理。Makefile通过定义依赖关系和依赖方法,实现项目的自动化编译。主要内容包括:1) Makefile基础语法,展示如何用gcc编译C文件;2) 添加多组依赖关系和方法,如clean清理操作;3) make命令默认执行Makefile第一个目标及其依赖链;4) 伪目标.PHONY的作用,使命令总能被执行。通过实例演示了依赖关系链的执行过程和栈结构原理。Makefile在大型项目中能显著提高开发效率,合理使用依赖关系和伪目标可优化构建流程
2025-06-15 04:16:51
496
原创 Linux基础开发工具——gcc/g++及初步认识动静态库
本文介绍了Linux下的C/C++编译工具gcc/g++,重点讲解了gcc编译器的使用和工作原理。文章首先回顾了C/C++文件的编译过程,包括预处理、编译、汇编和链接四个阶段,并通过实际代码演示了每个阶段的中间文件生成过程。在预处理阶段,编译器会进行头文件展开、宏替换、去除注释和条件编译等操作;编译阶段将预处理后的文件转换为汇编代码;汇编阶段则生成机器可读的二进制文件;最后通过链接阶段生成可执行程序。 文章还补充了条件编译的实用价值,说明其可用于软件版本控制、代码动态裁剪和多平台开发等场景。此外,介绍了gc
2025-06-12 03:33:37
592
1
原创 Linux基础开发工具——vim工具
Vim是一款功能强大的多模式文本编辑器,是vi编辑器的升级版。相较于GUI文本编辑器,vim需要通过命令进行文本操作,包含三种基础模式:命令模式(默认)、插入模式(编辑文本)和底行模式(保存退出)。模式间转换需通过命令或Esc键实现。命令模式下提供多种快捷操作,如快速移动光标(gg到文件首行、G到末行、nG到指定行)、行内定位($到行尾、^到行首)等。学习vim有助于提高文本编辑效率,建议从基础命令入手逐步掌握。注意使用普通账号操作vim,避免直接使用root权限。
2025-06-09 21:03:31
1430
原创 Linux基础开发工具——yum工具
而且开源的项目是可以让更多优秀的工程师参与的,能参与开发的人必定都是有很高水平的,所以他们基本都是不为利益所驱动的。里面聚集了无数多的优秀的开发者,他们会集思广益,把开发好的工具上线到这个社区当中,然后yum工具接收到下载安装请求的时候,就会去这个链接去查询,查询到了就进行下载,反之报错。镜像源的本质就是,由于外网的东西我们没有办法直接访问,但是总有一些在外国的开发者,他们可以将外网上的一些内容经过镜像操作,复制出一样的东西在国内的路径上,这样国内路径使用的时候只需要使用镜像源就可以了。
2025-06-04 20:56:16
852
2
原创 Linux——初步认识Shell、深刻理解Linux权限
本文介绍了Linux系统中的Shell概念及权限管理。Shell作为用户与内核间的中介,负责指令传递与结果反馈,既简化操作又保护内核安全。文章详细讲解了用户切换指令(su/su -)的差异,以及普通用户通过sudo实现短暂提权的方法。在权限方面,重点阐述了root用户与普通用户的权限区别,并通过实例展示了权限不足时的解决方案。最后指出sudo提权机制基于系统白名单设计,无需root密码即可实现安全提权。
2025-06-03 22:43:06
903
1
原创 Practice 2025.6.1—— 二叉树进阶面试题(2)
本文讲解了二叉树前序遍历和中序遍历的非递归实现方法。重点分析了使用栈结构模拟递归过程的核心思路。 对于前序遍历,提出两种方法: 边入栈边访问,通过循环回退找到右子树 先访问根节点后出栈,再依次入栈右、左子节点 对于中序遍历: 必须先完成左子树访问才能处理根节点,访问时机在回退阶段 同样需要通过栈来回退并寻找右子树 两种遍历都充分利用了栈的后进先出特性,通过不同的入栈顺序和访问时机实现了遍历顺序的精确控制。文章通过具体代码示例和图示详细说明了实现逻辑和注意事项。
2025-06-02 00:06:14
923
原创 Linux入门——入门常用基础指令(3)
Linux常用基础指令(3):grep与压缩解压操作 摘要: 本文介绍了Linux中两个实用工具:grep文本过滤器和zip/unzip压缩解压命令。grep指令用于在文件中搜索特定字符串,支持-n显示行号、-i忽略大小写、-v反向选择等选项,可高效处理大文件搜索。压缩解压部分详解了zip/unzip命令的使用方法,包括压缩文件/目录(zip)和解压到指定路径(unzip -d),并解释了打包压缩的必要性。文章通过实例演示了如何生成测试文件、使用grep过滤内容,以及处理压缩时的文件名冲突问题,为Linux
2025-05-30 21:31:11
774
原创 Practice 2025.5.29 —— 二叉树进阶面试题(1)
本文摘要: 《部分二叉树进阶面试题(1)》探讨了LeetCode中两道具有挑战性的二叉树题目。606题要求将二叉树转换为特定格式的字符串,通过分析括号插入规则,提出递归遍历控制括号插入的解决方案。236题寻找二叉树的最近公共祖先,分析了传统思路的局限性,提出利用节点位置特性的高效解法。两题均强调递归思维的应用,并针对C++特性优化了实现方案,避免了C语言造轮子的复杂性。文章通过实例分析和代码展示,帮助读者掌握处理复杂二叉树问题的核心思路。
2025-05-29 20:54:25
848
2
原创 Linux入门——入门常用基础指令(2)
本文介绍了Linux中几个常用基础指令的使用方法。主要内容包括:echo和printf指令的区别与使用方式,其中echo默认带换行而printf不带;mv指令的两种功能(移动文件和重命名文件),并详细分析了不同参数组合下的执行结果;最后阐述了"Linux万物皆文件"的概念,说明终端输入输出本质上都是文件操作。文章通过具体命令示例和操作演示,帮助读者理解这些基础指令的实际应用场景和工作原理。
2025-05-28 18:48:26
714
1
原创 c++进阶——智能指针
本文介绍了C++智能指针的原理和应用。针对普通指针在异常处理时可能造成的内存泄漏问题,提出了RAII(资源获取即初始化)思想,通过类对象的生命周期自动管理资源释放。文章展示了自定义智能指针的实现示例,并指出其存在的析构匹配问题。同时分析了C++标准库提供的智能指针类型,特别指出c++98的auto_ptr存在被拷贝对象悬空的设计缺陷。智能指针通过自动化资源管理,有效解决了传统指针在异常情况下的内存泄漏问题,是C++中重要的资源管理工具。
2025-05-26 19:07:22
892
1
原创 c++进阶——异常
本文介绍了C++异常处理机制及其与C语言错误处理的区别。异常机制将错误检测与处理分离,通过throw抛出异常并由catch捕获。异常会沿着调用链寻找最近的匹配catch块,沿途对象会被自动销毁。文章重点讲解了异常捕获规则、栈展开过程及类型匹配原则,并指出通过继承体系可以实现更灵活的异常处理。相比C语言的错误码方式,C++异常机制能更有效地传递错误信息并保证程序稳定性。
2025-05-24 11:47:47
576
3
原创 c++11特性——lambda对象、包装器
本文介绍了C++11中引入的lambda表达式和包装器,重点探讨了lambda表达式的语法、使用及其捕捉参数列表的规则。lambda表达式本质上是一个匿名函数对象,可以在函数内部定义,并且可以通过捕捉参数列表访问外部变量。文章详细讲解了lambda表达式的语法结构,包括捕捉列表、参数列表和返回值的省略规则,并通过代码示例展示了lambda对象的使用方法。此外,文章还讨论了lambda对象在使用过程中可能遇到的问题,如无法使用外部非全局变量和递归调用等,并介绍了如何通过捕捉参数列表解决这些问题。最后,文章通过
2025-05-22 18:43:39
1319
1
原创 c++11特性——新的类功能、STL的变化
本文主要探讨了C++11中引入的移动构造函数和移动赋值运算符的行为及其自动生成规则。C++11通过引入右值引用和移动语义,旨在减少不必要的拷贝操作,提升程序效率。文章详细解释了移动构造和移动赋值的自动生成条件:如果类未实现析构函数、拷贝构造函数或拷贝赋值运算符中的任意一个,编译器会自动生成默认的移动构造和移动赋值函数。此外,如果类中实现了移动构造或移动赋值,编译器将不会自动生成拷贝构造和拷贝赋值函数。文章通过代码示例验证了这些规则,展示了默认移动构造和移动赋值的行为,特别是在处理内置类型和自定义类型时的差异
2025-05-22 01:45:54
1005
1
原创 c++11特性——可变参数模板及emplace系列接口
可变参数模板是C++11引入的重要特性,允许函数或类模板接受任意数量和类型的参数。通过参数包(模板参数包和函数参数包),开发者可以编写更通用的代码。基本语法使用省略号...表示参数包,如template <class ...Args> void Func(Args... args) {}。sizeof...运算符用于计算参数包中的参数数量。可变参数模板的底层实现可以理解为编译器根据传入的参数自动生成对应的函数模板,并推导参数类型。包扩展是使用参数包中参数的关键技术,虽然直接通过索引访问参数包中的
2025-05-21 21:16:20
741
1
原创 c++11特性——列表初始化、右值引用和移动语义
C++11引入了多项重要特性,其中列表初始化和右值引用是核心内容。列表初始化通过{}实现了对所有数据类型的统一初始化方式,包括内置类型和自定义类型,简化了代码并提高了灵活性。C++11还引入了std::initializer_list类,支持通过迭代器遍历初始化列表。右值引用是C++11的另一大特性,区分了左值和右值,左值是可以取地址的持久对象,右值则是临时对象或字面量,不能取地址。右值引用通过移动语义优化了资源管理,减少了不必要的拷贝操作,提升了性能。这些特性共同推动了C++语言的现代化发展。
2025-05-19 12:41:54
737
3
原创 c++进阶——位图、布隆过滤器
本文介绍了哈希表的进阶使用,重点探讨了位图(std::bitset)的概念与实现。位图通过将数据映射到比特位上,极大减少了内存占用,适用于处理大规模数据。文章通过一个40亿无符号整型的例子,展示了位图如何将内存需求从15GB降低到0.47GB。接着,详细讲解了位图的实现思路,包括如何通过除法和取模操作定位比特位,并提供了C++代码实现,涵盖构造函数、set、reset和test等核心接口。通过这些接口,位图能够高效地记录和查询数据的存在状态。
2025-05-18 15:22:00
882
5
原创 c++STL——哈希表封装:实现高效unordered_map与unordered_set
本文介绍了如何使用哈希表封装C++中的unordered_map和unordered_set容器。首先,文章回顾了哈希表的实现原理,并指出C++标准库中的这两个容器底层也是基于哈希桶实现的。接着,文章详细讨论了如何改进哈希表的底层框架,特别是通过泛化数据类型和使用模板参数KeyOfT来提取关键字,从而支持unordered_map和unordered_set的封装。文章还探讨了哈希表迭代器的实现,指出哈希桶的迭代器是单向的,因为哈希桶底层使用的是单链表。迭代器的实现需要包含指向节点的指针和指向哈希表的指
2025-05-14 22:13:22
753
1
原创 c++进阶——哈希表的实现
本文介绍了哈希表的基本概念及其实现方式。哈希表通过哈希函数将关键字映射到存储位置,以实现快速查找和插入。C++ STL库中的unordered_set和unordered_map基于哈希表实现,与基于红黑树的set和map相比,哈希表在搜索和插入效率上更高,但无序。哈希表的关键在于将关键字转化为整型并通过哈希函数映射到表中,这可能导致哈希冲突。解决冲突的常用方法有开放定址法和链地址法。开放定址法通过线性探测等方式解决冲突,而链地址法则通过链表或红黑树处理冲突。哈希函数的选取对哈希表的性能至关重要,常见的哈希
2025-05-13 23:18:04
918
2
原创 c++STL——set和map的使用
这里的T其实就是key,这里写的确实会令人误解。因为本质上二叉树对应的这些关联式容器都是以key作为关键字来进行查找、删除等操作的。这里我们跟着看一下文档就好了。如果到后期自行实现了改过来就好。这个Compare模板参数类型给了一个less< T >,这是干什么用的呢?这个是用来规定搜索树的规则的。我们默认的规则是对于一个搜索树,右子树的key应该比根节点的大,左子树的key比根节点要小。默认传入的是小于的比较逻辑。但是如果想要反过来,需要传入大于的比较逻辑。比较逻辑本质是仿函数。
2025-05-04 15:53:27
662
3
原创 c++STL——stack、queue、priority_queue的模拟实现
c++STL——stack、queue、priority_queue的模拟实现
2025-04-22 13:38:53
1166
4
原创 Linux入门——入门常用基础指令(1)
Linux是一个开源的操作系统,市面上有很多种版本。我们可以根据自己的需求进行选择。当然在学习的初期我是选择了Centos 7.6进行学习。我们大部分人的电脑装的都是Windows系统,Linux是另外一个操作系统。我们可以选择将系统重装为Linux,但是这个代价太大了。还可以选择使用虚拟机,但是当前知识储备有限,使用虚拟机难度较大。还可以选择使用云服务器,并且使用Xshell软件进行登录云服务器。这个代价并不是很大,所以我选择了这个。需要注意的是:XShell 下的复制粘贴。
2025-04-21 19:39:56
970
1
原创 c++STL——vector的使用和模拟实现
对于STL中各类容器的学习其实是很相似的,因为c++的封装性。虽然是不同的容器,但是c++标准库在实现的时候是对各类的容易实现了一些一样的接口,我们只需要关注其封装的接口的使用即可。所以各类容器的操作是很类似的。而对于vector其实是一个类模板,其底层的实现本质还是顺序表。只不过与string的底层实现是略有区别。更大的不同是vector中存储的元素不仅仅是一些内置类型,也可以是类,如string,甚至是vector类。
2025-04-17 21:38:42
665
原创 Leetcode——137 260找出只出现一次的数
算出数组中所有数字第i位1的出现次数(Onenum),如果是3的倍数,那么ans的这一位就是0,正好是Onenum取余3的结果。如果按照刚刚的思想来分类也是不太可能的,因为分类的情况下,可能出现一次的数据和出现三次的数据会被分到一块,这是很难办的。以此类推,我们很容易得知:对于整个数组来说,第i位出现的0和1的次数一定是一个为3的倍数,一个比3的整数倍还多一个。这题对于引入的例子也是修改了一点:只有一个数字出现一次,其他的会出现3次,找出只出现一次的数据,并且要求线性时间复杂度,常数级别空间复杂度。
2025-04-14 23:36:42
821
原创 Leetcode12 13——罗马数字与整数之间的转换
2.如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (V) 减 1 (I): IV ,9 是 10 (X) 减 1 (I):IX。仅使用以下减法形式:4 (IV),9 (IX),40 (XL),90 (XC),400 (CD) 和 900 (CM)。你不能多次附加 5 (V),50 (L) 或 500 (D)。1.如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
2025-04-10 15:28:39
924
原创 Leetcode 69——不使用sqrt函数情况下求平方根整数部分(暴力求解法和二分查找法)
时间复杂度为O(LogX),其实很好理解,如果x比较大,那么跑的次数会非常接近刚刚的那个数46431,其实也就是x的平方根整数部分,那效率还是比较低的。就比如我要找10的平方根,从10开始找才是更快的,从50000开始为上界那就不太行了。所有类型的数据最大的平方根也不超过50000,所以我们做一个规定,如果传入的x小于等于50000,就让上界为x,反之为50000。就比如找90000的平方根,暴力查找要找300次,而二分查找只需要14次(大致计算),这个效率差是非常大的。很明显,这个思路是可行的。
2025-04-10 13:25:25
834
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人