- 博客(43)
- 收藏
- 关注
原创 Linux的权限概念
目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd进入目录,即使目录仍然有-r读权限(这个地方很容易犯错,认为有读权限就可以进⼊目录读取目录下的文件)(其实可以这样理解:你有某个小区房子的钥匙,你是可以进入这个房子的,但是小区保安连小区们都不让你进,因此你也就进不去这个房子了)而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限所以在目录下,即使可以执行ls。
2025-08-03 11:07:27
801
原创 《AVL树介绍及其底层实现》
之前我们学习了二叉搜索树,二叉搜索树虽然功能比较强大,但是存在极端情况导致其退化,因此今天我们就来学习二叉搜索树的升级版—平衡二叉搜索树(AVL树)。
2025-06-28 15:52:12
628
原创 《map和set的使用介绍》
set的声明如下,T就是set底层关键字的类型set默认要求T⽀持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模版参数。2.·set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参数。一般情况下,我们都不需要传后两个模版参数。set底层是用红黑树实现,增删查效率是O(logN),迭代器遍历是走的搜索树的中序,所以是有序的。前面部分我们已经学习了vectorlist等容器的使用,STL。
2025-06-21 16:03:10
882
原创 《类和对象--多态》
必须是基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,并且完成了虚函数重写/覆盖。条件1:因为只有基类的指针或引用才能既指向基类对象又指向派生类对象;条件2:派生类必须对基类的虚函数完成重写/覆盖,重写或者覆盖了,基类和派生类之间才能有不同的函数,多态的不同形态效果才能达到。
2025-06-03 17:59:05
673
3
原创 《类和对象--继承》
继承)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复用,继承是类设计层次的复用。下面看一个例子来感受继承的作用:下面我们看到没有继承之前我们设计了两个类Student和TeacherStudent和Teacher都有姓名/地址/电话/年龄等成员变量,都有identity。
2025-06-02 15:30:13
1038
2
原创 《STL--stack 和 queue 的使用及其底层实现》
stack的介绍文档queue的介绍文档优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此就是堆,所有需要用到堆的位置,都可以考虑使用。默认情况下是大堆。的具体介绍文档对于内置类型的话:如果这里我想要创建小根堆的话就需要自己传入仿函数来实现:如果是自定义类型的话,创建大根堆和小根堆都需要有相应的和运算符重载,下面拿日期类来举例:这是我们实现的一个日期类仿函数(Functor),也称为。
2025-05-31 21:07:02
906
2
原创 《STL--list的使用及其底层实现》
上次我们学习了容器的使用及其底层实现,今天我们再来学习一个容器,这里的可以参考我们之前实现的单链表,但是这里的是双向循环带头链表,下面我们就开始的学习了。list的介绍文档:关于的接口众多,下面我们只介绍一些比较常用的接口,其他接口同学们可以自行去的介绍文档中学习。注:这里大家先将list的迭代器理解为指向节点的一个指针。注:前面说过,此处大家可将迭代器暂时理解成类似于指针,迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。因为的底层结构为带头结点的双向循环链表,因此在中进行插入时是不会导致的
2025-05-25 23:54:14
1283
4
原创 《STL--- vector的使用及其底层实现》
vectorvector无参构造。构造并初始化n个val。拷贝构造。使用迭代器进行初始化构造。
2025-05-23 23:18:22
700
2
原创 《STL--string的使用及其底层实现》
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
2025-05-22 22:46:20
832
5
原创 《模版初阶》
上次我们学习了内存管理,之后就要开始学STL了,但是在学习STL之前,我们还需要有一个前置知识->模版,只不过这里只是对模版有一个初步认知,后面还会深入学习。
2025-05-15 10:28:05
954
4
原创 《C/C++内存管理》
new/delete是在操作自定义类型时与C语言中就有所区别。调用函数申请空间。在申请的空间上执行构造函数,完成对象的构造。
2025-05-14 20:54:13
1033
5
原创 《类和对象(下)》
在C++中规定,如果自定义类型的成员没有默认构造函数,这时候自定义类型就需要自己来写构造函数,而且如果成员还是类类型的变量就必须用初始化列表来初始化。这里我们拿之前的stack和Myqueue来举例子:这里Stack的构造函数我们故意显示的写成带参的,这样编译器就不会再生成构造函数,这时Stack就是没有默认构造函数的。这里可以看到这里在创建Myqueue类型的对象时就无法初始化,那么这时候就需要自己来写构造函数,但是这里怎么初始化呢?没法写啊,这里就需要用到初始化列表这样就可以实现。
2025-05-13 17:19:57
1221
5
原创 《类和对象(中)》
这里我们利用之前实现的栈来和日期类进行一个对比:解读:明显可以看到,对于内置类型的Date,编译器生成的默认构造函数并没有对其成员进行初始化,但是对于自定义类型Mystack中的st1和st2,编译器都对其进行了初始化。解读:可以看到我们在实例化阶段初始化的日期类d1在结束时编译器生成的析构函数对没有对其进行处理,但是对于Mystack类型的q1在结束时,编译器调用了其成员自己的析构函数,进行了空间的释放。虽然日期类d1的析构函数没有对其进行处理,但其在结束时函数栈帧已经销毁,不处理其实也没事,但是像。
2025-05-10 14:41:58
1157
8
原创 《类和对象(上)》
class为定义类的关键字Stack为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量,类中的函数称为类的方法或者成员函数。为了区分成员变量,一般习惯上成员变量会加一个特殊标识,如成员变量前面或者后面加或者m开头,注意C++中这个并不是强制的,只是一些惯例,具体看公司的要求。C++中struct也可以定义类,C++兼容C中struct的用法,同时struct升级成了类,明显的变化是struct。
2025-05-05 21:31:12
988
8
原创 《C++ 入门基础》
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不再冲突了。C++中域有函数局部域全局域命名空间域类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期命名空间域和类域。
2025-05-04 19:00:33
689
3
原创 《排序算法总结》
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。划分两块区间,一直到只剩一个元素,那么这个区间自己就是有序的,主要就是找。的基础上进行改进而来的,综合来说它的效率肯定是要高于直接。的记录分在同一组内,并对每一组内的记录进行排序,然后。中,直到所有的记录插入完为止,得到一个新的。),把待排序文件所有记录分成各组,所有的。得到下一个整数,再将数组分成各组,进行。
2025-05-01 21:20:35
1328
1
原创 《数据结构之美--二叉树oj题练习》
上次我们学习了二叉树这一数据结构,这次我们就针对二叉树来做一些oj题来巩固一下。的下标,记录此时走到了哪里。求二叉树节点个数、前序遍历。
2025-04-29 12:15:33
330
1
原创 《数据结构之美--二叉树》
入堆很简单,和顺序表的插入数据相同,但难点是在插入数据之后还要维护该堆为一个大根堆,这里我们的处理方法是:空间足够的情况下直接往最后面插入,接着执行向上调整算法,直到满足大根堆。这篇博客主要介绍了树,包括关于树的一些术语树的表示树在计算机中的应用树的分类树的两种存储结构->顺序存储结构和链式存储结构。下次会分享一些二叉树的oj题。
2025-04-28 22:46:14
1286
10
原创 《数据结构之美--栈和队列》
因为进栈和出栈都是在栈顶进行,因此这里需要定义栈顶位置,除了动态数组,还需要知道栈的空间大小,因此再定义一个容器大小。这里我们先定义了每个节点的结构,然后定义了队列结构,其中维护了指向队头和指向队尾的两个结构体指针。在这篇博客中,我们实现了具有先进后出性质的栈和具有先进先出性质的队列。下篇博客我们将练习几道关于栈和队列的oj题。
2025-04-24 22:44:42
1127
4
原创 《数据结构之美--双向链表》
通过上述介绍,想必同学们已经对双向链表有了一个较为清晰的认识,和单链表相比,双向链表在各种操作上确实比单链表要优秀不少,但也不代表单链表就一无是处,所有的数据结构都是存在即合理,所以我们都要掌握。那么下次我们来学习另外一个数据结构–栈。
2025-04-21 18:54:55
1408
1
原创 《数据结构之美--链表oj练习》
这篇文章主要是和大家分享一些简单的单链表oj题来巩固一下学习的单链表,上面几道题如果有更优的算法欢迎随时和我交流分享。
2025-04-18 18:52:28
1184
2
原创 《数据结构之美-- 单链表》
首先由上次我们实现的聊起,我们在实现顺序表的时候会发现,在每次插入数据时当空间不够时就会涉及到,而顺序表的扩容一般都是呈二倍的形式来进行,因此这就有可能造成空间的浪费,那该如何解决这个问题呢,接下来要学到的就可以完美地解决这个缺点。
2024-12-13 21:39:38
1247
原创 《数据结构之美---顺序表》
顾名思义,静态顺序表也就是大小长度确定的一个顺序表,是用定长数组来实现的,你需要多大的空间来存储就申请多大的空间,但这也就会导致有时候空间不够用,或者空间申请过大造成浪费,所以这个使用的场景不多动态顺序表相较于静态顺序表就多了一些灵活性,我们可以随时通过改变数组的大小来决定存储更多还是更少的数据,这一点是比静态顺序表要好的,这也就决定了动态顺序表的应用场景要比静态顺序表要广泛,但是即使可以动态的改变数组的大小,但是每次修改多大范围就太让人头疼,扩大的小了不够用,扩大了多的怕浪费,这也是它的一个小缺点。
2024-12-10 21:11:04
1149
原创 《文件操作》
可以看到该函数的返回值为int类型的,所以在读取到内容时就需要一个int类型的变量来接收首先我们创建一个文件并往里面放一些内容为了得到文件中的所有内容,所以这里我们利用了一个while循环,因为fgetc的停止条件是遇到错误,所以这里循环的条件就是fgetc得到的返回值!= EOF,这样就读取到了所有的字符通过该函数的介绍,我们可以发现这个函数的返回值的类型也为int类型,这就和fgetc对应上了。stdin -- 标准输入stdout -- 标准输出通过该函数的介绍,我们可以看到这个函数的返回值为。
2024-11-24 23:11:41
1410
1
原创 《自定义类型:结构体》
位段的成员必须是int或signed int,在C99中位段成员的类型也可以选择其他类型。位段的成员名后边有⼀个冒号和⼀个数字。示例:但要注意的是这里冒号后面的数字的大小指的是比特位。这期里面我们主要讲解了结构体的特殊声明、结构体的自引用、结构体的内存对齐、为什么存在内存对齐、修改默认对齐数、结构体传参、结构体实现位段、什么是位段、位段的作用、位段中的内存分配、位段的跨平台问题、使用位段时的注意事项。
2024-11-18 23:28:47
1042
4
原创 《内存函数》
这里通过memmove的定义我们可以发现这个函数也是有三个参数,包括目的地、源头、拷贝个数通过memset的定义我们可以看到这个函数包含了三个参数一般情况下这个函数可以用来内存的初始化、清空数组、给特殊值注意这里比较的是内存中的大小。这期我们主要学习了memcpy函数、memmove函数及两个函数的模拟实现、memset函数和memcmp函数。这期中比较难一点理解的就是memmove函数的模拟实现,大家可以反复翻看,加深理解,注意体会其中的思想。
2024-11-13 23:54:44
875
1
原创 深入理解指针(5)
就是⼀个通过函数指针调⽤的函数。如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应。
2024-11-09 16:02:34
1303
3
原创 深入理解指针(4)
在这期文章中,我们学习了字符指针变量、函数指针变量、二维数组传参的本质、函数指针数组、typedef关键字的重命名以及简单计算器的实现。敬请期待:深入理解指针(5)
2024-11-08 22:12:23
817
1
原创 深入理解指针(2)
指针未初始化2.指针的越界访问这里因为数组只有十个元素,但for循环这里i是可以等于sz的,这就导致指针会越界访问,这时候就会栈溢出,所以就会打印10之后的元素3、 指针指向的空间释放此时函数中的n的地址还没有释放当函数走完的时候,n的地址会归还给操作系统,这时候会发现n就没有地址了。
2024-11-04 22:29:26
442
原创 深入理解指针(1)
其实我们这里可以来通过一个例子来引申出指针的定义,比如你的一个朋友来你这旅游,然后住进了一家大酒店,这时候你朋友给你打电话让你来找他,假设他不告诉你他住在哪个房间,你是不是要挨个房间去找啊,这时候就特别麻烦,但是如果你的朋友告诉你他住在637号房间,这个时候你就直奔这个房间就可以了,这样是不是会节省很多时间啊。我们可以把指针理解为这座酒店的房间号,这样方便我们来区分每个房间指针 == 内存单元编号 == 地址地址在C语言中又被称作指针。
2024-11-04 20:45:45
1358
原创 《扫雷游戏》------ C语言
这里为了更清晰,所以分成了三个文件注意这里为了让主函数简单一些,所以这里把游戏步骤的实现放到一个text函数中注意写到这里的时候就可以先运行一下代码,看一下是否有问题,不然到后面出错多了就不好改了,等运行没问题之后再接着往下写 ------好习惯这里易错的是不能在定义数组时直接初始化数组,因为初始化棋盘中是字符0,而不是数字0,所以就要单独再进行初始化。头文件中的定义 初始化函数逻辑的书写初始化函数的调用:注意这里因为两个棋盘初始化的内容不同所以这里就再传输一个参数set来实现两者的初始化
2024-10-25 14:42:47
976
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人