- 博客(47)
- 收藏
- 关注
原创 【C++】从 I0 库到缓冲区,一篇吃透输入输出
一个常见的lO流错误是cin>>i,i是一个int类型的对象,如果我们在控制台输入一个字符,cin对象的failbit状态位就会被设置,cin就进入错误状态,一个流一旦发生错误,后续的IO操作都会失败,我们可以调用cin.clear()函数来恢复cin的状态为goodbit。failbit表示一个逻辑错误,如期望读取一个整形,但是却读取到一个字符,failbit被设置了,流是可以恢复的,恢复以后可以继续使用。如果想再次读取当前文件,可以恢复一下流的状态,同时重置一个文件指针位置。类型的对象,用于保存数据。
2025-12-08 15:15:19
1052
21
原创 【C++】——异常
有时catch到⼀个异常对象后,需要对错误进行分类,其中的某种异常错误需要进行特殊的处理,其他错误则重新抛出异常给外层调用链处理。throw 表达式先构造一次局部对象,再拷贝(或移动)到编译器管理的“异常对象”区,catch 里拿到的引用指向的是这份拷贝。抛一只“猫”,只有形参是“猫”或“动物”的 catch 能接得住;形参是“狗”或“int”就接不住,继续往调用栈的上一层跳。“类型匹配 + 最先遇到”原则,和函数重载一样,只允许标准转换(派生→基、数组→指针、函数→函数指针),不允许算术转型。
2025-12-01 09:36:01
771
15
原创 【C++】C++11智能指针的使用及其原理
早年的 C++ 教材把 new/delete 写在第一章,结果 80% 的崩溃 dump 追溯到“野指针”“重复释放”“忘记释放”。资源管理本质是生命期管理,而生命期管理应该交给对象,而不是程序员的手指。智能指针就是把“资源 = 对象”这一 RAII 思想落地的官方工具箱。
2025-12-01 09:35:52
895
12
原创 【C++】C++11 核心特性深度解析(三)
capture-list] : 捕捉列表,该列表总是出现在 lambda 函数的开始位置,编译器根据[]来判断接下来的代码是否为 lambda 函数,捕捉列表能够捕捉上下文中的变量供 lambda 函数使用,捕捉列表可以传值和传引用捕捉,捕捉列表为空也不能省略。这两个我们前面已经进行了非常详细的讲解,其他的大家了解⼀下即可。{function boby} :函数体,函数体内的实现跟普通函数完全类似,在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量,函数体为空也不能省略。
2025-11-26 15:43:15
573
9
原创 【C++】C++11 核心特性深度解析(一)
C++11 是 C++ 的第二个主要版本,并且是从 C++98 起的最重要更新。C++98的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,C++11之后我们之前学习的引用就叫做左值引用。move是库里面的⼀个函数模板,本质内部是进行强制类型转换,当然他还涉及⼀些引用折叠的知识,这个我们后面会细讲。这就是C++11的解析(一)。——让编译器直接把局部对象建在调用方内存里,函数结束即搬家,零拷贝还合法,这才算根治。返回值直接甩出原来的那块内存,谁用谁拿,同样零拷贝,顺便让你接着改。
2025-11-26 15:42:38
1120
14
原创 从零开始的指针(5)
这里教大家一个区分含 “指针”“数组” 名称的类型的小技巧:只需看名称最后的名词,若是 “指针”,那就是指针,前面的内容说明该指针指向的对象;当我们将一个函数的指针(地址)作为参数传递给另一个函数,且这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数。那我们可以直接让两个数作差,大于的话作差之后返回的是大于0的数,等于作差返回0,小于的话作差返回的数小于0的数。这里我们思路和之前差不多,但是我们创建了一个函数指针数组,为了函数指针数组的下标与菜单函数的数字对其,我们在数组前加入NULL。
2025-09-19 11:32:29
1062
原创 从零开始的指针(4)
本文主要讲解了C/C++中指针的两个重要概念:字符指针和函数指针。对于字符指针,重点分析了数组初始化和指针指向常量字符串在内存分配上的区别,以及栈、堆、常量区等不同内存区域的特点。对于函数指针,详细说明了如何定义和使用函数指针变量,并通过实例演示了函数指针的调用方式。此外,文章还介绍了typedef关键字在简化复杂类型声明(特别是函数指针类型)中的应用,并与#define宏定义进行了对比,强调了typedef在处理类型时的优势。这些内容对于深入理解C/C++中的指针机制和内存管理具有重要意义。
2025-09-14 18:03:04
919
原创 从零开始的指针(3)
在 C 语言中,我们可以通过 的方式获取数组第一个元素的地址。但实际上,数组名本身就代表着地址,更确切地说,它表示的是数组首元素的地址。我们通过一个简单的程序来验证这一点:程序的输出结果显示, 和 打印出的地址值完全相同。这一结果证实了:在 C 语言中,数组名本质上就是数组首元素的地址。这种特性使得我们在使用指针操作数组时更加便捷,比如可以直接用 来初始化指向数组首元素的指针,而不必显式地写成 。既然数组名代表数组首元素的地址,那该如何理解下面这段代码的输出呢?这段代码的输出结果是 。如果
2025-09-13 19:41:04
742
原创 从零开始的指针(2)
调用方式适用场景是否需要指针核心特点传值调用函数仅需 “使用” 主调函数的变量值(如计算求和)不需要形参是实参的 “拷贝”,修改形参不影响实参传址调用函数需要 “修改” 主调函数的变量值(如交换、更新)必须需要指针接收地址,通过解引用直接操作目标内存动态内存分配(malloc分配的内存,必须用指针管理);处理字符串(C 语言没有字符串类型,靠指针指向字符数组首地址来操作);函数返回多个值(通过指针参数间接传出多个结果,避免仅靠return只能返回一个值的限制)。
2025-09-13 10:36:40
701
原创 从零开始的指针(1)
酒店为了方便管理分成很多个房间,同样内存也是一样的分为一个个的内存单元,每个内存单元大小取一个字节(一个字节=八个bit(比特位)=(八个二进制数字的大小))。所以32位机器可以产生2的32次方个二进制序列,64位机器可以产生2的64次方个二进制序列,每个。const放在左边限制的是指针对象(不能修改),const放在右边限制的是指针指向的对象。计算的是整个数组所占用的内存大小(单位:字节),而不是首元素地址的大小。表示的是整个数组的地址,其类型为「指向整个数组的指针」(如。这个过程是怎样的实现的呢?
2025-09-10 10:46:41
1058
31
原创 深入解析Linux软件包管理:apt/yum源配置与Vim编辑器高效使用指南
在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序。但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装。软件包和软件包管理器,就好比"App"和"应用商店"这样的关系.yum(Yellow dogUpdater,Modified)是Linux下非常常用的一种包管理器。主要应用在Fedora,RedHat, Centos等发行版上。
2025-04-15 10:03:16
1347
46
原创 从 0 到 1,吃透 Linux 权限管理的底层逻辑
严格来说,Linux 是一个操作系统,其核心部分被称为 “kernel”。然而,普通用户无法直接使用 kernel,而是需要借助 kernel 的 “外壳” 程序 ——shell,来与 kernel 进行交互。从技术角度来看,Shell 的最简定义是命令行解释器(command Interpreter)。它主要承担两项关键任务:一方面,另一方面,为了更好地理解这一过程,可以将其与 Windows 系统进行对比。
2025-03-27 14:45:50
1801
45
原创 【Linux终端探幽】—基础指令集(下):魔法终章
打包,在计算机领域中,指的是将多个文件或目录进行合并,整合为一个单一的集合体的操作过程。压缩,则是运用特定算法,对数据进行重新编码,以减少其存储空间占用量的技术手段。
2025-03-24 08:32:53
1101
52
原创 【Linux终端探幽】—基础指令集(中):迷宫寻宝
在 more 的时候,我们并没有办法向前面翻, 只能往后面看 但若使用了 less 时,就可以使用 [pageup][pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!当我们使用cat指令想要获取一个文件当中的内容时,如果我们不指定文件,则默认到键盘文件当中获取(读取)内容,如果我们使用(<)输入重定向,那我们则在指定文件当中获取(读取)内容!当我们重定向的文件存在时,如果文件中原来有内容,重定向后,原来的内容就会被我们写入的内容覆盖!如果我们什么都不写入,则会清空文件!
2025-03-16 12:59:48
1386
50
原创 【Linux终端探幽】—基础指令集(上):暗室点灯
不过,需要留意的是,众多文件系统(尤其是在挂载时采用了 noatime 或 relatime 选项的文件系统),出于减少磁盘写入操作以提升性能的考量,可能会对 atime 的更新进行优化处理,甚至忽略 atime 的更新。在 Windows 操作系统里,我们习惯表述为 “打开某某文件 / 文件夹”,而在 Linux 系统语境下频繁提及的 “目录”,从功能和概念层面而言,它与 Windows 系统中的文件夹高度相似,二者均用于组织和管理文件,为文件提供了一种层级化的存储结构。值得说明的是:文件=内容+属性。
2025-03-01 13:17:08
1440
50
原创 【C++】——精细化哈希表架构:理论与实践的综合分析
先找出你的能力在哪里,然后再决定你是谁。—— 塔拉·韦斯特弗 《你当像鸟飞往你的山》
2024-12-06 13:09:20
5970
72
原创 【C++】—— 从零开始封装 Map 与 Set:实现与优化
人生的态度是,抱最大的希望,尽最大的努力,做最坏的打算。—— 柏拉图 《理想国》目录1、理论基石——深度剖析 BSTree、AVLTree 与 RBTree 的概念区别2、迭代器机制——RBTree 迭代器的架构与工程实现3、高级容器设计——Map 与 Set 的模块化封装3.1 泛型支持增强——RBTree 模板参数设计优化3.2 Set 容器构建——面向集合操作的优化设计 3.3 Map 容器构建——高效键值存储的封装实现Thanks谢谢阅读!!!为了实现 Map 和 Set 的封装,我们首先进行了充分
2024-12-03 14:46:52
3145
63
原创 揭秘 AIGC 背后的技术:GPT、BERT 与 Transformer 模型的工作原理
本文将深入探讨 AIGC 背后的核心技术——Transformer、GPT 和 BERT,带你一步步了解它们的架构原理、训练机制及实际应用。我们将从 AIGC 的基础概念开始,逐步深入到每个关键模型的技术细节,最后展望这些技术未来可能带来的变革。AIGC,即人工智能生成内容,指的是通过人工智能技术自动化地生成文本、图像、音频或视频内容。它依赖于先进的机器学习模型,特别是在自然语言处理和计算机视觉领域的突破。内容创作:无论是新闻写作、博客生成,还是小说创作,AIGC 都能够根据给定的提示生成高质量的文本。
2024-11-25 09:16:16
8542
79
原创 【C++】—— map 与 set 深入浅出:设计原理与应用对比
之前的学习之中 , 我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为。
2024-11-15 15:13:42
2233
90
原创 【C++】——高效构建与优化二叉搜索树
二叉搜索树又称二叉排序树(BST),它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。
2024-10-31 10:45:40
2745
112
原创 给机器装上“脑子”—— 一文带你玩转机器学习
机器学习是一门研究算法和统计模型的学科,其目标是让计算机系统从数据中提取规律或“经验”,以提高完成特定任务的效率。机器学习的核心在于“自动化的学习过程”,与传统编程不同:传统编程要求开发者明确指令,而机器学习系统则依靠数据驱动,通过算法“自我学习”来做出预测、分类或决策。
2024-10-28 15:11:29
3130
74
原创 【C++】——Stack 与 Queue:抽象数据类型的魅力展现
在 CCC 语言中已经对栈和队列有了一定的了解,同时 CCC ++中我们对 模板中的 等容器进行了详细的探讨,从而获得了对这些容器操作的清晰理解。基于这些知识,现在转向学习 CCC ++ 里的 (栈) 和 (队列)就显得相对简单了。接下来我们在解题中体会 与 的使用方法有效的括号队列实现栈栈实现队列二叉树的层序遍历设计循环队列最小栈栈的压入、弹出序列逆波兰表达式求值
2024-10-25 10:18:55
740
81
原创 解密——二进制的奥秘
8进制的数字每⼀位是0~7的,0~7的数字,各自写成2进制,最多有3个2进制位就足够了,比如7的2进制是111,所以在2进制转8进制数的时候,
2024-10-16 00:00:00
1701
83
原创 【C++】——list 容器的解析与极致实现
人的一切痛苦,本质上都是对自己的无能的愤怒。—— 王小波是C++(STL)中的一个成员,其。不同于连续的、紧密排列的数组容器,List容器的内部是由双向链表构成的,使得它在插入和删除操作上,就如同行云流水一般顺畅,不需移动其它元素。环状链表的尾是一个空节点,符合“左闭右开”区间。需要频繁进行插入和删除操作的场合。更多地需要随机访问元素。
2024-10-15 12:13:07
3831
91
原创 【C++】——vector深度剖析&&模拟实现
这个是对迭代器区间进行的构造函数,思路很简单,把迭代器区间的数据依次尾插就可以了(这里之所以另外使用一个新的模版,而不是使用vector类的模版,是为了兼容其他容器类型)。<2> 如果拷贝的是内置类型的元素,memcpy既高效又不会出错,但如果拷贝的是自定义类型元素,并且自定义类型元素中涉及到资源管理时,就会出错,根据我们刚才所查看的源码,我们要使用三个迭代器,要使用迭代器,我们可以使用指针进行模拟。经过typedef的底层指针,而T类型是模版类的参数。值得注意的是STL里的 insert有返回值!
2024-09-26 18:36:06
1494
84
原创 【C++】——解析vector
将进行对vector的解析,先简单的理解一下初步功能。(大部分与string相似)使用STL的三个境界:能用,明理,能扩展 ,那么下面的vector,也是按照这个方法去学习。1.1认识vectorvector文档介绍<1>vector是表示数组的序列容器,其大小可以动态变化。<2>与数组一样,vector使用连续的存储空间来存储元素,也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是,与数组不同的是,vector的大小可以动态变化,存储空间将由容器自动管理。
2024-09-23 17:51:37
1594
109
原创 【C++】——多态详解
多态是面向对象技术(OOP)的核心思想之一,我们称具有继承关系的多个类型称为多态类型,通俗来讲:就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。多态分为编译时多态(静态多态)和运行时多态(动态多态),编译时多态(静态多态)主要就是函数重载和函数模板,他们传不同类型的参数就可以调用不同的函数,通过参数不同达到多种形态,之所以叫编译时多态,是因为他们实参传给形参的参数匹配是在编译时完成的,通常我们把编译时一般归为静态,运行时归为动态。运行时多态,
2024-09-20 10:43:44
2053
84
原创 【C++】——继承详解
这就是继承的语法格式继承方式与访问限定符号一样有着三种,不同的继承方式与不同的类成员组合会是不同的情况总结一下规律:<1>基类 private 成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。将年龄变为私有验证一下是否继承到了派生类对象可以看到继承下来了但是不可以访问!!<2>如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为 protected。
2024-09-17 15:41:06
2042
87
原创 【C++】——string的模拟实现
在这里即一个一个字节的拷贝,动态申请资源时候如果浅拷贝会指向同一块资源,会有着程序崩溃的问题同一块空间析构了两次 程序崩溃深拷贝即调用拷贝构造,编译器生成的拷贝构造是浅拷贝,需要我们自己显示实现拷贝构造来进行深拷贝。
2024-09-13 17:44:05
1451
89
原创 【数据结构】——链式二叉树
1>二叉树的结构体 包含了数据和指向左右子树的指针}BTNode;<2>二叉树结点的创建<3>二叉树的创建Tip:二叉树是递归定义的,都可以单独看作 根、左子树、右子树。
2024-08-02 17:06:55
2081
49
原创 【数据结构】——堆的实现与算法
对比向上调整建堆,h-1层向下调整只需要移动1层,而向上调整需要移动h-1次因此向下调整是更优的建堆算法。插入一个数据后不再是小堆需要将新数据调整到合适的位置,所以堆的插入就是在数组插入数据再向上调整即可。剩下数据与堆顶数据比较,如果比堆顶数据大,那么替代堆顶进堆(覆盖堆顶数据然后向下调整)堆插入的过程其实就是建堆,在一个堆的末尾插入数据然后向上调整形成一个新的堆。Top—K问题:N个数中求最大的(最小的)前K个数据,一般N远大于K。<2>数据比堆顶数据大,覆盖调整之后形成一个新的小堆,再次比较。
2024-07-31 16:05:23
1957
48
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