自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

记录我一步步的学习历程,期待无限进步,向星举目!

记录我一步步的学习历程,期待无限进步,向星举目!

  • 博客(76)
  • 收藏
  • 关注

原创 【C++】深入浅出“图”——图的遍历与最小生成树算法

本文介绍了图的两种遍历方法:广度优先搜索(BFS)和深度优先搜索(DFS)。BFS采用队列结构,从起始顶点出发逐层访问邻接顶点;DFS采用递归方式,沿着一条路径尽可能深入探索再回溯。两种方法都使用标记数组避免重复访问。文章提供了基于邻接矩阵的C++实现代码,并展示了测试用例。同时指出非连通图可能需要额外处理才能遍历所有顶点。

2025-12-21 23:58:36 929 21

原创 【C++】深入浅出“图”——图的基本概念与存储结构

本文介绍了图的基本概念和两种存储结构。图由顶点集合V和边集合E组成,分为有向图和无向图。关键概念包括顶点的度、路径、权值、连通性等。图的存储结构主要有邻接矩阵和邻接表两种方式:邻接矩阵用二维数组表示顶点关系,适合稠密图;邻接表采用链表数组结构,适合稀疏图。文中给出了两种存储结构的C++实现代码,并分析了它们各自适用的场景和优缺点。邻接矩阵能快速判断顶点关系但空间占用大,邻接表节省空间但查询效率较低。

2025-12-21 21:57:52 1180 5

原创 【C++】一文带你看懂常见排序算法

本文介绍了常见的几种排序算法及其实现方法。主要包括插入排序(直接插入排序、希尔排序)、选择排序(直接选择排序、堆排序)和交换排序(冒泡排序)。每种算法都给出了基本思想、代码实现(C++)、测试结果及复杂度分析。其中希尔排序是直接插入排序的优化版本,堆排序利用了优先队列或make_heap算法实现。文章还提供了作者的博客链接,欢迎读者交流学习。这些排序算法在实际应用中各有特点,可根据具体需求选择合适的算法。

2025-12-21 11:45:45 1561 32

原创 【C++】并查集的原理与使用

本文介绍了并查集的概念、实现及其在算法题中的应用。并查集是一种用于处理不相交集合合并与查询的数据结构,通过数组表示森林关系。文章详细讲解了并查集的底层原理、核心操作(查找、合并、统计集合),并提供了C++实现代码。最后通过LeetCode例题(省份数量、等式方程可满足性)展示了并查集的实际应用,验证了其高效解决集合问题的能力。

2025-12-17 21:45:35 1042 34

原创 【C++】哈希扩展——位图和布隆过滤器的介绍与实现

本文介绍了两种高效处理海量数据查询的数据结构:位图和布隆过滤器。位图通过比特位直接映射整型数据,实现O(1)时间复杂度的查询,适用于整数判断场景。布隆过滤器则通过多个哈希函数将非整型数据映射到位图中,虽存在误判率但能大幅节省空间。文章详细分析了布隆过滤器的误判率数学推导,并给出了C++实现代码。两种数据结构各有优势:位图精确高效但仅支持整型,布隆过滤器支持更广数据类型但存在概率性误判。

2025-12-16 19:10:36 1337 74

原创 【Linux系统】进程终止、进程等待与进程替换的概念与实现

本文主要讲解了进程终止、进程等待和进程替换三个关键概念。首先介绍了进程退出的三种情况及其对应的退出码和终止信号,通过echo $?可以查看进程退出码。其次详细说明了进程等待的必要性及wait和waitpid系统调用的使用方法,重点解析了status参数如何通过位图记录进程退出信息。最后讲解了进程替换的实现方式,介绍了exec系列函数的功能及参数传递规则。全文通过代码示例验证了理论内容,帮助读者理解Linux进程管理的核心机制。

2025-12-10 21:43:59 1567 68

原创 【Linux系统】初探虚拟地址空间

本文主要探讨了内存空间布局和虚拟地址空间的概念。文章首先介绍了程序内存的栈区和堆区生长方向,并通过实验验证了栈区从高地址向低地址生长、堆区从低地址向高地址生长的特性。其次,通过fork示例引出虚拟地址的概念,解释了父子进程共享相同虚拟地址但不同物理地址的现象。文章详细阐述了虚拟地址空间与页表机制,包括写时拷贝的实现原理。最后,分析了虚拟地址空间的三大优势:保障安全性、实现内存高效管理、支持延迟分配和灵活内存布局。虚拟地址机制使程序在逻辑上有序访问内存,同时物理内存可无序存储,提高了系统安全性和资源利用率。

