自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【MySQL】库的操作

计算机底层保存的是二进制数据,而我们希望存储和读取的是中文、英文、数字以及各种符号。

2026-11-01 16:00:15 202 1

原创 【MySQL】数据库基础

本文介绍MySQL数据库基础,涵盖其作为网络服务的本质、C/S架构原理及在CentOS7上的运行管理。重点区分Linux Shell与MySQL客户端命令环境,强调安全操作规范。通过创建学生信息库实例,演示数据库、表与文件系统的关系,说明数据存储逻辑,并指导使用SQL语句进行基本操作,为后续深入学习奠定基础。

2026-10-30 01:25:21 265 2

原创 【Linux】基础IO(一)——文件、上层C库文件操作、底层linux原生IO

提到文件它们保存在磁盘这种外设硬件上,就算断电,数据也不会丢失。我们对磁盘上文档做读写,本质上就是对外设做输入输出,也就是我们常说的 IO(input,output)但是在Linux中,文件的概念就要宽泛多了,在Linux下一切皆文件不止普通磁盘文档,键盘、显示器、网卡、管道这些硬件和内核对象,都会被系统统一抽象成 “文件”。上层程序不需要区分自己操作的是硬盘、键盘还是网络,全部复用同一套 IO 系统接口完成读写,这也是 Linux 设计非常巧妙的地方一个完整的文件,到底由什么东西构成?

2026-09-03 16:12:44 401 2

原创 【Linux】进程控制(二)——程序替换、自定义myshell

本文介绍了Linux下的进程程序替换机制(exec),重点讲解了exec系列函数的原理和使用方法。文章首先通过一个示例展示fork创建子进程后使用execl执行ls命令的过程,解释了程序替换不会创建新进程而是替换当前进程的特性。接着详细分析了程序替换的底层流程:释放原进程虚拟地址空间,加载新程序并重建页表映射。文章还系统介绍了6个exec系列函数(execl、execlp、execle、execv、execvp、execve)的区别和使用场景,包括可变参数列表(l)、参数数组(v)、PATH搜索(p)和环境

2026-08-22 16:36:11 366 1

原创 【Linux】进程控制(一)——进程创建、进程终止与进程等待

本文摘要: 进程创建 - fork函数 fork()复制当前进程创建子进程,实现程序双执行流 子进程返回0,父进程返回子进程PID 采用写时拷贝(COW)技术优化性能,仅在修改数据时才复制内存 进程终止 终止后内核保留PCB记录退出状态,等待父进程回收 三种终止场景:正常完成、结果错误、异常中断 退出状态由退出码(exit_code)和信号编号(sig)描述 进程等待 父进程需通过wait/waitpid回收子进程资源 避免产生僵尸进程(已终止但未被回收的进程) 终止方式 main函数return exit

2026-08-16 11:16:56 347 2

原创 【Linux】进程(四)——进程虚拟地址空间

本文深入讲解了进程虚拟地址空间的概念与原理。文章首先纠正了"程序内存分区"的错误说法,强调只有运行中的进程才拥有虚拟地址空间。通过代码示例展示了虚拟地址空间的具体布局,包括代码段、数据段、堆栈区等分布情况。 文章详细解释了虚拟地址与物理地址的区别:虚拟地址是操作系统为每个进程虚构的逻辑地址,而物理地址是实际硬件地址。通过fork父子进程的例子,展示了写时拷贝机制如何实现相同虚拟地址映射不同物理内存。还介绍了页表、MMU等底层机制,以及内核中的mm_struct结构体。 最后,文章从底层角度解释了堆栈增长方向

2026-08-07 10:36:15 376

原创 【C++】用链地址哈希表封装 unordered_map / unordered_set

本文介绍了如何基于链地址哈希表封装实现C++中的unordered_map和unordered_set。主要内容包括: 基础哈希表的缺陷:存储类型固定、键提取逻辑耦合、缺乏迭代器支持等问题。 KeyOfT仿函数:引入提取键的通用接口,通过模板参数适配不同类型容器(set直接返回键,map提取pair.first)。 哈希迭代器实现:包含节点指针和哈希表指针,支持跨桶遍历,同时实现了const迭代器版本。 键值保护机制:将键设为const类型,防止外部修改导致哈希位置错乱。 unordered_map专属特性

2026-08-01 16:37:22 241

原创 【C++】unordered_set/unordered_map的使用和哈希表的实现

