- 博客(59)
- 收藏
- 关注
原创 【C++】unordered_map和unordered_set的使用
• unordered_set的声明如下,Key就是unordered_set底层关键字的类型• unordered_set默认要求Key支持转换为整形,如果不支持或者想按自己的需求走可以自行实现支持将Key转成整形的仿函数传给第二个模板参数默认要求Key支持比较相等,如果不支持或者想按自己的需求走可以自行实现支持将Key比较相等的仿函数传给第三个模板参数• unordered_set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第四个参数。•。
2025-11-23 22:41:41
561
3
原创 【C++】哈希表实现
哈希(hash)⼜称散列,是⼀种组织数据的⽅式。从译名来看,有散乱排列的意思。本质就是通过哈希 函数把关键字Key跟存储位置建⽴⼀个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进 ⾏快速查找。
2025-11-23 22:40:51
1184
2
原创 【Linux】基础开发工具(2):vim补充说明&&gcc/g++编译器
vim 是 Linux 中强大的文本编辑器,需通过配置(如.vimrc文件)才能充分发挥其功能。
2025-11-22 22:18:07
995
1
原创 【Linux】基础开发工具(1):软件包管理器&&vim编辑器
• 在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序。• 但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装。• 软件包和软件包管理器,就好比"App"和"应用商店"这样的关系。• yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器。
2025-11-20 20:05:43
1233
7
原创 【C++】封装红黑树实现mymap和myset
尤其是set,两个模板参数是一样的,这是很多同学这时的一个疑问。• 如果当前结点是父亲的右,根据中序左子树->根结点->右子树,当前当前结点所在的子树访问完了,当前结点所在父亲的子树也访问完了,那么下一个访问的需要继续往根的祖先中去找,直到找到孩子是父亲左的那个祖先就是中序要访问的下一个结点。如下图:当it指向50时,++it时,50是40的右,40是30的右,30是18的右,18到根没有父亲,没有找到孩子是父亲左的那个祖先,这时父亲为空了,那我们就把it中的结点指针置为nullptr,我们。
2025-11-19 21:09:16
1092
6
原创 【C++】红黑树:使用及实现
将c的父亲节点和兄弟节点都变成黑色,爷爷节点(g)变成红色,我们发现上图中红色圈的子树实现了暂时的平衡,但是p节点上面的节点颜色又相悖,所以我们需要继续调整变色,将现在的g姐弟啊设为c节点,它的父节点为p,父节点的兄弟节点为u,父节点的父节点为g。c为红,p为红,g为黑,u不存在或者u存在且为黑,u不存在,则c一定是新增结点,u存在且为黑,则c一定不是新增,c之前是黑色的,是在c的子树中插入,符合情况1,变色将c从黑色变成红色,更新上来的。当我们在节点28的左子树插入时,只能插入红色,这个时候就需要变色。
2025-11-16 22:41:51
1347
17
原创 【C++】AVL树:详细使用及旋转
• 旋转核心步骤,因为10 < b子树的值 < 15,将b变成10的右子树,10变成15的左子树,15变成这棵树新的根,符合搜索树的规则,控制了平衡,同时这棵树的高度恢复到了插入之前的h+2,符合旋转原则。0不是更好的平衡吗?• 场景1:h >= 1时,新增结点插入在e子树,e子树高度从h-1变为h并不断更新12->15->10平衡因子,引发旋转,其中12的平衡因子为-1,旋转后10和12平衡因子为0,15平衡因子为1。,符合搜索树的规则,控制了平衡,同时这棵的高度恢复到了插入之前的h+2,符合旋转原则。
2025-11-15 22:43:52
1322
16
原创 【C++】map和set的使用
set 的声明如下,其中T代表 set 底层存储的关键字类型。set 默认要求类型T支持小于()比较操作。若T不支持该操作,或需要自定义比较规则,可自行实现仿函数,并将其作为第二个模板参数传入。set 底层存储数据的内存,默认通过 STL 提供的空间配置器申请。若有特殊需求,也可自行实现内存池,将其作为第三个模板参数传入。一般情况下,无需手动指定后两个模板参数,使用 set 的默认配置即可满足需求。set 底层基于红黑树实现,其增、删、查操作的时间复杂度均为O(logN)。
2025-11-14 23:00:23
797
14
原创 【C++】二叉搜索树
基于key/value的搜索场景,实现的二叉搜索树支持修改操作,但仅能修改value,不能修改key。修改key会破坏二叉搜索树的性质。- 若单词不存在,说明是首次出现,在树中新增结点,存储key(该单词)和value(次数1)。2删除根节点:如上图是一种特殊情况(1),当使用替换法删除的时候,发现根节点的右子树的左孩子根本不存在,如果不额外列出这种情况,就会报错。如果是最优的情况,那么搜索二叉树的时间复杂度为log(N),但是如果像上述右图一样,那么时间复杂度是O(N),但是时间复杂度一般考虑最差情况。
2025-11-13 22:12:05
921
10
原创 【C++】多态(2):纯虚函数&&多态底层原理
多态分为:静态多态和动态多态。静态多态时编译时确定的多态,是一个同名函数的调用表现出多种形态(例如同一个swap,传不同的参数就调用不同的函数)动态多态是用一个基类的指针,指向不同的对象(基类对象或派生类对象),指向谁就调用谁的虚函数(前提是需要完成虚函数重写),底层是依靠对象让它存在虚函数表中(基类里存的是基类的,派生类里存的是派生类重写的虚函数),运行时指向谁,就到谁的虚函数表里找到对应的虚函数进行调用。
2025-11-12 20:45:48
840
12
原创 【C++】多态(1):多态定义&&实现及虚函数的重写
多态是指在继承关系下,不同的类对象调用同一函数时,产生不同行为的现象。例如,Student 类继承自 Person 类,Person 对象调用 “买票” 函数执行全价逻辑,而 Student 对象调用同名的 “买票” 函数则执行优惠逻辑。
2025-11-09 21:57:05
1826
11
原创 【python】基础案例分析
我们约定每个属性的范围为 [1, 10], 并且总和不能超过 20. 如果玩家输入的初始属性不合理, 就提示输入有误, 重新输入.更多的逻辑, 此处就不再实现了. 大家可以按照类似的方式, 设计更多的事件, 完成 青年, 壮年, 老年 的相关 逻辑.老年阶段体质, 颜值, 智力都会显著退化, 并且随着年龄的上升, 疾病/死亡的风险逐渐升高.针对每一年, 先掷一次 [1, 3] 的色子, 根据不同的随机数值, 来触发不同的事件.再扔一次色子, 生成 [1, 3] 的随机数, 用来表示每一种细分情况.
2025-11-08 22:31:19
910
4
原创 【Linux】权限(2):文件权限的深入理解&&粘滞位
• 可执行权限:如果目录没有可执行权限,则无法cd到目录中.• 可读权限:如果目录没有可读权限,则无法用ls等命令查看目录中的文件内容.• 可写权限:如果目录没有可写权限,则无法在目录中创建文件,也无法在目录中删除文件.1)目录的可执行权限是表示你可否在目录下执行命令;(2)如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd进入目,即使目录仍然有-r读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件);
2025-11-07 21:46:19
1208
10
原创 【C++】继承(2):继承与友元,静态成员,多继承&&黑/白盒复用
通过继承实现的复用,派生类可以直接访问基类的内部成员(如 protected 成员),相当于 “打开盒子” 看到并使用内部实现。
2025-11-04 22:08:50
1102
20
原创 【C++】继承(1):深入理解和使用
继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复用,继承是类设计层次的复⽤。继承的本质是类层次的复用下⾯我们看到Person是基类,也称作⽗类。Student是派⽣类,也称作⼦类。(因为翻译的原因,所以既叫基类/派⽣类,也叫⽗类/⼦类)
2025-11-02 23:02:19
1088
15
原创 【Linux】基础指令(4):基础指令&&热键&&shell运行原理
查看一个文件的更详细内容打包/解包,不打开它,直接看内容2 常用选项• -c :建立⼀个压缩文件的参数指令(create的意思);• -x :解开⼀个压缩文件的参数指令!• -t :查看tarfile里面的文件!• -z :是否同时具有gzip的属性?亦即是否需要用gzip压缩?• -j :是否同时具有bzip2的属性?亦即是否需要用bzip2压缩?• -v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!• -f :使用档名,请留意,在f之后要立即接档名喔!
2025-11-02 11:13:00
1138
18
原创 【Linux】基础指令(3):理解linux常见指令和打包压缩
类似于Linux的记事本按行向下翻查(Enter回车向下翻)——不会刷屏。支持向上,向下翻及搜索• less⼯具也是对⽂件或其它输出进⾏分⻚显⽰的⼯具,应该说是linux正统查看⽂件内容的⼯具,功能极其强⼤• less的⽤法⽐起more更加的有弹性,在more的时候,我们并没有办法向前⾯翻,只能往后⾯看• 但若使⽤了less时,就可以使⽤ [pageup] [pagedown] 等按键的功能来往前往后翻看⽂件,更容易⽤来查看⼀个⽂件的内容。
2025-10-31 20:11:57
909
23
原创 【Linux】基础指令(2):理解Linux的指令和核心概念
man命令:查看指定命令的使用手册,在线查看手册的工具比如:man ls, man pwd , man rm等等man man就会查出man的使用手册:man的手册分为九章,我们基本只使用前三个1是普通的命令2是系统调⽤,如open,write之类的(通过这个,⾄少可以很⽅便的查到调⽤这个函数,需要加什么头⽂件)3是库函数(C语言),如printf,fread4是特殊⽂件,也就是/dev下的各种设备⽂件注意:回车键时往下翻,退出是按q。
2025-10-29 18:13:05
913
14
原创 【C++】模板进阶:非类型模板参数&&特化&&分离编译
特化---->针对某些类型进行特殊化处理通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些 错误的结果,需要特殊处理,比如:实现了一个专门用来进行小于比较的函数模板比如说比较出两个日期类的指针// 1. 通用函数模板:比较两个同类型对象的大小// 通用逻辑:直接使用<运算符比较// 2. 模板特化:针对Date*类型(日期指针)的特殊处理// 当T为Date*时,调用此特化版本而非通用模板template<> // 特化标志。
2025-10-27 12:15:18
844
23
原创 【C++】stack和queue:使用&&OJ题&&模拟实现
stack的文档介绍队列的头文件下有两个队列,一个是普通队列,一个是优先级队列优先级队列的底层是堆,优先级队列我们到后面再讲,现在先来看普通队列queue的文档介绍1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元 素,另一端提取元素。2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供 一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。
2025-10-26 10:46:50
1232
26
原创 【C++】stack和queue:优先级队列的使用及底层原理
priority-queue的文档介绍翻译:1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素 中最大的。2. 此上下文类似于堆,在堆中可以随 时插入元素,并且只能检索最大堆元素(优先队列中位于顶 部的元素)。3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue 提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的 顶部。4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。
2025-10-24 23:32:06
755
10
原创 【C++】list的使用及底层逻辑&&实现
在 C++ 中,std::list是标准模板库(STL)提供的双向链表容器,其底层实现基于双向链表数据结构,每个元素(节点)包含数据域和两个指针域(分别指向前后节点)。可以将list理解为:带头双向循环链表kw=listclass list// 节点类型定义(链表的基本存储单元)// 假设list_node是已定义的节点结构体(含_data, _prev, _next)public:// 迭代器类型定义(通过模板参数控制读写权限)// 可读写迭代器(解引用返回T&)
2025-10-19 10:03:39
1381
15
原创 【C++】:深入理解vector(2):vector深度剖析及模拟实现
注意:后面写的函数实现等内容都是再类中的public中实现的,后面不再赘述。
2025-10-18 19:59:18
1183
13
原创 【C++】深入理解vector(1):vector的使用和OJ题
vector这个单词的意思是向量,但是在STL中的使用可以理解为顺序表string是字符串,vector则是一个改变数据的顺序容器2 vector的介绍vector的文本介绍这段话的意思如下:代表大小可以改变的数组。和数组一样,向量的元素存储在连续的内存位置,这意味着可以通过指向元素的常规指针进行偏移来访问其元素,并且访问效率与数组相同。但与数组不同的是,向量的大小可以动态改变,其存储空间由容器自动管理。在内部,向量使用动态分配的数组来存储元素。
2025-10-17 21:20:57
868
11
原创 【C++】深入理解string类(5)
如果在strcpy拷贝的时候,遇到\0,就会直接停止拷贝(例如:hello world\0yyy\0),如果是在字符串的中间有\0,那么就会造成拷贝的不完全,所以不能使用strcpy,而是用memcpy。开辟一个和s3一样大的空间,s1指向该空间,释放s1原本的旧空间,将s3的内容拷贝给s1。传统写法和现代写法的算法效率是一样的,只是现代写法的代码较短,代码写法不同,充分利用了复用,本质上区别不大。)中的一个字符串处理函数,用于在一个字符串(主串)中查找另一个字符串(子串)的首次出现位置。
2025-10-16 17:15:46
1236
23
原创 【数据结构】强化训练:从基础到入门到进阶(2)
我们用 top 来标记栈顶位置,用 i 来标记现在需要放置的元素位置,那么我们找到原数组中对应放置在最后位置的元素位置,然后在数组最后从该位置元素往前来进行模拟放置即可。在环形链表中,慢指针每次走一步,快指针每次走2,3,4,5........步,快慢指针在环形链表中一定会相遇。创建两个链表(小链表,大链表),遍历原链表,小的尾插到小链表中,大的尾插到大链表中,大链表和小链表首尾相连。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。类型的指针(即整数的地址),因此传递。
2025-10-12 22:22:55
983
10
原创 【Linux】linux基础指令入门(1)
is就相当于list ——罗列:罗列当前路径下所有文件详情查看当前在哪个路径之下cd:进入或者修改当前路径。cd:路径切换——change directory(更改路径)——自由进行路径切换。cd .. :回退到上级路径,并显示当前路径(回退之后的上一级路径)cd . :显示当前路径(一直cd .的话就一直不变)2 cd(1)进入当前路径(2 )语法:cd 目录名功能:改变工作目录。将当前工作目录改变到指定的目录下用于显示当前登录用户的用户名。创建一个目录。
2025-10-11 20:34:54
999
2
原创 【c++】深入理解string类(4)
这个接口就是为了兼容C语言,C++有时候会去调用C的接口,因为C++的库里面有时候提供api时会直接按照C的方式提供。例如我们后面学习网络工程的时候,用到的send()这个接口,就会调用C_str.因为在二目操作符中,如果先后两个类型会把小的类型自动强转为大的类型,此处就是把无符号转化成有符号,循环的终止条件是size<0(注意:这里的_size是string类的一个成员变量,你哦啊是当前字符串的有效数据个数。),无符号类型的-1是最大的整型,这样就会出现问题,所以需要把pos强转为int类型。
2025-10-10 21:47:20
1075
6
原创 【python】列表和元组
编程中, 经常需要使用变量, 来保存/表示数据.如果代码中需要表示的数据个数比较少, 我们直接创建多个变量即可.num1 = 10num2 = 20num3 = 30......但是有的时候, 代码中需要表示的数据特别多, 甚至也不知道要表示多少个数据. 这个时候, 就需要用到列表列表是一种让程序猿在代码中批量表示/保存数据的方式就像我们去超市买辣条, 如果就只是买一两根辣条, 那咱们直接拿着辣条就走了.
2025-10-04 11:21:25
989
7
原创 【c++】深入理解string类(3):典型OJ题
题目意思为:给你一个字符串,去找最后一个单词的长度,相当于需要你去寻找空格。这道题目是一个标准的IO型题目,不是接口型题目。思路:(1)寻找空格。但是如果有多个空格怎么办?例如:have a nice day。那我们就可以倒着去找空格,怎么倒着去找空格呢,string中有一个接口已经帮我们实现了:(2)那我们在string类中怎么去实现输入和输出呢?也有接口已经帮我们实现了:就相当于运算符重载(3)当我们找到最后一个空格的时候,怎么计算最后一个单词的长度呢?
2025-09-28 19:30:59
1570
10
原创 【c++】深入理解string类(2)
目录一 string类接口的补充1 reserve2 容量相关成员函数3 修改器(Modifiers)相关成员函数二 总结1. string类对象的常见构造2. string类对象的容量操作3. string类对象的访问及遍历操作4. string类对象的修改操作string类其他接口讲解链接如下:【【C++】深入理解string类(1)reserve的主要作用是扩容。上面这段话的主要意思为:(1)请求更改容量,请求将字符串的容量调整为最多可容纳 n 个字符的大小,以适应计划中的大小更改。(2)如果 n
2025-09-27 10:48:28
927
8
原创 【C++】深入理解string类(1)
当我们在看这个文档的时候发现,里面几乎是全英文的界面,我们要自己学会看文档,当然也可以使用翻译软件,但是翻译出来的意思总是和原本要表达的意思差点“味道”,所以更推荐自己阅读英语的文档(上半年C++网站的官方中文版下线了)在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、 快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。注意const的位置:在类名之后。这样修饰的是迭代器所指向的对象不被修改,如果放在类名之前,就是迭代器不能修改,这样是错误的。
2025-09-25 18:44:54
993
17
原创 【C++】STL简介+编码表+string引入
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。编码:值和符号的映射关联集合。
2025-09-24 16:50:24
849
3
原创 【C++】模板初阶
class 类模板名// 类内成员定义// 类模版public:_size = 0;// 模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误,具体原因后面会讲// 扩容++_size;注意:模板不建议声明和定义分离到两个文件,原因我们到后面再讲解。
2025-09-21 19:26:12
1743
16
原创 【c++】 内存管理
对于类类型可以更方便的调用构造函数和析构函数class Apublic:: _a(a)~A()private:int _a;int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数free(p1);delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;free(p5);return 0;malloc与free操作。
2025-09-21 11:33:40
895
11
原创 区分:传值返回,传指针返回,穿引用返回
定义:函数执行结束后,返回的是目标数据的独立副本—— 即先将函数内的返回值(如局部变量、计算结果)复制一份,再把这份副本传递给调用者;函数内原有的数据(如局部变量)会在函数生命周期结束后被销毁,调用者操作的副本与原数据完全独立。使用选择原则优先传值返回:基本类型、小型结构体,或需返回独立数据(避免外部修改)时。传指针返回:返回动态分配的大型数据、全局变量,或需兼容 C 语言时(C 无引用)。传引用返回:C++ 中需简化语法、实现链式操作,或明确允许外部修改原数据时。
2025-09-14 18:14:16
447
1
原创 【Linux】初识Linux
摩尔定律不仅是对晶体管数量的预判,更是过去 60 年科技产业 “持续创新、成本普惠” 的缩影 —— 它推动了 PC、手机、互联网的普及,重塑了社会生活方式。如今,尽管传统路径面临极限,但它的核心逻辑(通过技术突破提升性能、降低成本)仍在以新的形式延续,继续影响着 AI、元宇宙、量子计算等下一代科技方向的发展。当时IBM公司认为:计算机不能被个人使用,当时计算机主要是给企业,金融公司,银行等使用。依托于摩尔定律,发展出了两种计算机:一种是大型一体机(计算机),一种是电脑。
2025-09-13 18:27:27
517
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