2025-12-04 18:40:25 601 3

原创 【Linux系统】探索命令行参数与环境变量的本质

本文介绍了C/C++中main函数的命令行参数和环境变量的相关知识。命令行参数通过argc和argv实现程序选项功能,环境变量则是系统级的全局参数,包括PATH、HOME等常用变量。文章详细讲解了环境变量的查看、修改方法,以及如何在程序中获取环境变量表(通过main的第三个参数、environ变量或getenv函数)。通过实例演示了命令行参数和环境变量的实际应用,帮助读者理解这些系统级参数的工作原理和使用方法。

2025-11-27 10:28:10 1004 12

原创 【Linux系统】解明进程优先级与切换调度O(1)算法

本文介绍了Linux进程优先级与调度机制。进程优先级由PRI和NI值决定,PRI=80+NI,NI取值范围为-20~19。通过top命令可修改进程nice值来调整优先级。Linux采用O(1)调度算法,使用两个优先级数组(活跃队列和过期队列)实现高效进程切换。活跃队列存放待执行进程,过期队列存放时间片耗尽的进程,通过指针交换实现队列轮转。这种设计结合位图查找和侵入式链表,确保调度时间复杂度为O(1)。文章还解释了竞争、独立、并行和并发等进程相关概念,说明多进程如何在单CPU环境下通过时间片轮转实现并发执行。

2025-11-23 19:05:26 1050 49

原创 【Linux系统】掌握进程状态:运行/阻塞/暂停/僵尸/孤儿......

本文详细介绍了Linux系统中的进程状态,包括运行状态(R)、睡眠状态(S)、深度睡眠状态(D)、暂停状态(T/t)、僵尸状态(Z)、死亡状态(X)以及挂起状态。文章解释了每种状态的含义和产生条件,并通过代码示例演示了如何查看和改变进程状态。重点说明了僵尸进程的危害及回收方法,以及孤儿进程如何处理。最后还介绍了内存不足时进程的挂起机制,分析了Swap分区的原理和作用。文章全面系统地讲解了Linux进程管理的核心概念和实际应用场景。

2025-11-20 16:12:40 678 41

原创 【Linux系统】初识OS的进程管理:查看与创建进程

本文介绍了计算机系统的核心概念:首先阐述冯·诺依曼体系结构中CPU、内存、外设的交互关系;然后说明操作系统作为软硬件资源管理者的核心功能;重点讲解了进程的概念,包括进程描述符PCB、查看进程的Linux命令(ps/grep)、父子进程关系(pid/ppid);最后通过fork系统调用示例演示了父子进程的创建与识别机制。全文从硬件架构到系统软件,最后聚焦进程管理,层层递进地揭示了计算机系统的基本工作原理。

2025-11-17 19:35:17 834 62

原创 【C++】现代C++的新特性constexpr,及其在C++14、C++17、C++20中的进化

本文概述了C++11到C++20标准中constexpr关键字的演进过程。从C++11引入constexpr开始,它被用于指定编译期可计算的常量表达式,能优化运行时性能。随着标准更新,constexpr功能不断增强:C++14放宽函数限制,允许局部变量和流程控制语句;C++17支持constexpr修饰lambda表达式;C++20则实现了编译期动态内存分配和虚函数支持等重大改进,使编译期计算能力显著提升。文章通过代码示例和汇编分析展示了各版本特性,体现了constexpr如何逐步模糊编译时与运行时的界限,

2025-11-07 16:11:47 1860 73

原创 【Linux系统】C/C++的调试器gdb/cgdb,从入门到精通

本文介绍了Linux下的程序调试方法,重点讲解了gdb/cgdb调试工具的使用。首先说明debug和release模式的区别,强调需添加-g选项生成可调试版本。文章详细演示了调试命令:启动调试(r)、断点设置(b)、查看变量(p)、单步执行(n/s)等核心功能,并对比了gdb和cgdb的界面差异。还介绍了条件断点设置、变量监视(display/watch)等高级调试技巧,通过示例展示如何设置条件断点(b 10 if i==5)和修改变量值(set var)。这些方法能有效帮助开发者定位和修复代码问题。