本文介绍了C++标准库中的无序容器unordered_set和unordered_map的使用方法及其实现原理。unordered_set是无序、去重的单值哈希容器,要求元素支持哈希转换和相等比较,平均操作时间为O(1)。unordered_map存储键值对,同样基于哈希表实现,支持高效查找但不保证顺序。文章对比了它们与有序容器set/map的差异,包括底层结构、元素要求和遍历特性,并提供了常用接口的代码示例,如insert、find、erase等。unordered_map还支持[]操作符访问,但需注意意

2026-07-31 15:39:46 242 2

原创 【C++】封装红黑树实现mymap和myset

C++红黑树封装实现map和set 本文介绍了如何通过封装红黑树来实现自定义的map和set容器。主要内容包括: STL源码分析:set和map底层共用同一棵红黑树,set存储单个key,map存储键值对,两者都是通过仿函数从存储数据中提取key进行排序。 设计思路:提出泛型红黑树模板,通过三个关键参数实现复用: K:查找、删除时使用的键类型 T:节点实际存储的数据类型 KeyOfT:从T中提取key的仿函数 仿函数的作用:作为提取key的工具,set直接返回数据本身,map返回pair.first。 实现

2026-07-26 20:10:50 252 2

原创 【C++】红黑树的实现

红黑树的核心概念与实现 红黑树是一种平衡二叉搜索树,通过颜色约束实现近似平衡。它相比AVL树减少了旋转次数,在工程中广泛应用(如C++ STL、Linux内核)。红黑树遵循五大规则:节点非红即黑、根节点为黑、无连续红节点、所有路径黑节点数相同、空节点视为黑。 红黑树结构基于二叉搜索树,增加颜色属性和父指针。插入操作的核心是新节点默认红色,若父节点也为红则分三种情况处理: 叔叔节点为红:变色处理(父叔变黑,祖父变红)并向上回溯 同向情况:单旋+变色(父变黑,祖父变红) 异向情况:双旋+变色转为同向情况处理 这

2026-07-24 12:54:55 259 2

原创 【C++】AVL树

AVL树是一种自平衡二叉搜索树,通过旋转调整保持严格的高度平衡,确保增删查改操作的时间复杂度稳定在O(logN)。其关键特性是任何结点的左右子树高度差不超过1。插入新结点时,会更新平衡因子(右子树高度 - 左子树高度),若出现2或-2则触发旋转调整(单旋或双旋)。AVL树相比普通BST增加了父指针和平衡因子成员,插入流程分为BST规则插入、回溯更新平衡因子、旋转调整三部分。旋转后子树高度恢复,不影响上层结构,从而保证全局平衡。这种机制有效避免了二叉搜索树退化为单支树的情况,显著提升了性能稳定性。

2026-07-17 22:25:25 443 3

原创 【C++】标准模板库STL——set /multiset/map /multimap

摘要 本文介绍了C++ STL中的关联式容器set/multiset和map/multimap,重点分析了它们与序列式容器的区别及使用方式。 序列式容器(如vector、list)按插入顺序存储,查找效率为O(N);关联式容器(如set、map)基于红黑树实现,按关键字自动排序,查找效率为O(logN)。 set特性:自动排序(默认升序)、去重、元素不可修改,增删查效率高(O(logN))。支持insert、erase、find、count等操作。 multiset与set区别:multiset允许关键字重

2026-07-15 15:59:21 237 2

原创 【C++】二叉搜索树

本文介绍了二叉搜索树(BST)的核心概念与实现。二叉搜索树是一种具有排序规则的二叉树,左子树值≤根≤右子树值,中序遍历结果有序。文章分析了BST的性能特点:最好情况(平衡树)操作复杂度为O(logN),最差情况(单链树)退化为O(N)。重点讲解了BST的三大核心操作:插入(按左小右大规则定位插入点)、查找(类似插入的遍历逻辑)、删除(分4种情况处理,最复杂的是左右孩子均非空时的替换法)。通过C++代码实现了BST的基础功能,包括结点结构定义、中序遍历验证以及插入、查找、删除等操作,并提供了测试用例验证正确性

2026-07-14 15:38:49 232 2

原创 【C++】多态

摘要: C++多态分为编译时多态(如函数重载)和运行时多态(动态绑定)。动态多态需满足三个条件: 继承关系:派生类公有继承基类; 虚函数声明:基类函数用virtual修饰,派生类重写时推荐保留; 基类指针/引用调用:确保运行时根据实际对象类型绑定函数。 关键点: 虚函数重写需函数名、参数列表、返回值完全一致(协变例外,允许返回基类/派生类指针或引用); 直接使用基类对象接收派生类会导致切片问题,多态失效; 示例中通过Person&或Person*调用BuyTicket(),实现不同对象(学生、军人)的同

