- 博客(36)
- 收藏
- 关注
原创 Linux系统程序——进度条
虽然我们在日常打字时经常把“回车”和“换行”混为一谈(通常按一下Enter键就同时完成了这两个动作),但在计算机底层,它们其实是两个完全不同的概念。这是一个独立测试函数,不需要外部传参,自己控制从 0 到 100 的循环,并利用旋转字符集模拟纯加载动画。如果只执行换行,光标会来到下一行,但依然停留在当前所在的列(通常是行尾)。(换行符),触发了“刷新机制”,把缓冲区里的数据立刻推到了显示器上,并且执行了回车换行。),或者不把它的桶装满(缓冲区满),或者不拿枪指着它(程序结束),它就不愿意动。
2026-10-06 17:38:48
205
原创 make / Makefile
文件一多,命令又长又重复,还容易漏掉某个文件、忘记重新编译。,说明依赖更新了,目标过期,需要重新执行命令;:目标依赖哪些文件?要生成目标,先保证依赖都就绪。的文件,make 会以为目标已存在而不执行命令。6.3 伪目标 clean,清理编译产物。:它不是磁盘上的文件,只是一个动作。,但手敲时往往全量重编,浪费时间。就是解决这个问题的工具:它是一个。有些"目标"并不是真的文件,比如。make 会自动在当前目录找。加上就可以避免这个 bug。的脚本,按照里面写的规则,:只做必要的重编译,效率高。
2026-09-30 14:13:31
236
原创 编译器gcc
在写 C 程序时,我们经常使用printf函数。但仔细回想,我们的代码里并没有定义printf,包含的stdio.h里也只有它的声明,没有实现。那么printf到底在哪里实现的呢?答案是:系统将这些常用函数的实现打包放进了名为libc.so.6(C标准库)的文件中。当我们编译程序时,GCC 会到系统默认的搜索路径(如/usr/lib)下查找并链接这些库。库的本质:就是一组预先编译好的、可复用的二进制代码(目标文件.o的集合)。根据链接方式的不同,分为静态库和动态库。平台静态库后缀动态库后缀。
2026-09-30 14:13:21
205
原创 编辑器Vim
在 Linux 开发工具链中,我们常常会产生一个误区:认为 IDE(集成开发环境)就是一切。但“Linux 下的开发工具是独立的!” IDE 很多时候仅仅是我们用来写代码的壳,而真正的编译(gcc/g++)、调试(gdb/cgdb)、构建(makefile/cmake)都是独立的工具。而 Vim,作为 Linux 下最原生的文本编辑器,正是连接这一切的枢纽。很多人对 Vim 望而生畏,觉得它的操作反人类。但今天,我们将结合操作,彻底扒开 Vim 的底层逻辑,带你领略“键盘即鼠标”的极致效率。Vim 的三大核
2026-09-27 18:05:30
539
原创 yum工具
在 Linux 下安装软件,传统方式是下载源代码编译,这非常繁琐且容易出错。软件包管理器就像是手机上的“应用商店”。将预先编译好的软件打包放在服务器上,通过包管理器方便获取、安装及管理。解决依赖关系、自动下载、安装、卸载。主流工具::使用yum:使用apt.so。
2026-09-27 18:05:20
148
原创 Linux权限
技术定义:Shell 是一个命令行解释器(Command Interpreter)。核心功能将用户的命令翻译给核心(Kernel)处理。将核心的处理结果翻译给用户。
2026-09-25 13:32:54
240
原创 Linux基本指令(三)
alias是命令关键字。hello是你起的别名(名字随便起,比如hellollmycmd-a:显示所有文件(包括隐藏文件)。-l:长格式显示。-n:显示数字 UID 和 GID(而不是用户名)。which第一行证明别名已成功生效。第二行,别名背后实际调用的二进制命令路径。这说明系统知道hello是一个别名,指向ls命令。hello。
2026-09-25 13:32:41
282
原创 Linux基本指令(二)
(manual) 就是 Linux 自带的说明书。遇到不会的命令,第一反应就是 。核心理论补充:man 手册的 9 个章节man 手册并非把所有内容混在一起,而是分成了 9 个章节。同一个名字(比如 )可能既是命令也是 C 函数,系统需要靠章节号来区分。理解这个章节划分非常重要:如何指定章节:。例如 查看 passwd 文件的格式, 查看 passwd 命令的用法。基本操作:翻页:空格键(向下)、(向上)搜索:输入 回车(按 找下一个)退出:按 用来查看第 3 章节printf手册,提示
2026-09-22 01:15:06
121
原创 Linux基本指令(一)
为了演示各种删除场景(删文件、删空目录、删非空目录、强制删除等),我们需要搭建一个包含多级目录和文件的测试环境。虽然文件内容没变,但文件的 Access 时间属性被修改了,这个“修改属性”的动作本身,就会更新 Change 时间。最后一次被改变的时间(例如:权限、所有者、链接数,或者 atime/mtime 被修改时,ctime 也会跟着变)。是 list 的缩写,用于列出目录中的内容(文件和子目录)。这能让你一眼看出哪些是目录,哪些是文件。:如果指定的文件不存在,则创建一个大小为 0 的空文件。
2026-09-22 01:14:41
464
原创 C++异常
程序一部分代码只负责检测是否发生错误,当问题出现时,把处理错误的任务传递给程序另一部分。C++ 的异常处理机制,允许程序中相互独立的模块,在程序运行时就出现的错误进行通信并完成处理。回到 main,main 存在匹配 catch,在 main 中捕获异常,栈展开停止。内存、锁、文件句柄),释放资源代码写在异常代码后面,一旦抛异常,释放代码执行不到 →。→ func3 → func2 → func1,异常在 func1 抛出。经常抛出局部对象,当函数提前退出,局部对象马上销毁,如果不拷贝一份,
2026-09-12 15:53:44
222
原创 智能指针的使用及其原理
unique_ptr和shared_ptrunique_ptr:是在类模板参数中支持的。shared_ptr:是在构造函数参数中支持的。public:// unique_ptr 需要将删除器类型作为模板参数// shared_ptr 只需要在构造函数中传入删除器对象// 函数指针做删除器// unique_ptr 传入函数指针类型// shared_ptr 直接传函数指针// Lambda 表达式做删除器。
2026-09-12 15:53:00
138
原创 C++11特性(二)
可变参数模板是 C++11 引入的编译期特性,通过参数包接收任意数量和类型的参数,并在编译期展开为多个具体实例。其核心价值在于:一是配合包扩展和递归调用实现类型安全的变长参数处理;二是结合万能引用与实现完美转发,保持参数的左值/右值属性与 const 修饰不变;三是支撑emplace系列接口在容器中就地构造元素,避免不必要的拷贝和移动,从而提升性能。lambda 表达式本质是定义在函数内部的匿名函数对象,通过捕获列表(值捕获、引用捕获、隐式捕获、混合捕获)灵活访问外层作用域变量。
2026-09-05 22:03:16
187
原创 C++11特性(一)
一、基础定位C++11 是继 C++98 后,曾用代号C++0x,原计划 2010 年前发布,最终 ISO 在 2011 年 8 月 12 日正式采纳,标准号 ISO/IEC 14882:2011。C++03 到 C++11 间隔 8 年,是 C++ 史上最长版本空档;自此 C++ 固定为二、核心新增特(PPT 清单)语言层面移动语义(右值引用、移动构造 / 移动赋值,和你自定义 string 代码对应)统一初始化、autodecltype类型推导Lambda 匿名函数、constexpr。
2026-09-05 22:03:13
439
原创 哈希表的实现
哈希(Hash),又称散列,核心是通过哈希函数,将任意类型的关键字(Key),映射为固定范围的整数(存储地址),实现快速存取。1. 核心定义:用哈希函数将关键字(如int、string)转化为存储地址,无需遍历,直接定位,这是哈希表高效的关键。空间换时间——牺牲部分存储空间(预留哈希桶、空闲位置),换取查找、插入、删除操作均为O(1)的高效性能。3. 关键细节:同一关键字经同一哈希函数,必映射到同一地址;不同关键字可能映射到同一地址(哈希冲突),需通过对应方式处理。给每个 Key 计算一个下标。
2026-05-24 20:03:08
328
原创 C++——红黑树
红黑树是一种二叉搜索树,其中每个节点都增加了一个额外的存储位,用于标识节点的颜色,可以是红色或黑色。通过对从根节点到叶子节点的每一条路径上的节点颜色进行特定约束,红黑树保证了没有一条路径的长度会超过其他路径的两倍,从而保持了树的近似平衡。
2026-03-22 01:39:07
431
原创 C++——AVL树实现
AVL(Adelson-Velsky and Landis)树是一种自平衡的二叉搜索树(Binary Search Tree,BST)。它的特点是通过对树的平衡因子(Balance Factor)进行管理,使得树在进行插入和删除操作后始终保持平衡,从而保证了查找、插入和删除的时间复杂度为 O(logn)O(logn)。
2025-11-09 23:13:34
839
原创 C++——二叉搜索树
时间复杂度(Time Complexity)空间复杂度(Space Complexity)二叉搜索树的空间复杂度主要取决于树的高度。对于n个节点的树,空间复杂度为O(n),因为每个节点都需要存储数据和指向左右子树的指针。
2025-11-09 23:13:13
738
原创 C++—— 多态
1.继承关系多态是面向对象编程的一部分,它依赖于类之间的继承关系。必须有一个基类和一个或多个派生类,派生类必须重写(重载)基类的虚函数,才会发生多态。2.虚函数(Virtual Functions)多态的核心是虚函数。基类的函数需要声明为虚函数(virtual),这样派生类才能重写(override)该函数。在调用该函数时,通过基类指针或引用来调用,并且要使用动态绑定,确保运行时正确调用派生类的函数,而不是基类的函数。public:virtual void sound() { // 基类中的虚函数。
2025-08-21 12:03:48
1183
原创 C++——继承
C++中的继承是面向对象编程(OOP)中的一个重要概念,它允许你创建一个类(称为子类或派生类),这个类可以继承另一个类(称为基类或父类)的属性和方法。
2025-08-21 12:03:39
953
原创 C++——类和对象(三)
初始化列表总结: 无论是否显示写初始化列表,每个构造函数都有初始化列表;无论是否在初始化列表显示初始化成员变量,每个成员变量都要走初始化列表初始化;:成员变量的初始化顺序是按照它们在类定义中的声明顺序,而不是在初始化列表中的顺序。例如,在上面的代码中,成员变量a会先于b和c初始化,尽管它们在初始化列表中的顺序是不同的。:构造函数中的初始化列表是在构造函数体执行之前执行的。它们用于初始化成员变量,并且比构造函数体内的任何代码执行得更早。
2025-03-15 02:00:52
1101
原创 C++——类和对象(二)
ClassName是类的名称。是另一个同类型对象的引用,通常使用const来避免修改源对象。注意:拷贝构造函数的参数是引用类型,并且通常是const引用,以避免不必要的对象复制操作。在某些情况下,默认的浅拷贝可能不足以满足需求。特别是当类中包含指向动态内存的指针时(例如new或malloc分配的内存),需要编写自定义的拷贝构造函数来进行深拷贝。深拷贝是指复制指针所指向的数据,而不是简单地复制指针本身。public:// 构造函数// 动态分配内存。
2025-03-10 00:58:37
737
原创 C++——类和对象(一)
在C++中,类(class)是封装数据和操作这些数据的函数的构造。类的定义包含成员变量和成员函数。// 访问修饰符public:// 公有成员// 成员变量void memberFunction() { // 成员函数// 函数体private:// 私有成员(可选)protected:// 受保护成员(可选)成员变量:类中用于存储数据的变量,数据类型由DataType表示。成员函数:类中的函数,可以操作类的成员变量。public:// 公有成员变量int year;
2025-03-06 01:58:48
1015
原创 C++——引用
引用不是新定义⼀个变量,而是给已存在变量取了⼀个别名,编译器不会为引用变量开辟内存空间。引用是一个已经存在的变量的别名,就像一个人有一个小名或外号一般,它并不占用内存空间,且在声明时必须初始化。一旦引用与某个变量绑定后,就不能再绑定到其他变量。虽然C++ 中引用和指针都可以用来间接访问变量,但使用主要是为了替代以实现更简洁、更安全的代码。下面给出一个示例:在外面学习到这里时,相信有许多人会对双指针的运用与理解感到头痛,但是使用引用的话就会很好的解决这一问题。
2025-03-03 21:51:49
1092
原创 数据结构——队列
数组实现队列适用于队列大小已知或变化不大的情况,尤其在内存空间有限的情况下,简单且高效。但如果队列频繁增长,或者存在大量空间浪费,则不适合。常见操作的时间复杂度为O(1),但在扩容时会有O(n)的时间复杂度,因为需要重新分配和复制数组。链表实现队列适用于队列大小动态变化的场景,链表不需要预先分配大小,不会发生空间浪费,插入和删除操作高效。但链表实现需要更多的内存用于存储指针,操作也相对复杂。常见操作的时间复杂度都是O(1),不涉及扩容问题,因此性能在这些操作上更加稳定。综上 使用链表来实现队列。
2025-03-02 01:43:52
1336
原创 C++——命名空间
• namespace本质是定义出⼀个域,这个域跟全局域各自独立,不同的域可以定义同名变量。• C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量生命周期。• namespace只能定义在全局,当然他还可以嵌套定义。• 项目⼯程中多文件中定义的同名namespace会认为是⼀个namespace,不会冲突。
2025-02-28 23:26:11
1092
原创 数据结构——栈
栈(Stack)是一种数据结构,它遵循“后进先出”(LIFO, Last In First Out)的原则。也就是说,最后插入栈中的元素是第一个被移除的元素。
2025-02-26 02:06:35
678
原创 数据结构——双向链表
(存储元素)、(prev)和(next)。与单向链表不同,双向链表的节点不仅可以通过下一个节点(next)进行访问,还可以通过前一个节点(prev)进行访问,因此它支持从两个方向进行遍历。这种结构使得在任意节点的插入、删除以及遍历操作都非常高效。希望这个简要的图示和说明可以帮助你理解双向链表的基本概念!
2025-02-03 15:49:13
1194
原创 数据结构——单链表
使用二级指针的目的是为了在函数内部能够修改头指针(即链表的入口),这样无论链表是否为空,都能正确地处理头指针。如果没有二级指针(即),则无法修改外部传入的头指针。
2025-02-01 11:37:07
1175
原创 数据结构---顺序表
线性表 (linear list) 是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串⋯线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。线性表可以分为两种主要的存储结构:顺序线性表:将线性表中的元素按顺序存储在一块连续的存储空间中。常见的实现方式是使用数组。顺序线性表的优点是能快速访问任意位置的元素,但在插入和删除元素时需要移动较多数据,效率较
2024-12-05 20:44:53
1169
原创 数据结构——算法复杂度
数据结构是计算机科学中的一个重要概念,它是指在计算机中组织和存储数据的一种方式,使得数据的访问和修改变得更加高效和方便。不同的数据结构有助于以不同的方式处理数据,具体的选择往往取决于实际应用的需要和所需操作的类型。常见的数据结构包括:线性数据结构:非线性数据结构:哈希表:一种通过哈希函数将键映射到值的结构,能够实现快速的数据存取。集合:一种无序且唯一的数据集合,可以用于快速查找和操作。每种数据结构都有其独特的特点和适用场景,选择合适的数据结构可以提高程序的性能和可读性。在算法设计中,数据结构与算法通常是紧密
2024-12-01 17:21:41
1086
原创 C语言-分支循环语句 (下)
上文《C语言-分支循环语句 (上)》仔细介绍了分支语句,那么本文将讲解其中重点介绍循环结构,包括for 、 while 、 do while等语句。希望带给你一点帮助。在许多实际问题中有许多重复性的操作,当我们想要使用C语言来解决问题时,你会发现如果使用其他语句的去实现的话,过程会非常繁琐并且占用许多内存,这时就需要循环语句了,循环语句可以在程序中反复执行一个功能,直至达到你想要的结果,从而大大简化代码体量,提高代码质量。下面为你介绍循环语句。
2024-10-20 00:56:09
1286
原创 C语言-分支循环语句 (上)
C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实 现这三种结构的,其实我们如果仔细分析,我们日常所见的事情都可以拆分为这三种结构或者这三种 结构的组合。实现分支结构可以使用 if 、 switch ,实现循环结构使用for 、 while 、 do while。在计算机编程中,分支结构(Branching Structure)是一种基本的控制结构,用于根据条件的不同采取不同的操作或执行不同的代码块。
2024-10-17 22:50:04
1237
原创 关于使用Tortoisegit时出现User name and email must be set before commit.和Incorrect username off password的解决
关于使用Tortoisegit时出现User name and email must be set before commit.和Incorrect username off password的解决
2024-10-15 22:44:06
2645
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1