自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 详解C++11特性(上)

C++11是C++语言的一个重要版本,于2011年发布。它引入了许多新的特性和改进,使得C++语言更加现代化和强大。所以属性C++11的新特性是很有必要去熟悉的。左值是一个表示数据的表达式,出现在“=”的左边,可以对非const的左值赋值,对左值还可以取地址,左值引用就是左值的别名。int main()//左值int a = 10;//左值引用return 0;右值也是一个表示数据的表达式,如:字面常量、表达式返回值,函数返回值(这个不能是左值引用返回)等等,

2024-03-31 20:23:43 802

原创 C++ unordered_set和unordered_map

不能随便的物理删除一个元素,不然会影响查找操作,比如现在有一个场景:你删除了一个元素,然后要查找的元素在你删除元素的后面,根据上面的查找规则,你是查不到这个元素的。怎么放进去的就怎么找出来,对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中按此位置取元素比较,若关键码相等,则搜索成功。相信大家看了这个例子,可以体会到哈希的妙,但这出现了一个问题,两个元素映射到了同一个地方,这种情况叫。在往该结构中插入元素时,通过关键码和一个函数,计算出存放该元素的位置。:获取键值中查找元素的个数。

2024-03-24 22:23:15 735

原创 红黑树(Red Black Tree)

/ 节点的颜色// 红黑树节点的定义{}// 节点的左孩子// 节点的右孩子// 节点的双亲(红黑树需要旋转,为了实现简单给出该字段)// 节点的值域// 节点的颜色注:这里节点颜色默认是红色,记住这个特点,后面会有用。

2024-03-15 13:11:27 863

原创 AVL树讲解

和搜索二叉树节点相比,AVL树节点多了一个父节点和平衡因子(不是必要)需要维护。,_bf(0){};//左节点、右节点、父节点T _data;//平衡因子int bf;

2024-03-08 23:41:20 705

原创 C++ set和map使用

set的底层是二叉搜索树(红黑树)。set中的数据是有序且去重的。set中的数据是被const修饰的,所以不能修改,但是可以插入和删除。set默认的排序是按照从小到大的。如果想要按照自己的想法排序,需要自己写一个仿函数。和map不同的是,set底层的键值对不是<key,value>而是<value,value>。set容器查找效率很高,时间复杂度为O(log2 N)map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元 素。

2024-03-03 11:14:30 943

原创 进程地址空间

根据前面的知识我们知道,父子进程是共享代码和数据,前面打印的结果也验证了这个道理,但当子进程对数据进行修改,那么会发生写时拷贝,这也是容易接受的,但是难以理解的是修改数据,发生拷贝之后,地址竟然是一样的?数据存在内存上,一个地址竟然有两个数据,所以可以判断打印出来的地址肯定不是物理内存上的地址,其实地址空间没那么神秘,一个进程有一个地址空间,如何管理呢?其实这不是真正的物理内存而是语言层面的叫做进程地址空间,下面来看一段代码验证这个说法。,子进程会继承父进程的进程地址空间和页表。

2024-02-08 11:59:19 325

原创 命令行参数、环境变量

大家平时在写主函数时基本是无参的,但其实是有参数的,先介绍前两个参数。第二个参数是指针数组,第一个参数是该数组的个数,我们先来写一段代码来看看指针数组里面是什么。很明显,里面存放的就是我们输入的命令行,这种模式大家有没有很熟悉,没错,就是我们linux的指令,所以指令也是以命令行参数的形式实现的。

2024-02-07 23:11:10 362

原创 进程优先级、切换、调度

当多个进程等待访问资源,需要排队,所以。有优先级的原因就是资源狼多肉少。在linux中优先级的本质也就是task_struct中一个整型字段(PRI),默认值是80,并且范围是[60,99],规则是数字越小优先级越高。linux优先级允许被用户手动调整,但改变的不是PRI这个字段的值,这个是不允许改变的,改变的是task_struct中另一个整型字段(nice)。最后该进程的优先级通过这两个字段相加确定。

2024-02-06 17:55:59 819

原创 进程状态、排队

这里可能会有疑惑,为什么该段代码一直在死循环的运行,但状态还是Sleep呢?关键在于printf这个函数大部分时间还是处于一个等待硬件资源的过程中,所以很难查到运行状态,你以为printf执行的很快,但不要以自己的想法衡量CPU的速度。之前的文章我们有个结论,进程 = PCB + 可执行程序,那么进程排队是谁在排队呢?但和一般的双向链表的实现不一样,指向下一个task_struct的指针指的不是起始地址。,就像我们找工作,是简历排队。果然变成的运行状态,后面的加号是什么意思呢?,解决办法后面会介绍。

2024-02-05 22:46:05 1051

