- 博客(121)
- 收藏
- 关注
原创 AVL树解析
这段代码实现了一个AVL树的插入操作及其平衡维护机制。AVL树是一种自平衡二叉搜索树,通过旋转操作保持树的平衡。插入操作首先检查树是否为空,若为空则直接创建根节点。否则,通过遍历树找到合适的插入位置,并插入新节点。插入后,代码通过更新节点的平衡因子来检查树的平衡状态。如果平衡因子超出允许范围(2或-2),则进行相应的旋转操作(左旋、右旋、右左双旋或左右双旋)以恢复平衡。旋转操作调整了树的结构,并更新了相关节点的平衡因子。最终,插入操作返回true表示成功插入,或false表示插入失败(如遇到重复键值)。代码
2025-05-11 22:27:47
478
11
原创 C++ 关联式容器:map,multimap,set,multiset
本文详细介绍了C++标准模板库(STL)中的关联式容器,包括set、map、multiset和multimap。关联式容器通过键值对存储数据,提供了高效的检索功能,底层通常采用红黑树等平衡搜索树实现。set和map分别用于存储唯一元素和键值对,而multiset和multimap则允许重复元素。文章还探讨了这些容器的特性、模板参数、常用接口及使用示例,帮助读者理解其应用场景和底层实现,从而在实际编程中更高效地使用这些容器。
2025-05-10 17:50:54
982
20
原创 C++异常介绍
C语言传统错误处理方式主要包括终止程序(如assert)和返回错误码,前者在严重错误时使用,后者则更为常见,但需要程序员自行查找错误。C++引入了异常处理机制,通过throw抛出异常,try捕获异常,catch处理异常,这种方式相比C语言更为灵活和温和。C++异常处理允许异常的重新抛出,确保异常能在更外层的调用链中处理。异常安全是C++中的一个重要概念,特别是在构造函数和析构函数中,避免抛出异常以防止资源泄漏。C++异常规范通过throw(类型)明确函数可能抛出的异常类型,提高了代码的可读性和安全性。尽管C
2025-05-10 16:37:47
881
22
原创 二分查找习题
本文总结了二叉树相关问题的解题思路与实现方法,主要包括:二叉搜索树转双向链表:利用中序遍历特性,调整指针构建有序双向链表。二叉树转字符串:通过前序遍历,处理空节点并拼接字符串,确保二叉树与字符串的一一映射。二叉树的最近公共祖先:通过递归回溯或路径记录,找到深度最大的公共祖先节点。二叉树前序遍历:使用栈模拟递归,按根-左-右顺序遍历节点。二叉树中序遍历:借助栈实现左-根-右的遍历顺序,确保节点值按序记录。二叉树后序遍历:采用双栈法或单栈标记法,实现左-右-根的遍历顺序。每种方法均结合C++代码
2025-05-07 22:24:51
510
20
原创 二叉搜索树
二叉搜索树是一种特殊的二叉树,它满足以下性质:- 对于树中的每个节点,其左子树中所有节点的值都小于该节点的值。- 对于树中的每个节点,其右子树中所有节点的值都大于该节点的值。基于这些性质,二叉搜索树能够在平均情况下以O(\log n) 的时间复杂度完成查找、插入和删除操作,其中n 是树中节点的数量。代码结构我们来看的这段C++ 代码定义了一个 BSTree 类,用于实现二叉搜索树。
2025-05-05 16:54:35
1195
18
原创 C++ 多态:原理、实现与应用
被 virtual 关键字修饰的类成员函数。cpppublic:std::cout << "买票 - 全价" << std::endl;派生类中定义与基类虚函数返回值类型、函数名字、参数列表完全相同的虚函数。cpppublic:std::cout << "买票 - 半价" << std::endl;1. 通过基类指针或引用调用虚函数:###不可用子类指针或引用调用虚函数(- 使用父类指针或引用可以指向不同的子类对象,通过相同的父类接口来调用不同子类实现的方法,从而体现多态性。
2025-05-04 18:06:18
1318
19
原创 C++ 中的继承
在C++ 编程世界里,继承是一项极为关键的特性,它为代码的复用和层次化设计提供了强大支持。掌握继承机制,对于编写高效、可维护的C++ 代码至关重要。今天,就让我们一起深入探究C++ 中的继承。继承是面向对象程序设计实现代码复用的重要手段。它允许我们在保持原有类特性的基础上进行扩展,产生新的类,即派生类。这体现了面向对象程序设计的层次结构,从简单到复杂逐步构建。
2025-05-03 19:01:19
1004
21
原创 C++模板知识
一个程序(项目)由若干个源文件共同实现,每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件,这种模式就是分离编译模式。1. 模板复用了代码,节省资源,能实现更快的迭代开发,C++的标准模板库(STL)就是基于模板产生的。2. 增强了代码的灵活性,能适应多种数据类型。
2025-05-02 17:16:45
909
11
原创 冯·诺依曼体系:现代计算机的底层逻辑与百年传承
从第一台电子计算机到如今的云计算、人工智能,冯·诺依曼体系始终是计算机科学的根基。它不仅定义了计算机的工作方式,更启发了无数技术创新。理解这一体系,就像掌握了打开现代科技世界的钥匙,让我们得以窥探计算机背后的神秘逻辑。未来无论技术如何演进,冯·诺依曼的智慧都将持续闪耀在计算领域的星河之中。如果你对计算机体系结构感兴趣,不妨尝试编写一段简单的汇编程序,亲自体验指令在冯·诺依曼架构中的运行轨迹,这或许会让你对这一伟大设计有更深的感悟。
2025-05-02 12:08:19
1708
16
原创 优先级队列
cpp// 优先级队列模板类// T: 元素类型// X: 底层存储容器类型,默认使用std::vector// Compare: 比较器类型,默认使用Lessprivate:X _con;// 底层存储容器// 堆调整函数声明public:// 构造函数、插入、删除等成员函数声明void pop();通过模板参数 T 、 X 和 Compare ,我们实现了类型、容器和比较规则的高度可定制化。
2025-04-30 18:29:39
984
26
原创 Linux调试器 - gdb使用指南
debug 模式下,程序保留了丰富的调试信息,包括变量名、函数名、行号等,这使得开发者能够在调试过程中清晰地了解程序的内部状态,方便查找问题。当我们已经仔细检查完程序某个区域的代码,确认该部分代码逻辑无误,想要让程序继续执行下去,以观察后续代码的执行情况时,使用该指令可让程序快速运行,直到遇到下一个断点或程序结束。执行到当前函数返回,然后暂停下来等待后续命令。当我们进入一个函数内部进行调试,在查看完函数内部相关信息后,若想快速回到函数调用的上层继续调试,使用该指令可直接执行到函数返回,无需逐行单步执行。
2025-04-28 22:06:28
1314
28
原创 深入探究C++ 中的stack、queue和deque
C++中 deque 的注意事项及示例:1. 迭代器失效:在 deque 中插入或删除元素后,除了指向被删除元素的迭代器外,其他迭代器可能仍然有效,但可能会导致迭代器重新定位。cpp// 插入元素后,迭代器it仍然有效return 0;1. 容量和内存管理: deque 的内存管理相对复杂,它通过分段连续内存实现。与 vector 相比, deque 在头部插入和删除元素更高效,因为不需要移动大量元素来调整内存。cppi < 10;++i) {
2025-04-28 15:01:16
1244
26
原创 Linux 开发与 Git 入门实践:从进度条小程序到代码托管
2. 在新页面中输入项目名称(注意名称不能重复,系统会自动校验),可选择填写项目描述,设置项目为公开(Public)或私有(Private),还可以选择是否初始化 README 文件等。通过使用 git log 及其相关选项,我们可以方便地回顾项目的开发历史,了解每次代码改动的情况,在排查问题、追溯功能添加等场景中非常有用。- 辅助代码管理:在多人协作时可察觉冲突隐患;3. 在创建好的项目页面中复制项目的链接,链接有 HTTPS 和 SSH 两种形式,可按需复制,以备接下来进行下载。
2025-04-27 16:02:55
1866
21
原创 栈相关算法题解题思路与代码实现分享
通过这两道栈相关的算法题,我们可以看到栈在解决这类数据顺序相关问题时的巧妙应用。在实际解题过程中,关键是要理解栈的特性,并灵活运用辅助栈等技巧来满足题目要求。希望这些分享能对大家在算法学习和面试准备中有所帮助,也欢迎大家一起交流探讨更优的解题思路。
2025-04-26 18:25:02
878
25
原创 深入理解C++ 中的list容器
list 的底层是双向链表结构。每个元素存储在独立的节点中,节点通过指针指向前一个元素和后一个元素 ,并且是带头结点的双向循环链表。这意味着在链表中,头结点可以作为一个哨兵节点,方便进行插入和删除操作,同时循环的特性使得从链表的尾部可以无缝连接到头部。cppT data;list 容器凭借其独特的双向链表结构,在插入和删除操作上具有高效性,适用于需要频繁进行这些操作的场景。
2025-04-25 21:44:47
1278
24
原创 深入探究Linux项目自动化构建工具:make与Makefile
一个大型工程中,源文件数量众多,且依据类型、功能、模块等分布在不同目录。Makefile 的出现,就是为了定义一系列规则,明确哪些文件需先编译、哪些后编译、哪些要重新编译,甚至执行更复杂的操作。make 则是一个命令工具,专门解释 Makefile 中设定的指令。常见的IDE,如Delphi的 make 、Visual C++的 nmake 、Linux下GNU的 make ,都支持这一编译方式。二者配合,实现项目自动化构建,极大提升软件开发效率。
2025-04-23 22:45:27
980
27
原创 刷题之路:C++ 解题分享与技术总结
通过这段时间的刷题,我不仅对 C++ 的语法和特性更加熟悉,也掌握了不少算法解题技巧,比如双指针法、排序法、位运算等。在解题过程中,对问题进行深入分析,找到合适的算法思路是关键,同时也要注意代码的时间复杂度和空间复杂度,以满足题目要求。刷题是一个长期积累的过程,后续我还会继续分享更多的解题经验和技术总结,希望能对大家有所帮助。希望这篇博客对你有所帮助,欢迎在评论区交流讨论!
2025-04-22 19:59:00
765
22
原创 C++ vector 核心功能解析与实现
我们实现的 vector 类模板主要包含以下几个关键部分:1. 数据成员:用于管理动态数组的内存和元素范围。2. 赋值运算符重载:实现对象之间的赋值操作。3. 下标运算符重载:支持通过 [] 访问元素。4. 内存管理函数: reserve 和 resize 用于控制动态数组的容量和大小。5. 元素访问函数: front 和 back 用于获取容器的首元素和尾元素。
2025-04-21 16:34:32
1173
26
原创 深入理解C++ 中的vector容器
vector 是表示可变大小数组的序列容器。它采用连续存储空间来存储元素,这使得我们可以像操作数组一样,通过下标高效地访问元素。与普通数组不同的是, vector 的大小能够动态改变,容器会自动处理内存管理相关事宜。从本质上讲, vector 使用动态分配数组来存储元素。当新元素插入时,如果当前空间不足,它会分配一个新的数组,并将全部元素迁移到新数组中。虽然这个过程相对耗时,但 vector 并非每次插入新元素都进行这样的操作,以平衡效率。
2025-04-19 16:04:07
1139
20
原创 深入理解C++中string的深浅拷贝
为了更深入理解深浅拷贝的原理,我们手动实现一个简单的字符串类 MyString ,并分别展示浅拷贝和深拷贝的实现方式。
2025-04-18 16:03:55
934
17
原创 深入探究Linux编译器gcc/g++:从基础到进阶
连接阶段是将多个目标文件以及所需的库文件组合在一起,生成最终的可执行文件或库文件。通过 gcc hello.o -o hello ,这里的 -o 选项指定输出文件名,执行该命令后,就得到了可以运行的 hello 程序。
2025-04-16 21:56:35
926
16
原创 详解LeetCode中用字符串实现整数相加,字符串转整数及其溢出处理详解
cpp循环结束后,有可能还存在进位(即 next 为1),此时需要在结果字符串 retstr 的末尾添加字符 '1' ,以表示最高位的进位。给定一个字符串,将其转换为对应的整数。同时需要处理字符串开头的空格、正负号,并且在转换过程中要考虑整数溢出的情况。上述代码通过定义 Solution 类中的 strToInt 函数实现了该功能,下面我们逐行分析代码的具体实现。这段代码通过从字符串末尾逐位相加、处理进位以及结果反转的方式,巧妙地实现了两个字符串形式非负整数的相加。
2025-04-15 23:32:47
993
17
原创 深入剖析C++中 String 类的模拟实现
cpp定义了普通迭代器和常量迭代器类型,方便对字符串进行遍历操作。通过以上一系列的实现,我们构建了一个功能相对丰富的 String 类模拟版本。从基本的对象生命周期管理(构造、析构),到关键的拷贝与赋值操作,再到多样化的字符串操作以及简单的迭代器支持,每一个部分都精心设计,确保正确性和高效性。理解这些底层实现原理,不仅能让我们更好地使用标准库中的 string 类,还能在面对复杂字符串处理需求时,具备更强的代码设计和优化能力。
2025-04-14 21:32:02
1163
14
原创 C++中string库常用函数超详细解析与深度实践
C++ string 库的函数体系覆盖了字符串处理的全生命周期,从基础创建、拼接、查找,到复杂的替换、性能优化,每个函数都有其独特的应用场景。开发者在使用时需注意边界条件、内存管理和迭代器有效性等问题,结合实际需求灵活运用,才能发挥 string 类的最大效能。通过不断实践和总结,能够更高效地处理文本数据,提升C++程序的稳定性与性能。
2025-04-14 15:43:53
1190
15
原创 C++中 string 类及迭代器相关知识详解
cpp// 定义一个空字符串// 使用字符串字面量初始化return 0;在上述代码中,我们定义了一个空字符串 s0 和一个初始化为"hello world"的字符串 s1 ,并将 s1 输出到控制台。
2025-04-13 23:49:54
1398
16
原创 深入探索Linux开发工具:Vim与Yum
Vim和Yum在Linux开发工作流中扮演着重要角色。熟练掌握Vim的各种操作和配置技巧,能让代码编辑变得高效流畅;而灵活运用Yum进行软件的安装、卸载和管理,可轻松构建和维护开发环境。希望通过这篇博客,能帮助大家更好地驾驭这两款工具,在Linux开发之路上更进一步。
2025-04-13 13:47:52
1102
13
原创 深入探索C++ STL:从基础到进阶
STL(standard template library - 标准模板库)是C++ 标准库的重要组成部分。它就像是一个工具箱,里面装满了各种数据结构(如vector、list、map等)和算法(如sort、find等)。以下是一个简单使用 vector 容器的示例代码:cpp// 创建一个vector容器,用于存储int类型的数据// 向容器中添加元素// 遍历容器并输出元素++i) {return 0;难点剖析这里涉及到模板的概念,模板使得STL能够适应不同的数据类型。
2025-04-12 14:45:51
1126
14
原创 C++模板初阶:从概念到实践
要点格式为 template<class T1, class T2, ……, class Tn> ,class 类模板名 { // 类内成员定义 }。类模板中函数在类外定义时,需加模板参数列表。易错点类外定义函数忘记加模板参数列表;定义类模板时语法错误。代码示例cpp// 动态顺序表类模板public:, _size(0)~Vector();// 类模板中函数在类外定义,需加模板参数列表。
2025-04-12 01:02:36
734
17
原创 C/C++内存管理:从基础到进阶
对于自定义类型(如类), new 会调用构造函数, delete 会调用析构函数。// 仅分配内存,未调用构造函数// 分配内存并调用构造函数free(p1);// 未调用析构函数delete p2;// 调用析构函数并释放内存return 0;要点:使用 new 和 delete 时要注意配对使用,申请和释放单个元素用 new 和 delete ,申请和释放数组用 new[] 和 delete[]
2025-04-10 20:14:03
1172
15
原创 Linux权限管理:从入门到实践
Linux权限管理看似复杂,但只要理解用户类型、文件访问者分类、文件类型和权限设置方法等核心要点,就能灵活运用。在实际操作中,要注意权限设置的合理性,避免因权限设置不当导致安全问题或操作受限。尤其是涉及系统关键文件和目录时,更要谨慎操作,必要时做好备份,确保系统稳定和数据安全。希望通过本文,大家能对Linux权限管理有更深入的认识,在日常使用和工作中能更好地管理系统资源。
2025-04-09 20:05:32
1024
15
原创 C++类与对象进阶知识深度解析
友元关系是单向的,不具有交换性。比如上述 Time 类和 Date 类,在 Time 类中声明 Date 类为其友元类,那么可以在 Date 类中直接访问 Time 类的私有成员变量,但想在 Time 类中访问 Date 类中私有的成员变量则不行。因为对于自定义类型成员变量,即使在构造函数体中赋值,编译器也会先使用默认构造函数初始化,再进行赋值操作,而初始化列表可以直接调用合适的构造函数初始化。友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明。
2025-04-08 23:12:33
1198
23
原创 C++ 中日期类的输入输出操作符重载实践
通过重载输入输出操作符,我们让自定义的 Date 类在输入输出操作上具有和内置类型相似的便利性。在实际项目中,这种操作符重载的技巧可以应用到各种自定义数据类型上,极大地提高代码的可读性和易用性。同时,在实现过程中要注意错误处理和代码的健壮性,以便在不同的输入情况下都能正确运行。
2025-04-07 21:06:05
1257
15
原创 深入探究C++ 运算符重载:以日期类为例
在C++ 编程中,运算符重载是一项强大且实用的特性,它允许我们赋予运算符在自定义类上的新含义,极大地增强了代码的可读性和易用性。今天,我们就以日期类( Date )为例,深入探讨运算符重载的相关知识。cpppublic:// 获取某年某月的天数day += 1;return day;// 全缺省的构造函数// 拷贝构造函数// 赋值运算符重载if (this!= &d) {// 析构函数~Date() {}
2025-04-06 12:47:22
1371
20
原创 Linux常用命令详解:从基础到进阶
Linux系统中的这些常用命令,从文件处理到系统管理,从时间操作到其他实用功能,构成了我们日常操作和管理系统的基础。熟练掌握它们,能让我们在Linux系统的使用中更加得心应手,无论是进行开发工作、系统运维还是学习研究,都能事半功倍。不断实践和积累对这些命令的使用经验,将有助于我们在Linux领域不断进阶。
2025-04-05 14:25:37
1709
15
原创 C++类的特殊成员函数:构造、拷贝构造与析构函数详解
在C++ 编程中,类的特殊成员函数扮演着至关重要的角色,它们负责对象的创建、复制以及销毁过程。本文将深入探讨构造函数、拷贝构造函数和析构函数的概念、特性及应用场景,并结合代码示例进行详细说明。 1. 概念构造函数是一个特殊的成员函数,名字与类名相同。在创建类类型对象时由编译器自动调用,主要任务是初始化对象的数据成员,确保每个数据成员都有一个合适的初始值,并且在对象的整个生命周期内只调用一次。 2. 特性 - 函数名与类名相同:这是构造函数的显著特征,通过函数名就能明确它所属的类。 - 无返
2025-04-04 14:24:11
1524
17
原创 深入剖析Linux常用命令,助力高效操作
在Linux系统的世界里,命令行是我们与系统交互的强大武器。熟练掌握一些常用命令,能极大提升我们的工作效率。今天,就带大家深入了解几个实用的Linux命令。
2025-04-02 21:05:09
1233
19
原创 C++类与对象(上):从入门到实践
cpppublic:// 公有成员函数和变量,在类外可以直接访问protected:// 保护成员函数和变量,类及其派生类可以访问private:// 私有成员函数和变量,仅在类内部可以访问需要注意的是,类定义结束时后面的分号不能省略。在类体中,包含的内容称为类的成员:其中的变量称为类的属性或成员变量;其中的函数称为类的方法或成员函数。类有两种常见的定义方式:1. 声明和定义全部放在类体中:将成员函数的声明和定义都写在类体内部。cpppublic:// 初始化日期函数。
2025-04-02 01:36:42
1343
20
原创 Linux基础命令:开启系统操作之旅
在Linux的世界里,命令行是我们与系统交互的重要方式。掌握基础命令,就如同拥有了一把开启系统宝库的钥匙。本文将详细介绍一些常用的Linux基础命令,帮助大家快速上手Linux操作。这些Linux基础命令是日常操作中频繁使用的工具。ls 帮我们查看文件和目录内容, pwd 定位当前位置, cd 在目录间穿梭, touch 管理文件时间和新建文件, mkdir 创建目录, rmdir 和 rm 负责清理不再需要的目录和文件。
2025-03-31 17:23:22
1970
17
原创 从0到1,一文读懂Linux的发展历史
Linux,这个如今在全球范围内广泛应用的开源操作系统,其发展历程堪称一部充满创新与协作的传奇史诗。从一位大学生的个人项目起步,Linux逐步成长为影响深远的开源操作系统,对整个计算机行业产生了深远的影响。今天,让我们一同回顾Linux的发展历程,探寻它是如何从一个业余爱好项目,发展成为全球开源社区的代表性成就。
2025-03-30 17:41:05
1597
19
原创 侯捷 C++ 课程学习笔记:C++ 中引用与指针的深度剖析
定义时必须初始化,因为它是变量的别名,初始化后就不能再引用其他实体。例如 int& ra;这样的定义是错误的,必须写成 int a = 10;。定义时不要求必须初始化,可以先定义 int* pa;,后续再让它指向合适的变量,如 pa = &a;,并且指针可以在不同时刻指向不同的同类型实体。引用和指针在 C++ 中各有特点和用途。引用语法简洁、使用安全,常用于避免拷贝和作为函数参数、返回值来提高性能;
2025-03-29 19:35:30
1234
21
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人