2026-07-12 13:57:23 373 2

原创 C语言数据结构——链式二叉树

本文介绍了C语言中链式二叉树的实现方法。主要内容包括: 链式二叉树的定义和存储结构,使用左右指针表示节点关系; 二叉树的三种递归遍历方式(前序、中序、后序)及其实现; 常用递归函数的实现:统计节点数、叶子节点数、第k层节点数和计算树高; 通过图解和递归调用过程分析,详细解释了二叉树的遍历和递归原理。 文章采用代码示例配合图示的方式,帮助理解二叉树的基本操作和递归思想,适合学习数据结构中二叉树相关内容。

2026-06-30 13:59:10 182 2

原创 C语言数据结构——树与堆

本文介绍了树与二叉树的基本概念和特性,重点讲解了堆的实现及核心算法。 主要内容包括: 树的基本概念和术语,如父/子节点、度、叶子节点等,以及树的非线性结构特征。 二叉树的定义和特性,包括完全二叉树和满二叉树的区别,以及完全二叉树的数组存储方式。 堆的定义和分类(大根堆和小根堆),堆采用动态数组实现。 堆的两大核心算法: 向上调整算法(AdjustUp):用于插入数据时维护堆结构,时间复杂度O(logn) 向下调整算法(AdjustDown):用于删除堆顶数据时维护堆结构,时间复杂度O(logn) 详细分析了

2026-06-29 15:29:45 275 2

原创 C语言数据结构——栈和队列

摘要: 本文介绍了C语言中栈和队列的实现与应用。栈是一种后进先出(LIFO)的数据结构,支持入栈、出栈等操作,可使用数组或链表实现。文章详细展示了动态数组栈的完整实现代码,包括初始化、销毁、入栈、出栈等核心功能,并通过测试代码验证。此外,还以LeetCode 20题“有效的括号”为例,演示了栈的实际应用,通过栈结构高效匹配括号对。栈的数组实现相比链表更节省空间且性能更优,适合大多数场景。

2026-06-28 14:59:34 260 2

原创 C语言数据结构——双向链表

本文介绍了C语言中双向链表的实现,重点讲解了带头双向循环链表的结构与优势。相比单链表,双向链表通过引入前驱指针和哨兵头节点,实现了O(1)时间复杂度的尾插/尾删操作,并能双向遍历。 文章详细说明了双向链表的8种分类方式,节点结构定义(包含data、next和prev指针),以及核心操作实现: 初始化时创建自循环的哨兵头节点 插入操作(头插、尾插、指定位置插入)通过调整相邻节点的指针完成 删除操作同样通过指针重连实现 查找功能为后续操作提供定位支持 所有操作都保持O(1)时间复杂度,且空链表与非空链表的处理逻

2026-06-24 13:17:54 215 2

原创 C语言数据结构——单链表

我们新建头文件 SList.h,统一封装结构与函数声明//重命名链表储存的数据类型,方便后期切换成不同类型数据//定义单链表结点//存储的数据//一个指针,保存下一个结点地址}SLTNode;//将结点结构体重命名为SLTNode。

2026-06-19 18:43:58 236

原创 【Linux】进程(三)——进程切换、O (1) 调度、环境变量、命令行参数

本文摘要: 底层内存基础:介绍了多字节变量的地址规则(取最小地址)和结构体偏移量计算方法,为理解内核数据结构奠定基础。 Linux进程管理机制:详细解析了Linux如何通过内嵌list_head结构体实现通用链表管理所有进程,以及进程状态切换时通过链表节点挂靠不同队列的实现原理。 O(1)调度器设计:深入剖析了Linux O(1)调度器的核心组件: 优先级数组queue[140]实现哈希定位 位图bitmap快速检索非空队列 活跃/过期队列保证调度公平性 通过医院诊室的类比生动解释了调度流程。 环境变量机制

2026-05-17 14:02:57 434 3

原创 【Linux】进程(二)——进程状态(僵尸进程、孤儿进程)、前后台进程、进程优先级

本文摘要: 文章系统讲解了进程状态及其在Linux中的实现。基础状态包括运行态(CPU执行)、就绪态(等待调度)和阻塞态(等待事件)。阻塞本质是进程从CPU队列移至硬件等待队列,事件完成后再移回。Linux扩展了状态模型:R(运行)、S(可中断阻塞)、D(不可中断阻塞)、T(暂停)、Z(僵尸)、X(死亡)。重点分析了僵尸进程(Z态)的危害——内存泄漏,需由父进程回收task_struct。此外介绍了挂起机制(缓解内存压力)和OOM Killer(内存不足时强制终止进程)。通过代码演示了僵尸进程的产生与检测方