原创 进程的基本概念、查看、创建

我们在玩电脑的时候是可以启动多个程序的,比如边听歌边写博客,根据上篇文章我们知道肯定要将多个.exe文件加载到内存中,作为操作系统肯定是要管理这多个加载到内存的程序。如何管理呢?六个大字,先描述再组织。

2024-02-05 12:05:22 319

原创 理解进程的一些知识准备

计算机有很多的体系结构,但到如今,冯诺依曼体系结构变成了主流。输入设备:话筒、键盘、摄像头、鼠标、输出设备:声卡、显示器、打印机、。存储器就是内存。这里每个硬件都是的,所以一个电脑会对应着很多硬件的厂商。但是每个硬件需要通过主板总线起来,达到信息/数据在各个硬件设备之间流动()的目的。数据拷贝的整体速度决定着计算机的速率的重要指标。这里有个问题,存储器(内存)存在的意义是什么?我们直接将输入设备的数据交给CPU处理,然后再给输出设备不是更好吗?恰恰相反,内存的存在很有意义,。

2024-02-04 16:55:45 404

原创 C++ 二叉搜索树

对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。如果对于同一个关键值的集合,插入的顺序不同,那查找的效率就不同,如果插入完之后,形状和满二叉树一样,那查找效率最高为。先从根开始比较,如果查找的值大于根,根据该树特点,那么要查找的值肯定在右子树,然后再查找右子树,否则相反。先从根开始比较,如果要插入的值大于根,就插入右子树,继续比较,直到为空,然后插入该值。,但如果插入完之后,形状是竖直的,那么查找效率就退化到。

2024-02-02 17:02:18 919

原创 C++ 菱形继承和虚拟菱形继承

可以看到A只有一份,成功的解决了问题,但又产生了一个新问题,A不在B和C里,那B和C如何找到A呢?关键字就行了,但要注意的是virtual只需要加在会产生两份的继承位置,比如B、C都继承A,这就需要加上virtual关键字,而D继承B、C就不需要用关键字。菱形继承是多继承的一个特殊情况,多继承是指一个子类类继承了两个或以上的直接父类,而菱形继承问题的产生是因为该子类的父类,继承了同一个父类,下面这张图就是直接父类,因为形状像一个菱形就称为菱形继承,但如果不是直接父类,这个形状就不是菱形了,但还是菱形继承。

2024-01-31 23:47:23 408

原创 C++继承详解

继承是面向对象编程中的一个重要概念,它允许一个类(称为子类/派生类)继承另一个类(称为父类/基类)的属性和方法。子类可以重用父类的代码,并且可以添加自己的新属性和方法,或者重写父类的方法以满足自己的特定需求。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。class 派生类 : 继承方式 基类protected:int _age;

2024-01-28 22:57:27 939

原创 C++ stack_queue详解

在官方的文档介绍里,给我们之前介绍的vector、list定义为容器,而stack为容器适配器,即对容器进行了一层包装。stack专门用于需要先进后出属性的情况中。stack如果不指定底层的容器的话,默认的是deque容器,但vector、list容器也能适配。和stack一样,queue是一种容器适配器。queue专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。stack如果不指定底层的容器的话,默认的是deque容器,注意vector容器不能适配。

2024-01-26 23:27:35 859

原创 c++ list详解

list的底层结构是带头双向循环链表,因为该结构的特性,使list可以在常数范围内在任意位置进行插入和删除,但是不支持[]随机访问。

2024-01-24 23:28:20 2226

原创 C++ vector容器

erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是没有元素的,那么pos就失效了。迭代器失效的本质就是指向了一块已经被释放的空间(野指针),那什么情况会导致这个问题呢?很明显就是在扩容和缩容的时候,一些接口比如:resize、reserve、insert、assign、push_back都会导致底层空间的改变,导致迭代器失效。start:指向空间的开头。

2024-01-17 12:16:55 892

原创 数据结构实验之迷宫

该程序使用广度优先遍历、easyX界面化显示。

2023-11-15 22:53:26 149

原创 C++模板初阶

T2 _age;

2023-11-15 22:47:46 31

原创 Linux环境基础开发工具之yum&&vim

源代码安装 – 交叉编译(很麻烦)rpm包直接安装(有人写好的程序打包)yum安装前两种方式都不推荐,我们来认识一下yum。yum就是Linux中预装的一个指令,用于搜索、下载和安装对应的软件。类比于手机,yum其实就是Linux中的应用商店vim是一款多模式的编辑器,还有很多子命令进行代码的编写·

2023-11-11 23:11:20 25

原创 详解C/C++内存管理(new、delete)