2025-11-03 20:27:01 1652 76

原创 【Linux系统】从零掌握make与Makefile:高效自动化构建项目的工具

本文介绍了make与Makefile的基础用法。make是Linux下的自动化构建工具,Makefile则用于定义项目构建规则。文章首先展示了一个简单的Makefile示例,说明如何通过依赖关系和依赖方法编译单个源文件。接着讲解了.PHONY伪目标的作用,它能让命令总是被执行而不受文件时间戳限制。最后介绍了Makefile的高级语法,包括变量定义、通配符匹配等功能,展示了如何利用这些特性高效管理包含大量源文件的项目。通过合理使用Makefile,可以显著提升项目构建效率,特别是在需要频繁修改和重新编译的项目

2025-10-24 21:08:22 1378 83

原创 【Linux系统】带你入门编辑器vim与编译器gcc

《Linux开发工具:vim与gcc基础使用指南》 摘要:本文介绍了Linux环境下两大核心开发工具——vim编辑器与gcc编译器的基本使用方法。vim部分详解了三种常用模式(命令/插入/底行)的切换与功能,包括光标移动、文本编辑、批量操作等实用技巧,并分享了vim配置优化方案。gcc部分则解析了C程序从预处理到链接的完整编译流程(-E/-S/-c选项),对比了动态链接与静态链接的差异,帮助读者掌握高效代码编辑与编译的核心技能。文章配有操作示例与截图,适合Linux初学者快速上手基础开发工具链。

2025-10-20 15:30:13 1573 71

原创 【Linux系统】了解文件权限:看懂rwx与用户管理

本文介绍了Linux系统中的用户分类与文件权限管理。主要内容包括:1)用户分为超级用户(root)和普通用户,通过su命令切换用户;2)文件权限通过rwx字符或八进制数值表示,区分所有者(u)、所属组(g)和其他用户(o)的权限;3)使用chmod修改权限,chown/chgrp修改文件所有者;4)umask控制新建文件的初始权限;5)粘滞位(+t)保护共享目录中的文件不被误删。文章通过具体指令示例,详细说明了Linux权限管理的核心概念和操作方法。

2025-10-10 17:41:17 1328 74

原创 【Linux系统】快速入门一些常用的基础指令

本文介绍了Linux系统中的基础指令,包括文件路径查看(pwd)、用户信息显示(whoami)、清屏(clear)、目录创建(mkdir)、文件创建(touch)、树形结构显示(tree)、路径切换(cd)、文件列表(ls)以及删除操作(rmdir/rm)。重点讲解了绝对路径与相对路径的区别,以及常用选项如-a(显示隐藏文件)、-l(显示详细信息)、-p(递归操作)、-f(强制操作)等的使用方法。这些指令是Linux系统操作的基础,掌握它们能有效提高在命令行环境下的工作效率。

2025-10-02 11:18:27 3420 73

原创 【C++】告别“类型转换”踩坑,从基础到四种核心强制转换方式

C++类型转换探析:从内置到自定义类型的安全转换 本文系统梳理了C++中的类型转换机制,首先回顾了C语言的隐式和强制类型转换,然后重点分析了C++中内置类型与自定义类型之间的相互转换方式。文章详细介绍了C++四种强制类型转换操作符(static_cast、reinterpret_cast、const_cast、dynamic_cast)的特点和使用场景,特别是dynamic_cast在多态类型转换中的应用。通过具体代码示例,展示了如何通过构造函数和类型转换运算符实现类型转换,以及explicit关键字在防止

2025-09-20 21:28:20 2008 73

原创 【C++】C++中内存管理的利器“智能指针”

文章摘要: 本文介绍了C++智能指针的设计原理与应用场景。首先分析了手动管理内存资源的缺陷,提出RAII(资源获取即初始化)的设计思想,通过对象生命周期自动管理资源释放。随后详细讲解了四种标准库智能指针:auto_ptr(已弃用)、unique_ptr(禁止拷贝)、shared_ptr(引用计数)和weak_ptr(解决循环引用)。文章还提供了auto_ptr和unique_ptr的简化实现代码,并着重说明了shared_ptr的引用计数机制。智能指针能有效避免内存泄漏,是C++资源管理的重要工具,需根据场

2025-09-15 20:38:55 2433 62

原创 【C++】特别的程序错误处理方式——异常机制