2026-05-13 12:58:05 417 1

原创 【Linux】进程(一)——进程理解、进程查看、如何运行多个进程

本文介绍了Linux系统中进程的基本概念和管理方法。主要内容包括:1)进程与程序的区别,进程是运行中的程序,由内核数据结构task_struct和代码数据组成;2)进程状态(运行态、睡眠态、僵尸态等)及其转换;3)进程信息查看方法,包括/proc文件系统、top/htop和ps命令;4)通过代码示例演示了单进程运行、进程阻塞状态以及使用fork()创建子进程的过程。文章通过理论讲解与实操结合的方式,帮助读者理解Linux进程管理的核心概念和基本操作。

2026-05-10 13:27:56 517 2

原创 冯・诺依曼体系

本文介绍了冯・诺依曼计算机体系结构和操作系统的基本原理。冯・诺依曼体系通过内存作为缓冲层,解决了CPU与输入输出设备速度不匹配的问题,形成"CPU只与内存交互"的核心原则。操作系统作为计算机的"大管家",负责管理硬件资源、内存分配、进程调度等核心功能,并为用户程序提供执行环境。文章详细阐述了内存的缓存作用和局部性原理,解释了操作系统通过"先描述再组织"的方式高效管理系统资源,并以QQ聊天为例说明了数据在计算机中的流动过程。最后简要介绍了计算机启动时

2026-05-09 19:15:02 522 2

原创 【linux】Shell 原理与用户权限解析

如果文件拥有者设为 rw-,所属组设为 r–,你既是拥有者又是所属组用户,按顺序验证身份你会被分到拥有者身份,只会按文件拥有者rw-权限执行(身份只验证一次)

2026-04-07 19:07:04 494 4

原创 Linux基本指令

参数全称作用常用组合-llong长格式显示,显示权限、属主、大小、时间等详细信息(ll 就是它的别名)ls -l-aall显示所有文件,包括 . 开头的隐藏文件(比如 .bashrc、.git)ls -la-ddirectory只显示目录本身,不展开目录内的文件ls -ld 目录名-h人性化显示文件大小(KB/MB/GB,替代纯字节)-ttime按文件修改时间排序,最新的在最上面ls -lt-rreverse倒序排序(配合 -t 用,最老的在最上面)

2026-04-03 17:27:12 397 2

原创 C++继承

C++继承是面向对象编程的核心特性,允许派生类复用基类的公共成员,避免代码冗余。摘要要点: 继承解决了类之间的共性代码复用问题,形成"is-a"关系,如Student和Teacher继承Person类。 继承方式(public/protected/private)决定基类成员在派生类中的访问权限,public继承最常用。基类private成员始终不可见。 派生类对象可向上转型为基类(切片/指针/引用),但基类不能向下转型为派生类。 同名成员会隐藏基类成员,需通过类域显式访问。派生类默认成

2026-03-14 19:56:59 385 2

原创 C++模板进阶

C++模板进阶摘要 本文深入探讨C++模板的高级应用,主要包括非类型模板参数和模板特化两大主题。非类型模板参数允许使用常量作为模板参数,实现固定大小的容器如Stack和std::array。文章详细介绍了非类型参数的限制,必须是编译期常量且类型受限。 模板特化部分讲解了如何为特定类型定制模板实现。函数模板特化需要遵循严格的语法规则,而类模板特化分为全特化和偏特化。全特化针对所有模板参数指定具体类型,偏特化则可部分特化或对参数类型施加限制(如指针/引用类型)。这些技术能解决通用模板在特殊类型下的异常行为,提升

2026-03-10 09:48:16 399 2

原创 C++ 标准模板库(STL)——priority_queue和heap的使用和底层实现

本文介绍了C++ STL中的priority_queue和heap数据结构。priority_queue是容器适配器,默认使用vector作为底层容器,通过仿函数控制排序方式(默认大顶堆)。文章讲解了priority_queue的基本操作和使用方法,并详细分析了仿函数的实现原理。随后深入探讨了heap的底层特性,包括完全二叉树结构、大/小根堆定义以及核心操作算法(向下调整、向上调整和建堆),最后给出了大根堆的C++实现代码,包含插入、删除等基本操作。这些内容为理解和使用优先级队列和堆数据结构提供了实用指导。

2025-11-21 16:30:17 866 2

原创 C++ 标准模板库(STL)——stack、queue、deque的使用和底层原理

(node就是中控区数组的某个元素,当前元素的值是当前内存块的地址)

