自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 收藏
  • 关注

原创 (unordered)map和set封装(底层红黑树)

class Setprivate:public://底层是对树的封装//两个迭代器都是const迭代器//此行报错while (it!报错原因,无法转变树中的迭代器,需要自己实现转变:为什么是试图从non_const转变为const:此时调用的是第一个begin返回的是树的iterator,但是set的iterator相当于树的const_iterator,类型不匹配而且不能自动发生转换,因此报错。

2023-10-03 23:49:44 1124 2

原创 typename关键字详解(消除歧义)

typename相当于泛型编程中class的同义关键字,用来指出模板类型所依赖的名称是类型名而非变量名变量名

2023-09-17 18:53:26 775 22

原创 红黑树(思维导图详解版)

部分图片。

2023-09-16 19:58:54 259 18

原创 【C++】map和set

查找:set的底层是红黑树,存储键值对,中序遍历结果是有序的,默认从小到大排序,查找的时间复杂度是log2nlog_2nlog2​n去重:除了排序,set还有去重的功能。底层1:set存储的实际上是**<value,value>结构**,map才是真正的<key,value>底层2:**set的key值不能修改,因为迭代器底层都是const迭代器。**但是可以插入和删除。map中的key是唯一的,并且不能修改默认按照小于的方式对key进行比较。

2023-08-30 11:41:36 283 20

原创 平衡二叉树(AVL树)C++

让待删除结点左子树当中key值最大的结点,或待删除结点右子树当中值最小的结点代替待删除结点被删除(代码中以后者为例),然后再将待删除结点的key值以及value值都改为代替其被删除的结点的值即可。1.当parent的平衡因子为-2,parent的左孩子的平衡因子为-1时,进行右单旋。2.当parent的平衡因子为-2,parent的左孩子的平衡因子为1时,进行左右双旋。4.当parent的平衡因子为2,parent的右孩子的平衡因子为-1时,进行右左双旋。与二叉搜索树相比,多了更新平衡因子这个步骤。

2023-08-27 15:04:09 394 11

原创 C++多态