本文介绍了C++异常处理机制的核心概念与应用。异常处理通过抛出对象实现问题检测与处理的分离,比C语言错误码更灵活。文章详细讲解了异常的抛出与捕获机制、栈展开过程、类型匹配规则、异常重新抛出及安全问题,并介绍了noexcept关键字的作用。异常处理虽强大但也需注意资源泄漏等安全隐患,后续智能指针可解决部分问题。

2025-09-09 23:58:56 1573 28

原创 【C++】C++11的包装器:function与bind简介

本文介绍了C++11中的两个重要工具:std::function和std::bind。std::function是一个通用的函数包装器,可以统一存储各种可调用对象(函数指针、lambda表达式、仿函数等),并支持调用操作。文章通过代码示例展示了如何包装普通函数、lambda和成员函数,特别说明了成员函数包装时需要处理this指针的特殊情况。std::bind则是一个函数适配器,可以调整参数顺序和个数,文章演示了如何用占位符改变参数顺序,以及如何绑定固定参数值,最后展示了如何用bind简化成员函数包装时的th

2025-09-08 23:20:25 1059 45

原创 【C++】简单介绍lambda表达式

这篇文章介绍了C++中的lambda表达式,主要内容包括:lambda表达式是匿名函数对象,可定义在函数内部,其类型由编译器生成且唯一;语法结构由捕捉列表、参数列表、返回类型和函数体组成;捕捉列表支持显式/隐式捕捉和混合捕捉,可捕获上下文变量;lambda默认const属性,可用mutable取消常性但不会影响实参;相比函数指针和仿函数,lambda使代码更简洁,常用于排序等场景。通过示例展示了lambda的使用方法和实际应用价值。

2025-09-07 23:43:22 1874 12

原创 【C++】C++11的可变参数模板、emplace接口、类的新功能

可变参数模板是C++11引入的一项重要特性,它允许模板接受任意数量和类型的参数。这一特性极大地增强了C++模板的灵活性和表达能力。可变数目的参数称为参数包,存在两种参数包:模板参数包、函数参数包。我们可以使用操作符去计算参数包中参数的个数。举个栗子:可变参数模板的原理跟模板类似,本质都是去实例化对应类型和个数的多个函数。C++11以后STL容器新增了emplace系列的接口,均为可变参数模板,在功能上兼容push和insert系列,但还有新特点。假设容器存储对象类型为T,emplace还支持直接插入

2025-09-06 16:41:28 1274 40

原创 【C++】C++11的右值引用和移动语义

C++的发展历史上,有许多版本,比如C++98、C++11、C++14,不断更新新的语法。其中,继C++98后,C++11是一个相当重要的版本,更新了许多全新的语法,如右值引用、lambda表达式、function、bind等等,需要我们学习。今天我们首先来学习C++11的右值引用和移动语义。

2025-08-28 18:31:00 1496 36

原创 【C++】封装哈希表模拟实现unordered_set和unordered_map

我们之前学习过了STL中的map和set,它们的底层是红黑树实现的,增删查改的效率在O(n)。除此之外,STL中还有unordered_map、unordered_multimap和unordered_set、unordered_multiset容器,它们的使用方式和map系列和set系列几乎一模一样,所以我们就不用再详细介绍了,详见【C++】来学习使用set和map吧。它们的主要区别在于,unordered_xxx系列容器的底层是由哈希表实现的,上一篇文章我们也详细介绍了哈希表,详见。

2025-08-11 20:38:23 849 8

原创 【C++】哈希表原理与实现详解

如果您觉得我的文章还不错,欢迎多多互三分享交流,一起学习进步!

2025-08-07 16:54:23 2551 38

原创 【C++】论如何封装红黑树模拟实现set和map

本文基于红黑树实现STL中的set和map容器。首先分析STL源码,发现set和map通过红黑树实现,其中set存储key类型,map存储pair<key,value>类型。在红黑树实现中引入Key_Of_T仿函数解决不同类型数据比较问题:set直接返回key,map返回pair的first成员。文章详细展示了红黑树节点的定义、插入操作及旋转平衡处理。通过模板参数K、T和Key_Of_T实现泛型编程,使同一红黑树能同时支持set和map的存储需求,为后续实现迭代器和map的[]操作符重载奠定基础

2025-07-27 11:33:21 2067 38

原创 Java开发实测:用一句话生成一个完整程序(小白也能看懂)