2025-11-19 19:36:31 685 3

原创 C++标准模板库(STL)——list的模拟实现

通过模板参数实例化,分别得到普通迭代器和 const 迭代器之前的 _list_iterator<T, Ref, Ptr> 是 “通用模板”(图纸),三个参数都是占位符。现在通过 typedef给模板传了 “具体参数”,直接生成两个 “专用迭代器类型"class listpublic://重命名变成我们熟知的普通迭代器和const迭代器//普通迭代器:Ref=T&,Ptr=T*// const迭代器:Ref=const T&,Ptr=const T*

2025-11-16 15:42:56 1195 4

原创 C++标准模板库(STL)——list的使用

这组接口用于正向遍历容器。

2025-11-15 15:37:04 910 3

原创 C++标准模板库(STL)——vector的模拟实现

T相当于一个类型占位符,后续使用时编译器会自动把它替换成具体类型。

2025-11-05 10:22:59 1147 2

原创 C++标准模板库(STL)——vector的使用

当插入元素后size>capacity时,空间不足,vector就会触发扩容。系统会分配一块更大的空间(按原容量的1.5或2倍扩充),并将原数据拷贝到新空间,释放旧空间。此时所有的迭代器、指针、引用都会失效,接下来我会粗略地介绍vector类一些常用成员,同时为了讲解方便,本文先以储存int类型为例介绍常用接口,如果大家想了解更多,可以点开上面的链接查阅。vector的使用和string非常相似,所以本文将减少文字说明,多用代码介绍。,vs下capacity是按1.5倍增长的,g++是按2 倍增长的。

2025-11-04 20:31:46 1141 4

原创 C++标准模板库(STL)——string的模拟实现

C++标准模板库(STL)——string的模拟实现

2025-10-31 19:46:03 858 5

原创 C++ string的使用

本文介绍了C++中string类的使用方法和相关特性。主要内容包括: auto关键字和范围for循环的用法,auto用于自动类型推导,范围for简化容器遍历。 string类的基本概念,它是动态字符数组,自动管理内存。介绍了string的多种构造方法。 string的容量操作,如size()/length()获取长度,resize()调整大小,capacity()查看容量等。 迭代器的使用,包括正向/反向遍历字符串的方法。 字符串修改操作,如operator[]访问字符,push_back()追加字符,ap

2025-10-30 15:41:36 663 4

原创 C++浅谈模板

摘要:本文介绍了C++模板机制在泛型编程中的应用。首先通过交换函数的重载问题引出泛型编程概念,随后详细讲解了函数模板的语法、原理及实例化方式(隐式/显式)。文章还探讨了模板函数与普通函数的匹配优先级规则,最后介绍了类模板的定义与实例化方法。模板机制通过类型参数化实现了代码复用,使开发者能编写与类型无关的通用代码,同时保持类型安全。

2025-10-28 17:37:56 369 5

原创 c/c++内存管理

本文介绍了C/C++内存管理的核心知识。主要内容包括:1)程序内存分区(栈、堆、代码段、数据段)及其存储内容;2)C语言动态内存管理方式(malloc/calloc/realloc/free)的使用和注意事项;3)C++特有的new/delete操作符及其与malloc/free的区别;4)定位new的用法及其在内存池中的应用;5)operator new/delete函数的作用机制。文章通过代码示例详细说明了各种内存管理方式的使用方法,并特别强调了内存泄漏和野指针的防范措施。

2025-10-28 17:04:20 955

原创 C++类和对象(二)

类外初始化静态成员是C++语法规定的特殊情况,这种初始化语法int A::_scount =0;是编译器认可的特殊形式,

2025-10-21 13:59:47 1054 1

原创 C++类和对象(一)

我们先来看一段类的定义class Datepublic:/成员函数_day = day;private:/成员变量,为了区分成员变量和其他变量,可以在成员变量前加_int _year;int _month;int _day;其中class为类的关键字,Date为类的名字,{}中为类的主体,最后以”;”结尾。类体中的变量称为成员变量,类中的函数称为成员函数定义在类里面的成员函数默认为inlineC++中struct也可以定义类(兼容C中struct的同时拓展功能)

2025-09-23 19:08:26 658 1

原创 C++入门(零C++基础也能看懂)

namespace后面跟命名空间的名字,再加上一对{},就是命名空间的格式了。{}中即为命名空间的成员,命名空间中可以定义变量、函数、类型等​/test就是命名空间名/命名空间中可以定义变量、函数、类型int a = 0;int val;​namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。

2025-06-28 21:21:47 1112 3

空空如也

空空如也

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

TA关注的人

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