我们来看一下用C语言的malloc、free和C++的new、delete对于自定义类型的动态管理的差别。class Apublic:A(int b),b(10)cout << "调用了构造函数" << endl;~A()cout << "调用了析构函数" << endl;int b;delete a2;return 0;通过调试和打印结果我们可以看出这两者之间的差别了,也就是。

2023-11-11 13:02:42 134

原创 类和对象终终

外部类不能访问内部类的成员,反而内部类天生就是外部类的友元类,可以访问外部类的成员。

2023-11-05 23:46:17 25

原创 类和对象终

这就引出了一个问题,对于。

2023-11-03 21:46:31 19

原创 再再探C++类和对象

会产生冲突。

2023-11-02 17:45:43 23

原创 详解Linux权限

在公共路径上才可能会发生上面的情况,可以不经过别人的允许,把别人的文件删除的情况,所以粘滞位起到了作用,有人会疑惑直接把tmp目录的w权限的去掉不就行了,这是不合理的,因为去掉了就新建不了自己的文件了。从上面目录权限中,我们可以发现一个问题,只要一个用户对一个目录有w权利,就可以删除目录里所有的文件,有些文件的拥有者可能是其他人,这样是不合理的,我创建的文件凭什么被你删除?(属于root),如果用户在这个配置文件中则可以执行sudo命令,不在的话就会报上述的错误,只有root才能将用户添加到白名单。

2023-10-29 00:17:46 20

原创 再探类和对象 C++

上面这段代码是错误的示范,因为上面的代码使用的是编译器默认生成的拷贝构造函数,完成的是浅拷贝,也就是两个对象的指针成员指向的是一块空间,根据上面我们所学的析构函数可知,当对象的生命周期结束,编译器会自动调用析构函数,完成资源回收,所以上面这段代码对一块空间free了两次(根据运行结果也能看出),所以错了。在我们学习c语言版的数据结构的时候,我们经常会调用初始化函数来初始化我们自定义的数据结构,这未免有点麻烦,而且有时候会忘记调用,造成未知的后果,那能否在对象创建的时候就把信息设置进去呢?

2023-10-24 23:43:04 22

原创 初探类和对象 C++

但是在C++中更喜欢用class关键字来定义类//类体//分号别忘类定义的两种方式声明和定义全部放在类体中,注:如果以这种方式定义的话,类体中的函数默认是内联函数。int b = 20;声明和定义分离,(声明在.h,定义在.cpp),类体中的函数需要加上前面两种方式可以混用。int b = 20;

2023-10-20 23:48:06 18

原创 C++基础语法之内联函数、auto关键字、范围for循环、nullptr

在一些语言中,如:python等语言中,我们定义一个变量是不需要声明变量类型的,而是让编译器自己去推导,使得代码写起来更加的方便。所以C++11引入了auto关键字。auto b = a;//typeid是用来识别变量类型的return 0;

2023-10-17 23:48:19 45

原创 C++基础语法之函数重载、引用

一个实际的项目中通常包含多个的头文件和源文件,由我们前面的知识知道,当a.cpp调用b.cpp中定义的函数的时候,汇编形成的a.o文件是没有该函数的地址的,该函数在b.o中,所以后面的链接步骤是用来解决该问题的,链接器看到a.o调用函数,但是没有函数的地址,就会到b.o的符号表中找函数的地址,然后链接到一起,那么链接是根据哪个名字去找到该函数的呢?所以我们可以解释上面的代码了,a转换成int型使生成的临时变量,而临时变量具有常性,但是b确没有,所以这里权限放大了,发生了错误,我只需限制b就行。

2023-10-15 18:04:30 40

原创 C++基本语法之命名空间、输入输出、缺省参数

需要用到关键字namespace,后面接空间的名字(自己定义),后面接{},在{}里定义变量。命名空间里不仅可以定义变量还可以定义函数、结构体等等,跟你在全局里定义一样,只是用命名空间封起来了。//因为和在全局定义变量一样,所以scanf变量默认为0int scanf;int data;命名空间里还可以嵌套命名空间//因为和在全局定义变量一样,所以scanf变量默认为0int scanf;int data;int scanf;

2023-10-14 23:28:55 39 1

原创 归并排序详解

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;,其中n是待排序数组的长度。这是因为在归并操作中,我们需要将两个已排序的子数组合并成一个已排序的数组。合并两个子数组的过程需要遍历这两个数组并逐个比较元素,因此时间复杂度是线性的。分割操作的时间复杂度取决于分割的过程。在归并排序中,我们将待排序数组递归地分割成两个子数组,直到每个子数组的长度为1。

2023-10-02 13:28:19 36 1

原创 交换排序详解