“别怕编程,它比你想象的要简单得多。只要你愿意迈出第一步,飞算AI会陪你走完后面的路。”

2025-07-21 18:02:42 1315 4

原创 【C++】红黑树,详解其规则与插入操作

红黑树是一种自平衡二叉搜索树,通过颜色规则(红黑交替)和旋转操作保持平衡。其核心特性包括:根节点为黑色、红色节点的子节点必须为黑色、每条路径黑色节点数相同。插入新节点时,默认设为红色,若违反规则则通过变色和旋转(单旋/双旋)调整。相比AVL树,红黑树平衡条件更宽松,但同样保证O(logN)操作效率。文章详细介绍了红黑树的结构定义、插入逻辑及四种调整场景的实现方法,并附有代码示例和示意图解析。

2025-07-18 21:49:48 1491 21

原创 【C++】神奇的AVL树

如果您觉得我的文章有所帮助,欢迎多多互三分享交流,一起学习进步!

2025-07-15 23:26:01 1262 23

原创 【C++】来学习使用set和map吧

本文主要介绍了C++的map和set

2025-06-11 15:56:10 1400 21

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

上面我们实现的二叉搜索树,结点中只存储了一个key,称为关键码,关键码即为需要搜索的值,使用这种二叉搜索树的场景只需要判断key是否存在。使用这种key/value二叉搜索树的场景,比如英语词典,树的结构中存储key(英文)和value(中文),搜索时输入英文作为key进行查找,找到后输出对应的value中文。使用这种key二叉搜索树的场景,比如小区车库,只有业主的车能进入,车牌号作为key值,就在系统中检查key是否存在以确定是否为业主的车。从名字就能看出来,二叉搜索树主要用于搜索。

2025-06-05 11:09:00 1157 13

原创 【C++】“多态”特性

(运行时)多态是一个继承体系下的类对象,去调用同一函数,而产生不同的行为。比如,Person类为基类,Student类继承了Person类,Soldier类继承了Person类,那么这三类的对象买票行为就有不同的效果。必须是基类的指针类型或引用类型去调用虚函数。被调用的函数必须是虚函数,并且完成了虚函数的重写(覆盖)。我们依次来说明:要实现多态效果,首先必须是基类的指针或引用去调用,因为只有这样才既能指向基类对象又能指向派生类对象(的基类的切片)。

2025-05-29 17:40:21 919 10

原创 【C++】从零认识C++的“继承”

本文简要介绍了C++的继承机制

2025-05-21 22:28:13 793 13

原创 【Linux系统】开始认识学习Linux:环境搭建

在开源社区和企业的共同推动下,Linux 迅速迭代并衍生出众多发行版(如 Debian、Red Hat、Ubuntu、CentOS),逐渐在服务器、云计算、嵌入式设备和移动终端(Android)等领域占据主导地位。其开源、模块化和高可定制的特性,不仅打破了商业操作系统的垄断,还成为全球协作开发的典范。但凡使用电子设备,就离不开操作系统,比如Windows、MacOS、鸿蒙。然后,修改密码,重置自己的root密码,记住自己的密码。新建会话,主机处填入刚才的公网ip。大功告成,自此,开始我们的Linux之旅。

2025-05-19 17:31:02 383 1

原创 【落羽的落羽 C++】进一步认识模板

因为在预处理阶段,cpp文件的头文件都会展开,相当于调用所在cpp文件里面就有了声明和定义了。就不会发生链接错误。

2025-05-15 22:15:30 870 4

原创 【落羽的落羽 C++】stack和queue、deque、priority_queue、仿函数

我们之前学习的vector和list,以及下面要认识的deque,都属于STL的容器(containers)组件。而stack和queue,属于STL的配置器(或称为配接器)(adapters)组件,或者归类为容器配置器(container adapters),它们可以修饰容器的接口而呈现出全新的容器性质,即stack的“先进后出”和queue的“先进先出”特点。

2025-05-12 23:18:24 1095 12

原创 【落羽的落羽 C++】list及其模拟实现

本文主要介绍了list使用及其模拟实现

2025-05-06 21:38:46 1516 8

原创 【落羽的落羽 C++】vector

本文主要介绍了vector

2025-04-26 19:09:16 753 4

原创 【落羽的落羽 C++】string

本文主要介绍了string类

2025-04-18 09:33:30 869 6

空空如也

空空如也

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

TA关注的人

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