被virtual修饰的函数是虚函数public:virtual void BuyTicket() { cout << "买票-全价" << endl;

2023-08-26 21:56:23 85 3

原创 C语言柔性数组

柔性数组既数组大小待定的数组,C语言中结构体的最后一个元素可以是大小未知的数组也就是所谓的0长度,所以我们可以用结构体来创建柔性数组。

2023-08-22 13:00:54 49 3

原创 斐波那契查找

在中学阶段我们都学过黄金分割比为0.618,在斐波那契数列中,相邻两个数的比例,无限接近0.618。

2023-08-21 17:23:13 30 1

原创 查找——二分查找

【代码】查找——二分查找。

2023-08-20 22:03:35 33 1

原创 二叉树和堆

建堆是指将一个无序的数组或完全二叉树调整成为一个堆的过程。堆排序是一种基于堆的排序算法。初始时,将待排序的无序数组(排序的是数组)构建为一个堆。构建为大根堆或者小根堆。交换堆顶元素和堆的最后一个节点,然后将堆的大小减一。对交换后的堆进行向下调整,重新满足堆的性质。重复上述步骤,直到堆的大小为1此时得到的是一个有序的堆(即底层数组是有序的,得到了升序或者降序排列的数组)(在堆上的体现就是左右节点之间也有大小关系)升序——建小根堆降序——建大根堆代码实现://堆排序。

2023-08-19 20:49:12 72 2

原创 非递归实现二叉树前、中、后序遍历

递归遍历相当于隐式的维护了一个栈,而非递归遍历则是模拟这个栈的实现。

2023-08-19 18:49:30 47

原创 char,short,int,float,double,long字节数以及long字节数的补充

long在linux64环境下所占用字节位8,也就间接说明了long在macOS下的字节长度也是8。(这是因为MacOS系统和Linux都是类Unix系统,只不过基于不同的内核)所以,在写跨平台的应用时,如果使用到long型,需要考虑到精度丢失的问题,在写跨平台应用时也尽量避免使用long型。为什么突然想起来复习这个,是因为在lc上刷题时遇到了关于long 的字节数。一开始我以为是x64的问题,换成了x86以后发现结果仍然是4字节。然后我查到了这篇文章。

2023-08-16 18:15:41 45 2

原创 函数指针,函数指针数组,数组指针,指针数组

如果在程序中定义了一个函数,在编译时,编译器为函数代码分配了一段存储空间,这段存储空间的起始地址(也就是函数的入口地址),称为这个指向这个函数的指针,也就是函数指针。我们可以定义一个指向函数的指针变量,来存储这个函数的起始地址。此时,该指针指向该函数是用来存放函数指针的数组。

2023-08-16 12:34:56 29 2

原创 C++继承

C++中继承相关知识详解

2023-08-01 17:55:29 87 5

原创 Linux中进程的六种状态

比如 int t =10ms。因为在阻塞状态时,进程的数据和二进制代码是用不到的,所以操作系统就将一部分进程的二进制代码放入磁盘中存储,仅仅留下PCB排队。注:S+中的+表示在前台运行的意思,在前台运行的可以通过ctrl+c停止,在后台运行的不行,要通过信号,kill -9 PID。如果我写一个while(1)死循环,那么在这个循环跑的时候,其他所有进程都不能运行,实际生活的经验告诉我们,这显然是不可能的。在进程中,子进程挂掉以后,要将执行结果等一些信息告诉父进程,父进程知道以后,才能被清理。

2023-07-30 23:24:12 906

原创 详解fork函数

在子进程中,fork函数返回0,在父进程中,返回创建子进程的ID,也就是说,我们可以通过fork的返回值来判断当前进程是父进程还是子进程。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。fork()函数通过系统调用创建一个与原来进程几乎一样的进程,这个新进程叫做子进程,而原来的进程叫做父进程,父子进程一起向下执行代码。

2023-07-30 16:34:35 1791 1

原创 栈,队列,优先级队列的实现和仿函数

仿函数是一种具有函数行为的类,在类内重载了运算符(),使对象可以像函数一样调用实例代码public:// 创建一个仿函数对象// 调用仿函数return 0;

2023-07-26 23:57:45 73 1

原创 Linux进程

如果学校的校长不会使用程序,只能使用Excel来操作学生信息,但如果校长是个程序员,可以将学生的信息存储在struct结构体中,并将其连接成链表,此时校长对学生的管理就变成了对链表的增删改查。2.管理硬件的方法(2步)——引出struct—链表——对数据的管理就是对某种数据结构的增删改查。:任何一个进程,在加载到内存,形成真正的进程时,操作系统首先要创建描述进程的结构体对象——PCB。组成:内核(进程管理,内存管理,文件管理,驱动管理), 其他程序(函数库,shell程序)

2023-07-13 15:09:39 53 2

原创 Linux切换用户和添加sudo权限

root切换到普通用户:su +用户名。普通用户切换到root:su。

2023-07-12 21:02:58 116 1

原创 Linux——make&Makefile

比较源文件最近修改时间和可执行文件最近修改时间,一般而言源文件的最近修改时间比可执行程序要旧。一个工程所需要的源文件有很多,makefile定义了一系列规则,去规定文件的编译顺序或者更复杂的文件操作。根据目标文件的依赖关系,递归式的生成一系列文件(类似栈),直到最后成功编译出第一个目标文件。当makefile存在时,make会去找makefile,并将其的第一个文件作为目标文件。make会根据源文件和目标文件的新旧,判断是否需要重新执行依赖关系进行编译。若想让依赖关系总被执行,文件=文件内容+文件属性。

2023-07-12 19:37:39 41 1

原创 模板初阶

class 类模板名// 类内成员定义类模板无法推演类型,必须要通过类名<类型>的方式实例化。int _size;//类模板中函数放在类外定义时,需要加函数模板参数列表//类模板无法推演实例化 都是显示实例化Stack<T>::Stack(size_t capacity)//函数的缺省值只能在定义和声明中出现一次 一般放在声明_size = 0;

2023-05-24 22:41:11 47

原创 C/C++内存管理

1.调用operator new申请空间2. 在申请的空间上执行构造函数,完成对象的构造1.在空间上执行析构函数,完成对象中资源的清理工作2.用operator delete函数释放对象的空间1.调用operator new[ ]函数,在operator new[ ]中实际调用N次operator new完成N个对象空间的申请2.在申请的空间上调用N次构造函数1.在释放的对象空间上执行N次析构函数,完成对N个对象中资源的清理。

2023-05-21 16:54:17 40

原创 初始化列表&static成员&友元&内部类&匿名对象

位置。

2023-05-18 16:12:30 84

原创 C++函数重载详解

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!1.函数重载的概念函数重载:是函数的一种特殊情况,C++中允许在中,声明几个功能类似的,这些同名函数的,常用来处理实现功能类似而数据类型不同的问题。

2023-04-22 18:31:41 127

原创 C++缺省参数详解

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用形参的缺省值,否则使用指定的实参。1.半缺省参数必须从右往左依次来给出,不能间隔着给。3.缺省值必须是常量或者全局变量。(不知道以哪个为准)

2023-04-22 10:20:23 117

原创 命名空间详解

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名 空间的成员。//1.命名空间的正常定义//命名空间中可以定义:变量/函数/类型int a = 1;int val;//注意末尾没有;//3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。//在text.h头文件里的,但合并在了一个命名空间中。

2023-04-15 17:15:52 411

原创 六大排序算法的稳定性详解

假定在待排序的记录序列中,存在多个具有相同关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;5.堆排序——不稳定(建堆和交换的时候都可能会乱)4.希尔排序——不稳定(可能会分到不同的组预排)2.选择排序——不稳定(与后面的数字交换)6.快速排序——不稳定(可能会变成中间值)3.插入排序——稳定(相同不插入)1.冒泡排序——稳定(相同不交换)排序稳定,其他的就是。

2023-04-14 19:48:23 794

原创 六大排序算法

​​​​​​​。

2023-04-14 13:46:46 208

原创 链表实现二叉树

如果子树为空 返回0 不为空返回1。执行逻辑:判断左右子树中高度大的那颗,在此基础上加上自身返回上一级。执行逻辑:统计左右子树叶子的个数 加上自身 返回上一级。将一层的节点全部遍历完了以后再遍历下一层。递归的算法:当根为NULL时,开始返回。执行逻辑:将NULL也push进队列。返回条件:子树为空 或者找到目标值。执行逻辑:即找k-1层子树的个数。返回条件:走到目标层(k==1)执行逻辑:先寻找所有的左子树。是层层返回的 而不是一下返回。出谁,将谁的子树全部带入。返回条件: 为空返回0。

2023-04-06 18:52:44 852

原创 函数栈帧———图解

函数栈帧———图解

2023-02-27 12:00:08 85

原创 const和define定义

它们在程序运行时是只读的。使用const定义常量可以提高代码的可读性和维护性,同时避免在程序中出现魔法数字。define只是简单的文本替换,不具有类型,也不会进行类型检查,因此可能会导致一些潜在的问题。define是c预处理器指令,它定义的宏常量在程序中是直接替换成对应的值。define定义的常量只在预处理阶段生效,而不是在编译阶段或运行时生效。const定义的常量可以想普通变量一样使用,并且可以通过指针访问。const关键字定义的常量具有类型。

2023-02-26 11:09:11 51

原创 c++预编译指令

c++预编译指令

2023-02-23 13:08:09 43

原创 unsigned char a:2的含义和%x和%02x的输出原则

unsigned char a:2的含义和%x和%02x的输出原则

2023-02-19 10:42:51 606

原创 #pragma pack(1)

意思为编译选项为四字对齐,所有数据在内存中是连续存储的,以4字节的方式对齐。这是编译器为了让程序跑的更快,减少CPU读取数据的指令中心,对结构体的存储进行了优化。

2023-02-19 10:03:09 215

红黑树(思维导图详解版)

红黑树(思维导图详解版)

2023-09-16

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除