随着递归层数的增加,要建立的栈是呈指数级增长的,但是快速排序的最后几层,左右区间很短,但又占着大部分的建立的栈,所以我们判断一下,如果区间很小就没有必要快速排序了,用一些常规的排序例如插入、冒泡之类的就行,数据量小切接近有序的情况下我们大多数情况下选择插入排序。所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。当使用的是递归方法时,由于每一层都需要开辟栈空间,故空间复杂度为。

2023-10-01 23:13:40 113

原创 选择排序详解

可能很多小伙伴会想着建小堆可以直接拿到最小的数了,不是很好吗,确实是这样,但是往后想,你取走第一个数之后这个堆的结构被破坏了,要重新建一个堆再取最小数,但是建堆的时间复杂度很高,所以这样还不如上面的直接选择排序,所以我们选择建大堆,取得最大的数和最后一个位置交换,这样没有破坏堆的整体结构,只需向下调整之后,就可以重新选到最大值,向下调整算法的时间复杂度很低,所以我们选择建大堆。堆中的每个节点的值都必须满足堆的性质:对于最大堆(大顶堆)来说,父节点的值大于等于其子节点的值;,所以总时间复杂度为。

2023-09-30 21:59:41 17

原创 插入排序详解

当插入第n个数据的时候,前n-1个数据已经排好序了,此时,只需要将该数据和n-1、n-2……个数据比较,直到找到比它大/小的数据(根据你排升序还是降序)然后插到它后面,没找到的时候将数据往后移。考虑到最坏的情况,就是给出要排列的序列是逆序,每次的while循环都要走到最后,故时间复杂度可以写成 1 + 2 + 3 + ……希尔排序的分析是一个复杂的问题,因为它的时间是所去gap的序列函数。所公认的几个时间复杂度为。这个没什么好说的,没使用额外的数组或者栈空间,为。在我们打扑克牌的时候用的就是这个思想。

2023-09-30 18:26:39 20

原创 程序环境和预处理

_FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义语法# define A 100 //标识A为100 # define CASE break;case //在写case语句的时候自动把 break写上。# define p int * //为int*类型创建一个简单的名字100。

2023-07-24 17:42:37 34

原创 文件操作(C语言)

本篇我们学习的是文件相关的操作,例如文件的打开、读取等等,还有流的概念。磁盘文件就是文件。当谈到文件一般有两种(按功能来分),程序文件和数据文件。流的概念C语言的I/O系统为用户提供了一个接口,该接口与实际的存取设备无关。只是设备的一个抽象表示形式。这个抽象的接口称为流,实际的设备称为文件。C文件系统可以与各种设备一起使用,如打印机、硬盘、终端等,缓冲文件系统可以将每个设备转换成逻辑设备,即所谓的流。所有的流工作方式类似,所以很容易操作不同的设备。stdin:标准输入流 --键盘。

2023-07-23 15:49:07 64 1

原创 动态内存管理

之前我们创建的变量大小都是固定的而且存在于栈,现在关于动态开辟的内存是存在堆区的,本篇就来学习一下动态内存管理。c语言库里提供了动态开辟空间的函数malloc(1)该函数的作用是开辟一块连续的空间并返回这块空间的起始地址。(2)注意size的单位是字节数。(3)注意返回值是void*,要根据实际情况强制转换。(4)假如因为内存不够开辟失败的话,该函数会返回NULL。(5)假如你传参为0个字节的话,发生的事是未定义的,取决于你的编译器。c语言库里还提供的释放和回收动态开辟空间的函数free。

2023-07-22 16:14:28 62 1

原创 结构体、枚举、联合

c语言库里定义了很多类型,比如int、char、float…之类的,但有很多东西不能用这些类型定义,比如一个学生是什么类型?说什么都说不过去吧。所以c语言允许我们程序员自定义类型,接下来就带大家看看。定义int x;int y;} p1;//声明类型的同时定义变量p1 struct Point p2;//定义结构体变量p2初始化//初始化:定义变量的同时赋初值。x , y };struct Stu //类型声明 {//名字 int age;//年龄 };

2023-07-17 21:39:27 35 1

原创 字符函数和字符串函数

相信大家写代码的时候,对字符串的处理是很频繁的,如果我们用自定义函数来处理,不免有点麻烦,今天我带大家了解并模拟实现c语言库里提供的函数,可以大大简化我们的工作。//库函数的定义(1)该函数是用来求字符串长度的,字符串以‘\0’结尾,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数**(不包含 ‘\0’ )**。(2)该函数的返回类型是size_t,这是c语言库里面typedef了一下,其实是unsigned int类型。(3)使用该函数要确保传的字符数组和字符串以’\0’结束。

2023-07-16 11:39:03 75 1

原创 指针进阶详解

arr和&arr不相同arr代表数组首元素地址而&arr代表数组的地址。

2023-07-11 17:43:00 46 1

空空如也

空空如也

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

TA关注的人

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