自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 操作系统入门(一):从冯诺依曼到进程概念

程序(Program):它是一个存储在磁盘中的二进制文件,本质上是一组静态的指令和数据集合。就像电影的剧本一样,它包含着预先编排好的内容进程(Process):进程是指程序被加载并由 CPU 执行时的运行状态。它是动态的,会经历创建、运行、挂起和终止等生命周期阶段。可以将其类比为正在根据剧本放映的电影进程 = 内核数据结构 + 自己的程序代码和数据1. 代码和数据当我们运行 ./a.out 时,操作系统首先会将磁盘上的二进制指令(代码)和初始变量(数据)拷贝到内存中代码:定义了进程的执行逻辑数据。

2026-04-07 23:37:15 115

原创 Linux基础开发工具(三):Git 版本控制与 GDB 调试入门

在没有版本控制器的年代,程序员的文件夹通常长这样:project_v2_修复了Bug.cproject_v3_最终版.cproject_v3_最终版_打死不改版.c这种手动重命名的方式极易出错,且无法协作。版本控制器是一种记录一个或若干文件内容状态,以便将来查阅特定版本修订情况的系统它的核心价值在于:回溯:随时回到过去的任何版本协作:多人同时修改同一份代码,并能优雅地合并备份:不仅仅是代码,连同修改历史一起备份基本概念Git 的核心在于理解文件的三个区域。

2026-04-04 22:52:13 375

原创 Linux基础开发工具(二):GCC 与 Makefile 详解

1. 定义变量CC=gccCFLAGS=-Wall # 编译选项:开启警告SRC=$(wildcard *.c) # 自动扫描当前目录下所有 .c 文件OBJ=$(SRC:.c=.o) # 将 SRC 的所有同名.c 替换为 .o# 2. 最终目标# 3. 模式规则:所有的 .o 都依赖于同名的 .c%.o: %.c# 4. 伪目标clean:install:综上所述,从源代码到可执行程序的过程,本质上是由编译器完成的一系列转换:预处理、编译、汇编与链接共同构建了程序的生成路径;

2026-04-03 16:54:12 403

原创 Linux基础开发工具(一):软件管理与 Vim 编辑器入门

是由 Bram Moolenaar 在 1991 年基于早期的 vi 编辑器开发的。作为 Unix / Linux 世界最古老、最强大的文本编辑器之一,它有着极高的学习曲线和无上限操作效率为什么 vim 这么重要全平台通用性:无论是远程登录一台云服务器,还是在嵌入式路由器中修改配置,vim 几乎是所有 Linux 发行版默认内置的编辑器。当你面对一个没有图形界面的黑框框时,vim 往往成为唯一的文本编辑选择极致的键盘操作:vim 的设计初衷是让你的双手永远不需要离开主键盘区去摸鼠标。

2026-04-02 17:06:48 511

原创 Linux入门(三):文件权限机制详解

综上所述,Linux 的权限机制本质上是围绕用户,资源与操作构建的一套访问控制体系。通过对用户划分并结合读、写、执行三类基本权限,Linux 在多用户环境下实现了对资源的精细化管理在此基础上,诸如 chmod、chown、umask 等工具提供了灵活的权限控制手段,使权限既可以被明确设定,也可以通过规则自动生成;而目录权限与粘滞位等机制,则进一步体现了 Linux 在实际使用场景中的设计考量从本质上看,权限不仅仅是能否访问的判断,更是一种对系统行为边界的约束。

2026-04-01 16:33:52 316

原创 Linux入门(二):常用基本命令详解

Linux 的磁盘文件被组织成一棵倒挂的树根目录(/):它是整棵树的起点节点与叶子:目录是路径上的节点,而普通文件则是这棵树的叶子唯一性:在树状结构中,除了根目录外,任何一个节点都有且仅有一个父节点。这意味着从根目录出发到任何一个文件的路径都是唯一的绝对路径和相对路径起点特点使用场景绝对路径根目录具有唯一性,不随当前位置改变配置文件、系统脚本相对路径当前目录灵活快捷,依赖当前所处的位置命令行日常操作绝对路径就像是快递单上的地址:中国XX市XX区XX路。无论你在哪,这个地址永远有效相对路径。

