- 博客(69)
- 收藏
- 关注
原创 Linux学习记录(3)基础开发工具
现在我们的代码不是这样的嘛:假如我现在目标文件不想让他叫test.exe,我想给他搞成code.exe,dst.exe,我们难道要一行一行去换吗?就像这样一样:想把test.c替换掉也是同理,我们只能一点一点找,一点一点删,一点一点手打吗?vim中可以定义变量,因此可以实现以下操作:在vim中定义变量,格式为:变量名=指定文件名。在例子中目标文件对应的变量名我们起成BIN,源文件对应的变量名我们起成SRC。vim中可以有空格,写成变量名 = 指定文件名,但是一般不建议,直接写成不带空格的最好。
2025-12-21 16:48:09
991
原创 Linux学习记录(2)Linux权限
配置好服务器以后,利用xshell学习并使用了一系列的基础指令,但是其实我们对操作系统的理解还是不够,并且之前就说过,我们用的是root账号,是超级管理员,那么如果不是管理员会怎么样呢?是否会对我们操作有影响呢?这也就是我们本次文章所要探讨的内容。
2025-11-14 19:58:11
801
原创 算法(二)滑动窗口
如果sum ==的话肯定得更新;光看那一个例子我也是在看不出来,因此呢,又拿一个样例,我这次感受到了,只要让left一直++,如果碰到第一个0,那就可以跳过它,因为此时right是不变的,那么区间内维护的0的个数会--,这样就相当于新区间了,绝对的新,不是子区间。因为这里也不是说,俩哈希表内容必须完全一样,只要覆盖住t即可,所以用sort记录,当你想要入一个字符到hash2,并且这玩意在hash1里有,++以后刚好相等,则当前维护的区间,这个字符肯定符合题目要求,即覆盖到t的字符串。
2025-11-13 20:08:39
903
1
原创 C++学习记录(23)智能指针
可不可能说闲着没事扔着内存玩呗,多弄几个内存条不完了,我们平常聊到的内存泄露是特定场景下的。一般是疏忽或程序异常导致申请的内存未能正常释放,申请的内存不能再被申请,而且也不能被其他操作使用,如果这样的操作反复出现,将会对内存一点点蚕食,这样再有申请内存的动作将会非常缓慢甚至不能申请直接崩溃。我们在异常那一节就了解过,为什么要有异常,因为我们平常用的软件甚至我们手机、电脑的操作系统,如果某个操作底层一直内存泄露,比如打个车,会造成2m内存泄露,一个人打还能受的住,时间长了不就炸了;
2025-10-28 17:48:36
987
原创 C++学习记录(22)异常
我们提前对异常进行监管,程序一旦出现问题,通过throw抛出一个异常,该对象的类型和调用链决定了它将会由哪个catch语句捕获一旦抛出异常异常,程序对当前函数的执行立即停止,接下来所做的就是拿着这个异常对象去匹配catch语句,则有:throw语句后的语句不再执行,程序会顺着调用链寻找catch语句,那么将会出现:调用链的函数可能提前结束,那么一旦处理异常只要没有找到catch语句的函数,直接被回收栈空间,最后我们看到的效果就是由throw语句直接匹配到对应的catch语句中。
2025-10-24 20:42:41
824
原创 C++学习记录(21)C++11
/自定义类型支持class Datepublic:,_day(day){}private:int _year;int _month;int _day;直接初始化对象的时候调用构造函数,但是明显对比,还是列表初始化更加直观,而且写了这么久的代码,用构造函数直接初始化实在太少了,基本上就是两种方式——默认构造+insert/列表初始化。我自己写出来直接调用构造函数初始化都愣了一下,太久没用了。
2025-10-23 19:50:48
1023
原创 C++学习记录(20)哈希表封装实现unordered_set和unordered_map
类比于map和set的实现,学习了红黑树就是为了模拟实现map和set,模拟实现的目的是为了对语法进行训练,当然,也可能夹带一些源码阅读之类的考研。了解了stl底层哈希表,也就是哈希桶形式的哈希表以后,重点就得放到模拟实现上了。
2025-10-17 16:46:32
740
原创 C++学习记录(18)unordered_map和unordered_set使用
按照类似英语语法的分析角度,set和unordered_set都属于set,map和unordered_map都属于map。区别就仅仅是加个定语,order意味着命令,在这里是次序的意思,un-否定前缀,意为无序的。我们这次学习的确实相当于无序的意思,因为set和map底层我们也大致了解和设计过了,底层用的红黑树,设置结构的时候左子树一定比根小,右子树一定比根大;并且迭代器设计的逻辑是按照中序遍历的顺序,这样的话其实也就是有序的序列。
2025-10-13 17:49:18
985
原创 C++学习记录(17)红黑树简单实现map和set
风风火火的写了写AVL树和红黑树的实现,其实都是铺垫,早在map和set使用的学习的时候,我就提库里的map和set底层封装个红黑树实现。为了能够自己模拟实现map和set的一些功能:我们先学了AVL树,重点关注了保证平衡方式和平衡调整,也就是四种旋转,这为后续写红黑树实现又做铺垫;有了AVL树的铺垫,在学习红黑树时重点学习红黑树如何保证平衡,另外的重点就是调整用到旋转的时候就不用另起炉灶,直接复用AVL树中实现的就行了。那么怎么用红黑树实现map和set的功能呢?
2025-10-10 21:15:09
817
原创 C++学习记录(16)红黑树
在前面我们见识过了AVL控制平衡的方法,也就是借助平衡因子,如果平衡因子不对劲就进行旋转。但是实践中人们更多使用红黑树来作为平衡二叉树的典例来使用,可是为什么是这样的呢?只有学习了以后才能知道问题到底出在哪里。
2025-10-08 20:50:53
598
原创 C++学习记录(15)AVL树
之前我们说过,自己实现的二叉排序树有一个非常坏的极端情况,那就是插入的数据基本有序,很容易造成二叉树退化成单链,这样logN的查找效率直接就没了。这样比链表复杂,没链表方便,用起来有什么用?因此,在二叉排序树的基础上进一步加以限定升级得到AVL树。
2025-10-06 21:40:06
632
原创 C++学习记录(14)map和set的使用
上次学容器还是在上次,学的是priority_queue吧离得最近的,搞这个模板特化和继承多态给我搞的真是累挺,终于转回来到容器的学习了。之前我们学过vector、list、deque、stack、queue、priority_queue,这些玩意多多少少都有些共同点,逻辑结构上其实都可以算是线性表,毕竟如果支持遍历的话,遍历到一个紧接着就能去遍历下一个,但是数据与数据之间其实没什么联系,比较在意的就是数据的位置而已,数据存储的顺序也就取决于插入顺序。
2025-09-29 16:11:18
730
原创 C++学习记录(13)二叉排序树
简单回顾一下二叉树。硬说的话我们其实学习的只有堆和普通的二叉树。其中堆的逻辑结构是完全二叉树,物理结构底层其实是顺序存储,一般直接就用数组代替了;普通二叉树我们学习的重点其实就是大概了解名词、了解结构、前中后序、层序遍历等。其实大部分都是以二叉树的结构为主,但是实际上搞个普通二叉树有什么用呢?
2025-09-26 17:36:19
996
原创 C++学习记录(11)继承详解
继承是面向对象程序设计的一大特点,为代码复用提供了新的层次。它允许我们在已有类型的基础上,设计新的成员变量和成员函数,所产生的新的类型叫做派生类(子类),原来的类型叫做基类(父类)。
2025-09-23 21:00:55
947
原创 C++学习记录(10)模板进阶
头文件 声明 定义都有了昂:大概意思就是FunT这个函数我并没有找到啊,而且是在链接阶段没找到,LNK错误嘛。不妨我们来细细的画一下几个文件的编译,最基本的,明确编译的基本单位是.cpp文件:预处理阶段:(展开头文件 宏替换 条件编译)编译:(转成汇编代码)(检查语法 句法)
2025-09-20 16:47:11
896
原创 算法(一)双指针法
题目其实难度不高,重点是双指针这个方法。看见这题下意识第一反应就是用两个指针,一个指针在前面找0,另一个指针在后面站岗随时准备交换。但是看见非零元素的相对顺序不变就只能换办法。而后就能想到,如果碰见0元素,计数,并且利用类似于string/vector这些顺序表的erase方法的思路,可以while(pcur!但是这样的话免不了循环套循环,移动次数也非常多。所以这次我们类比快速排序的思路来做:依旧是两个指针,根据指针来分区间。
2025-09-18 21:11:32
1004
1
原创 刷题记录(10)stack和queue的简单应用
怎么说呢,其实push pop top直接套STL库的就行,其实最麻烦的就是如何获得堆栈中最小的元素(而且硬性要求常数时间解决),毕竟我们非常清楚,栈是不能随意访问元素的,至多只能访问栈顶元素。
2025-09-18 18:11:18
652
原创 C++学习记录(9)stack和queue
不管是string、vector、list,底层其实就是申请一块块内存,并且在内存中存储容器,它们的功能都必须从底层一点点实现,难道说能让vector代替list吗?显然是不可能的。而stack底层实现的时候其实还是说选择数组、链表来实现,queue类似,虽然不能直接用数组链表来代替它们,但是注意到只需要数组链表的部分接口即可实现stack、queue的接口,即:需要自己选择底层内存的申请方式,数据的维护方式->发现其实本质还是数组和链表->为何不直接用已经实现的vector/list实现呢?
2025-09-18 18:10:47
853
原创 C++学习记录(8)list
一次是对const对象即使不用const迭代器应该也可以,因为按照我的推理,其实最根本的结点的属性没有被保护;另一次就是对const成员为什么非得用const成员函数产生疑问。总得就是以C的角度对const关键字进行理解,而不是C++,上面我们已经看到了,C++的const从深度上将一系列与const修饰的对象能够产生关系的所有属性进行const修饰;从广度上直接禁止非const引用/指针与const对象产生关系。
2025-09-13 15:27:08
883
原创 刷题记录(9)包含vector的算法题
经典题了,只要学过按位异或,这题其实就简单了:与众不同的数字最后会被筛选出来。所以代码:可以看到C++传数组传的就是vector。
2025-09-11 10:05:15
846
原创 C++学习记录(7)vector
严格来说,我们之前学的string类并不能作为容器,简单来说,我们的string一般就当成顺序表来用了,这个顺序表非常严格,只能用来管理字符序列;除此之外,我们学习string类的时候可以注意到,好多库里面的接口都与c-str有关,也就意味着string和我们C语言是紧密联系的。最好的类比就是我们买的马克杯,倒里面点水没毛病,你不能说倒点茶就不允许,倒点咖啡饮料就不可以,string就好像限量版容器一样,非常挑剔。带着这样的认知,我们来学习STL里真正意义上的容器之一vector。
2025-09-09 20:39:58
742
原创 C++学习记录(6)string部分操作的模拟实现
string部分操作的模拟实现并不是说觉得自己无所不能,可以自己创造一个string类代替库里面的string类,至少目前连C++基本语法都没有学完肯定是没有办法的。模拟实现的重点在于运用前面我们讲的C++入门、类与对象、内存管理等内容辅助实现string类,并且通过模拟实现加深对string类的理解,使使用的时候更加得心应手。
2025-09-04 21:34:02
1091
1
原创 刷题记录(8)string类操作使用
字符串最后一个单词的长度_牛客题霸_牛客网其实这么看来还简单了一点,简单到哪了呢?每个单词之间用' '分割,这样的话你倒着读取,找到最后一个空格,最后一个空格后不就是最后一个单词嘛,有了最后一个空格的位置何愁最后一个单词的长度呢。cin >> s;
2025-09-02 19:01:49
778
原创 C++学习记录(5)string的介绍和使用
其实在C语言阶段我们学过char类型,所以在当时我们认为字符串就是多个char,而且在<string.h>中我们学习了一大堆strcpy、strlen等函数的使用和实现,这还不够用吗?只能说确实在当时符合我们的需求,但是对于我们的面向对象OOP来说,C的字符串和函数操作其实根本可以说没什么关联。string类中有char*数组来管理数据,并且有一系列方法,比如像是length和size都与strllen类似,除了这种函数,还有运算符重载的[],<<,>>等更符合面向对象,使用起来更加方便。
2025-08-30 10:00:31
821
原创 C++学习(4)模板与STL
C++模板是一种泛型编程(generic programming)机制,允许开发者编写与具体数据类型无关的通用代码,通过参数化类型实现代码复用和类型安全。其核心思想是将数据类型视为参数,在编译时根据实际传入的类型生成特定版本的代码,从而避免为不同数据类型重复编写逻辑相同的代码。模板分为函数模板和类模板。STL(Standard Template Library,标准模板库)是C++标准库的核心组成部分,提供了一套基于模板的通用数据结构和算法组件,旨在实现代码的高度复用、类型安全和高效执行。
2025-08-26 16:09:01
1143
原创 C++学习记录(3)内存管理
前面其实没少说过,C++有很多功能创造出来都是为了优化升级C语言中的一些功能。比如这样一个场景://单个自定义对象申请空间对比free(p1);delete p2;//多个自定义对象申请空间对比free(p3);//多个自定义对象申请空间并初始化对比free(p5);delete p6;
2025-08-25 11:02:46
811
原创 C++学习记录(2)类和对象
在上面提到有两种定义类的方式,一种是用class关键字,一种是用struct关键字。class定义的成员在没有给访问控制符的修饰时默认就是private,struct默认为public。
2025-08-21 17:21:50
689
原创 C++学习记录(1)C++入门
namespace我们叫做命名空间,这是一个关键字,语法格式类似于结构体:namespace name(自己取一个名字)定义变量 函数 类等缺省参数是在函数声明或者定义时,给予形参默认值,如果调用该函数时,没有指定实参则采用给予的形参的默认值,否则使用指定的实参,缺省参数分为全缺省和半缺省。简单例子:C++的函数可以给缺省参数(或者说默认参数),如果传参不给,就用给予的默认值,给了就用指定的,完全符合定义。
2025-08-13 17:35:40
707
原创 数据结构(9)排序
排序在生活中无处不在,上学这么多年班级排名啥的总有吧,不可能一次都没见过;打游戏有的排行榜不也是有排序的思想在里面,排序倒不是什么特殊的数据结构,但是是非常重要的算法思想,所以在初阶数据结构的最后,学习一下常见的几种排序算法。当然,有些算法已经实现过了,比如冒泡排序和堆排序,到时候可以重写复习一下,但是不再展开具体细节了。
2025-06-11 21:01:21
2269
原创 刷题记录(7)二叉树
二叉树为二叉链表形式,结点为:大概看看题就知道这道题让我们判断一个树到底所有结点的值是不是相同,相同就是单值二叉树。在实现二叉树相关操作的时候已经体会到了,递归来遍历二叉树是非常舒服的(做这些题本质都得遍历)。所以我们考虑考虑递归怎么个递归法,而二叉树递归其实就是考虑根结点以及左右子树之间的关系。容易想到判断根结点与左右孩子结点是否结点,当然,由于需要访问左右孩子结点,根结点不能为空,而且因为访问的是三个结点的值,所以肯定三个结点都得先保证不为空。
2025-06-06 21:33:25
1870
原创 数据结构(8)树-二叉树
堆的特性(完全二叉树)使得底层用数组来实现更加容易,而正常我们的二叉树肯定用链表就可以减少空间的浪费,在这里我们写的只是一般的树及其相关操作,因此就用二叉链表实现。
2025-06-04 21:03:37
908
原创 数据结构(7)树-二叉树-堆
树还是太难了,所以我们初阶阶段就把目光放在二叉树上,二叉树顾名思义,最多就分两个叉,也就是一个结点的子结点不得超过两个:即结点的度不能超过2。且二叉树的子树有左右之分,顺序不能随意调换。这样看起来可以说是舒服多了,在树形结构中应用最多的就是二叉树,这也确实比树好区分一点,毕竟人习惯分左右,我真的在日常生活中见过很多人不分东南西北,更别提那些东北了,西南了这些方向,如果实现分好多叉的树那不更晕了。
2025-05-29 20:50:13
1041
原创 刷题记录(6)栈与队列相关操作
读题其实不老有感觉,就是左括号必须用与之对应的右括号去对应,也就是(),[],{},可以嵌套,但是必须对应顺序:[()],这样就不行:[{)]。
2025-05-25 21:18:25
645
原创 数据结构(5)线性表-栈
栈是一种特殊的线性表,特殊性体现在,它只允许在固定的一段进行插入和删除操作。可以进行插入和删除操作的一段叫做栈顶,另一端叫做栈底。如图:所以栈的数据一般符合“先进后出”或“后进先出”的特点,因为只有栈顶可以进行数据的改写。栈既然是线性表,逻辑结构上就是线性的,但是物理结构上不一定是线性的,如果底层用数组来实现,那么就是线性的,但是如果用链表来实现的话,那么就又不好说了。
2025-05-23 16:52:03
485
1
原创 数据结构(4)线性表-链表-双链表
迟来的分类,主要如果在学习单链表前去讲分类,可能就云里雾里的,所以放在讲完单链表后讲。划分链表的标准如下:有没有头结点、指针的方向、循环与否头结点就是一个占位结点,也被叫做哨兵位,一般就是标识起点、防止链表为空,本身不储存任何有效元素(就类似于我们高速上看到的,前方多少米服务区,前方多少米进入什么地界,碰到头结点就知道遍历到链表的头结点了)。指针方向一个是只能从前往后遍历,另外一个双向的就是既有指向前一个结点的指针,也有指向后一个结点的指针。
2025-05-21 19:25:09
1910
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