2026-03-31 18:06:30 352

原创 Linux入门(一):起源、生态与基础使用

Linux 是自由软件和开源软件发展中最成功的典范。在GNU GPL(通用公共许可证)使用自由:无论商业还是个人,都可以无限制地运行程序研究自由:你可以阅读每一行底层源代码,理解系统是如何工作的修改自由:你可以自由定制所需功能,这在闭源的 Windows,macOS 中是绝对禁止的分发自由:你可以自由地传播原始版本或你修改后的衍生版本理查德·斯托曼撰写的GPL 协议是 Linux 能够长盛不衰的根本保障。任何基于 GPL 软件开发的衍生产品,在发布时必须同样采用 GPL 许可证,并强制公开源代码。

2026-03-30 17:57:12 546

原创 C++智能指针:从 RAII 到 shared_ptr 源码实现

int _data;// 形成循环引用// 函数结束前,n1 和 n2 的引用计数均为 2当函数结束,局部变量 n1 和 n2 析构后,堆上的两个节点的引用计数减到了 1。右边节点(n2)何时释放?它由左边节点中的成员 _next 管着,只有当 _next 析构时,右边节点才会释放_next 何时析构?它是左边节点的成员,只有当左边节点释放时,它的成员 _next 才会析构左边节点(n1)何时释放?它由右边节点中的成员 _prev 管着,只有当 _prev 析构时,左边节点才会释放。

2026-03-29 23:27:08 577

原创 C++异常机制详解:原理、使用与实践

在公司项目中,通常会定义一套属于自己的异常体系,但最好的做法是继承标准库,这样我们的异常就能融入整个生态系统public:// 1. 构造时传入错误信息// 2. 重写 what()private:当你在顶层捕获时,只需要,就能利用多态打印出无论是系统级(如bad_alloc)还是业务级(如)的所有错误描述。

2026-03-28 16:38:35 391

原创 C++ 新特性(下):可变参数模板与 STL 扩展机制

总结来看,C++11 的可变参数模板与 STL 扩展机制,本质上是一场围绕“解耦”与“效率”的革新。可变参数模板打破了形参个数的限制,完美转发保证了参数属性的正确传递,而 emplace 则通过就地构造消除了不必要的拷贝开销。与此同时,std::function 与 std::bind 统一了可调用对象的抽象,使逻辑的组织更加灵活从底层语法层面的参数包机制,到高层应用中的复杂表达式构建,这一系列特性共同构成了现代 C++ 泛型编程的重要基石。

2026-03-26 22:40:40 491

原创 C++11新特性(中):右值引用与移动语义

C++11 引入的右值引用与移动语义,为语言赋予了 "所有权" 和 "效率" 的特质。值类别: 左值是持久的 “房子”,右值是临时的 “租客”。理解 prvalue 和 xvalue 的区别,是看懂编译器如何进行拷贝消除优化(RVO/NRVO)的前提移动语义: 移动构造和移动赋值通过直接转移指针所有权而非复制数据,显著提升了性能。需要注意的是:必须添加 noexcept 声明,否则等容器将无法安全调用这些操作转发机制。

2026-03-25 22:34:28 384

原创 C++11新特性(上):从语言演进到语法增强

C++11 的出现并非简单的版本迭代,而是一场旨在降低编程门槛与提升运行安全的工业化革命统一初始化与 initializer_list:终结了初始化语法的混乱局面,让容器也能像原生数组一样优雅地获取初值,并在编译期通过禁止窄化转换守住了数据安全的第一道防线显式权限控制 (default / delete):通过将类的默认行为从隐式推断转变为明确定义,我们可以精确控制默认构造函数的生成,或彻底禁用拷贝功能继承体系 (override / final)

2026-03-24 10:02:17 328

原创 C++ 数据结构进阶:unordered_map 与 unordered_set源码分析与实现

本次封装的核心在于通过 KeyOfValue 仿函数 实现了底层 HashTable 与上层 set/map 的解耦。这种一套引擎,两套外壳的设计,不仅利用模板策略完成了 O(1) 平均时间复杂度的极致性能,更通过 pair<const K, V> 从编译器层面锁死了 Key 的修改权限特性map / set底层结构红黑树(平衡搜索树)哈希表(开链法)查找效率O(log N)(稳定)O(1)(平均),最坏 O(N)元素顺序有序(按 Key 排序)无序迭代器双向迭代器(可--前向迭代器(仅++

2026-03-22 13:08:19 399

原创 C++数据结构进阶:哈希表实现

至此,这篇关于哈希表手写实现的长文也告一段落。回顾整个实现过程,本质上是一场围绕空间利用、性能表现与工程健壮性展开的权衡与取舍:开放定址法通过线性探测与状态标记,在连续数组中精细运作,以获得更优的缓存局部性与访问效率;链地址法则借助链表结构与节点迁移,在更灵活的存储空间中实现冲突管理,即使在较高负载因子下仍能保持稳定表现。

2026-03-20 14:04:48 343

原创 C++ 数据结构进阶:哈希表原理

总的来说,哈希表是计算机科学中空间换时间思想的终极体现。它通过哈希函数将复杂的键空间映射为简单的数组下标,试图在平均情况下触碰 O(1) 的查找极限。在这一过程中,我们既要设计分布均匀的散列函数(如除法、乘法或随机化的全域散列)来减少碰撞,也要通过开放定址法(利用连续内存的缓存优势)或链地址法(利用外部空间的灵活性)来化解不可避免的冲突。当负载因子 α 触及红线,或者单个桶的性能因极端冲突而退化时,及时的扩容与红黑树化等工业级优化则是保障系统鲁棒性的最后防线。

2026-03-19 22:19:05 398

原创 C++关联容器进阶:unordered_map / set与详解

总的来说,std::unordered_map 是 C++ 给追求极致性能的开发者的加速器,它通过牺牲有序性和额外的内存空间换取了平均 O(1) 的惊人速度。然而,在实际工程中必须警惕哈希冲突导致性能退化到 O(N) 的极端情况,并习惯为自定义 Key 手动提供 hash 函数和 operator==。一个成熟的 C++ 开发者应当具备这样的直觉:在数据量大且无序要求的算法场景(如两数之和、LRU)中首选 unordered 系列,并养成提前使用 reserve() 规避重哈希(rehash)开销的好习惯。

2026-03-17 23:52:31 394

原创 C++ STL底层原理:基于红黑树封装实现 map 和 set

在红黑树(以及所有二叉搜索树)中,迭代器遵循中序遍历的顺序。因此,begin() 必须指向树中的最小节点,而 end() 则指向遍历结束后的逻辑终点代码实现public:// 定义迭代器类型// begin():指向中序遍历的第一个节点(最左节点)// end():指向最后一个节点的下一个位置(即 nullptr)// const 版本的接口,用于支持 const 容器的遍历// ... 其他成员函数(Insert, Find 等) ...private:逻辑解析。

2026-03-16 16:40:44 394

原创 C++数据结构:红黑树原理与实现

经过从底层原理到实战应用的深度拆解,我们不难发现,红黑树不仅仅是一个经典的数据结构,更是权衡艺术在计算机科学中的巅峰体现核心要点回顾结构本质:红黑树是一棵增加了颜色属性的自平衡二叉搜索树。它通过4 条核心规则,确保了最长路径不超过最短路径的 2 倍,从而将查找、插入、删除的时间复杂度稳定在 O(log N)平衡策略:与 AVL 树追求绝对平衡不同,红黑树追求的是全局吞吐量的最优解。它通过牺牲一定的搜索效率(树高略增加),换取了在插入和删除时更少的旋转次数工程基因。

2026-03-09 23:43:53 377

原创 C++ 数据结构:AVL树原理与实现

必须是一棵二叉搜索树每个节点的左右子树高度差绝对值不超过 1因此AVL 树又称高度平衡二叉搜索树。平衡因子(Balance Factor)定义:bf = 右子树高度 - 左子树高度。每个节点的平衡因子必须满足这一条件根据上述条件,AVL 树的结构可以这样设计int _bf;{}为什么要有 parent 指针?插入后需要从当前节点开始逐层向上更新平衡因子,以避免实现过于复杂AVL 树作为计算机科学中最早被发明的自平衡二叉搜索树,其核心特征在于其近乎苛刻的逻辑约束。

2026-03-07 23:17:47 433

原创 C++ STL 关联容器详解(二):map 的原理,接口与实战

纵观全篇,从 std::set 的红黑树机理到 std::map 在复杂算法中的多维应用,我们可以清晰地看到:关联式容器的精髓绝非仅仅停留在对 API 的机械调用,而在于对其设计哲学的深度理解当我们开始审视 set 迭代器的常量约束,或是剖析在元素移动时导致的迭代器失效,乃至在随机链表复制等场景中巧妙建立映射时,我们便完成了从接口使用者向高效开发者的身份转变关联式容器的世界博大精深,set 与 map 仅仅是窥见其逻辑美感的一个切口。

2026-03-06 00:39:14 399

原创 C++ STL 关联容器详解(一):set 的原理,接口与实战

这不是普通的集合,而是一棵严格遵循红黑树结构的有序容器。需要特别注意的是,set中的元素都是只读的(const类型)。若需要修改元素,必须先执行erase操作删除旧值,再通过 insert 插入新值优先使用成员函数(如 s.find())。标准库算法 std::find 是线性扫描 O(n),而 set::find 则具有对数级复杂度 O(log n),性能优势显著在循环中删除元素时,必须使用 it = s.erase(it) 的正确写法。直接删除会导致迭代器失效,引发未定义行为。

2026-03-04 12:08:48 350

原创 二叉搜索树(下):KV结构实现与算法应用

在本篇文章中,我们从零开始实现了一棵 KV 结构的二叉搜索树,并完整梳理了其核心操作,通过对每种情况的分析,我们理解了 BST 操作的本质逻辑,以及三种删除场景的处理方式。同时,我们也分析了其时间复杂度 —— 在理想情况下为 O(logN),而在极端退化情况下可能达到 O(N)通过这次实践,我们不仅夯实了二叉搜索树的理论基础,更掌握了其工程实现的具体细节。在后续学习中将会发现,AVL树、红黑树以及map、set等数据结构,本质上都是基于BST的演进与优化BST 是所有平衡树结构的起点。

2026-03-03 18:30:34 349

原创 二叉搜索树(上):概念、性能与应用

虽然 vector、list 等线性容器已能应对多数场景,但在海量数据的快速增删查改面前,线性结构 O(N) 的瓶颈愈发明显。为了追求更高的效率,我们必须引入树结构。作为树论的基石,二叉搜索树(BST)通过独特的组织方式,将查找效率提升到了类似二分查找的高度。因此,在本篇文章中,我们将系统地介绍:什么是二叉搜索树,基本性质,时间复杂度与性能分析而在下一篇文章中,我们将进一步实现 BST 的完整模拟实现(增删查改),深入理解其内部工作原理。

2026-02-28 21:46:21 676

原创 C++ 多态详解(下):虚函数表与运行时动态绑定机制

静态绑定静态绑定发生在编译阶段Base b;b.func();// 假设 Base 中有一个普通成员函数 func编译器在编译时就已经确定要调用 Base::func, 函数地址在编译阶段就确定了,因此执行时不会再发生变化。动态绑定(Dynamic Binding)动态绑定发生在运行阶段当通过基类指针或引用调用虚函数时,编译器无法在编译阶段确定具体调用哪个函数p->func1();编译器只知道 p 是 Base*, 但真正的类型却对象是 Derived因此,具体调用哪个函数必须在运行时决定。

2026-02-28 16:02:30 992

原创 C++ 多态详解(上):概念与语言机制

通俗来说,多态就是“多种形态”。在 C++ 中,多态主要分为编译时多态(静态多态)和运行时多态(动态多态)多态是 C++ 面向对象的核心特性之一,它允许程序在运行时根据对象的实际类型选择函数实现,而不是根据变量的静态类型决定。实现运行时多态的关键在于:基类使用 virtual 声明虚函数,派生类重写该函数,并通过基类的指针或引用来调用。虚函数机制使得同一接口在不同对象上表现出不同的行为,从而提高了代码的灵活性和可扩展性。抽象类则通过纯虚函数(= 0)定义接口规范,强制派生类提供具体实现。

2026-02-24 22:13:59 1100

原创 C++ 继承(下):多继承、菱形继承与虚继承

class A {};class B {};C 类同时继承自 A 类和 B 类,其对象内部包含来自 A 类和 B 类的子对象这在语法上完全合法在 C++ 中,继承不仅是一种语法机制,更是一种对象模型的核心组成部分。理解继承的本质需要从对象的内存布局入手,特别是当继承关系变得复杂时(如多继承、菱形继承等场景),掌握对象内部布局比单纯记忆语法规则更为重要。单继承时,派生类对象包含基类子对象和自身成员,内存布局相对简单多继承时,派生类对象会包含多个基类子对象,可能导致内存对齐问题的复杂变化。

2026-02-22 23:49:53 1312

原创 C++ 继承(上):语法、访问控制与默认成员函数

在 C++ 中,继承是一种代码复用 + 语义表达的机制。当我们发现两个类之间存在明显的 is-a(是一个) 关系时,就可以考虑使用继承。例如:Student。

2026-02-20 22:33:49 583

原创 C++模板进阶:非类型参数、特化与分离编译全解析

非类型模板参数指的是不是一个类型,而是编译期就可以确定的常量值private:T _data[N];T是类型参数N是非类型模板参数使用时不同的N,会生成完全不同的模板实例// test.hint main()func();每个 .cpp 单独编译, 生成目标文件 .o链接阶段把所有目标文件合并链接器根据符号表找到 func() 的实现普通函数在编译阶段就已经确定了具体的函数实体模板不是函数,不会提前生成代码;模板的实例化发生在使用处,因此定义必须对使用者可见。

2026-02-18 18:35:13 977

原创 STL 容器适配器详解:stack 与 queue

到这里,stack、queue 和 priority_queue 的概念、实现原理以及它们为什么“看起来简单却不能遍历”,我们都已经讲清楚了。你会发现,它们本质上并不是新的容器,而是建立在其他顺序容器之上的“使用方式约束”。理解了这一点,不管是自己模拟实现、刷OJ题,还是面试手撕代码,都会轻松很多。这一篇就到这,下一篇我们继续搞点更硬核的东西。

2025-10-20 22:09:40 726

原创 深入理解 STL::list:链表的底层原理与使用场景

链表是一种将数据通过指针连接在一起的数据结构。它不像数组那样将所有元素保存在连续的内存中,而是每一个元素也就是结构体(称为节点)都通过指针指向下一个节点{}T _data;// 存储实际内容// 指向前一个节点的指针// 指向下一个节点的指针list 的典型特性:插入 / 删除效率高:O(1) 时间复杂度,只需要删除节点并修改指针即可不支持随机访问:不能像数组一样使用下标,list[i]支持双向迭代器(可以从前往后,也可以从后往前遍历)每次访问某个位置都要从头到尾一个个跳过去。

2025-09-29 21:36:25 962

原创 从零实现 C++ vector:原理、实现与优化

本文通过模拟实现的方式,从构造、容量管理、访问、修改等多个维度,逐步揭示了 vector 的内部结构与核心机制。vector 是一个既简单又强大的容器,掌握它不仅能帮助我们更高效地开发程序,也为理解 C++ 更复杂的数据结构打下坚实基础。

2025-07-15 14:52:34 792

原创 C++ string 全面解析与模拟实现

在 C++ 中,迭代器(iterator)是 STL 中的核心概念之一。可以将它简单理解为可以在容器上顺序移动的指针。不同容器对迭代器的实现方式不同:某些容器将其封装为类,而字符串我们则可以视为简单的 char* 指针。string类为我们提供了四种类型的迭代器:正向迭代器, 反向迭代器, const正向迭代器, const反向迭代器end() 指向容器中最后一个有效元素的后一个位置,而 rend() 指向第一个有效元素前一个位置的内存地址。这两个位置都不能直接解引用,否则会导致未定义行为。

2025-06-05 15:17:16 867

原创 C++ 内存管理:原理、机制与面试重点

自定义类型 (结构体, 类) 在分配时除了需要分配空间, 还需要调用对应的构造函数, 在释放时也要调用析构函数, 这也是 C 和 C++ 内存管理的本质区别之一public::_a(a)cout << "MyClass 的构造函数调用了" << endl;~MyClass()cout << "MyClass 的析构函数调用了" << endl;int main()// 调用构造函数对类的成员进行初始化delete obj;// 释放时调用类的析构函数。

2025-05-23 14:32:14 1126

原创 C++类和对象(下):深入特性与优化

在本篇文章中,我们深入探讨了类和对象的高级特性,从初始化列表到匿名对象,每一个概念都揭示了 C++ 设计哲学的深度与精妙。

2025-01-13 15:10:16 880

原创 C++类和对象(中):默认成员函数全解

构造函数的名字必须与类名相同。构造函数没有返回值。构造函数可以在对象创建时自动调用,用于对象的初始化。构造函数可以重载如果类中没有显式定义构造函数,则C++编译器会⾃动⽣成⼀个⽆参的默认构造函数,⼀旦⽤⼾显 式定义编译器将不再⽣成。public:// 构造函数的名字必须与类名相同。Student() // 构造函数没有返回值cout << "无参数的构造函数执行了" << endl;//构造函数可以重载_age = age;

2024-12-11 15:13:02 1942

原创 C++类与对象(上):基础知识与实例

class是用于定义类的关键字,Student为类的名称,{}中包含类的主体部分。注意,类定义后需要以分号结束。类的组成部分称为成员:变量称为属性或成员变量,函数称为方法或成员函数。为了区分成员变量,通常在变量前添加特殊标识,如加前缀m_或后缀。虽然C++对此没有强制规定,但遵循团队或公司惯例是良好的实践。在C++中,struct不仅兼容C中的结构体用法,还升级为类的形式,支持定义函数。尽管如此,建议使用class来定义类以符合常规编程习惯。类中定义的成员函数默认是inline,有助于提升运行效率。

2024-12-06 10:54:01 1714

原创 从 C 到 C++:快速掌握 C++ 的入门语法

C++入门基础

2024-12-03 11:06:29 1727

原创 C++的历史与发展:从C到现代编程语言的演变

如果你是一个 C++ 初学者,想快速查找常见的标准库函数和语法,更合适。如果你需要更深入的 C++ 知识,尤其是关于新标准的详细文档,或是查找 C++ 的最新特性,是更好的选择,特别是它的中文版,能够提供更全面的翻译和及时更新。

2024-11-27 14:52:34 1006

空空如也

空空如也

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

TA关注的人

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