自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 简单描述动静态库

我们平常写代码包含的头文件就属于库文件,库文件又分为动态库和静态库两种。动态库以.so结尾,静态库以.a结尾。

2024-01-25 21:46:29 274

原创 模拟实现一个简单的shell

在Linux中我们在输入命令的时候,接收命令,执行命令的叫做shell,在Linux中多数默认的shell是bash,bash也是也是一个程序,我们可以使用c语言编写模拟实现一个简单的bash。

2024-01-12 18:56:56 395

原创 红黑树简单概念

红黑树是一种近似平衡的树状结构,每一个节点有一个表示颜色的成员变量,颜色是红或者黑中的一种,红黑树用以下限制来保证近似平衡。我们在插入一个新的节点的时候要决定它的颜色,其实无论他是什么颜色都会破坏规则,我们选择红色,这样影响的范围比较小。我们可以将p节点和u节点调整为黑色,g节点调整为红色,这个时候g节点还需要调整,因为g节点的父节点可能是红色。情况二: **cur为红,p为红,g为黑,u不存在/u存在且为黑 **p节点进行左单旋,g节点右单旋再变色。u为p的兄弟节点即叔叔节点。插入节点的情况又有很多。

2023-12-26 19:20:02 370

原创 c++11详解

c++11的上一个标准版本是c++03,由于c++标准协会是一个非盈利的组织,c++03的下一个版本拖延到了2011年才确定下来,c++11带来了很多新的语法,修复了约600个缺陷。

2023-12-24 16:44:29 910

原创 了解vector使用以及模拟实现c++

我们在使用vector中不断将元素插入到vector中,vector的容量大小会自动改变,编译器为了效率,会一次增加比较大的空间,具体的是多少视编译器而定。原因就是上面的操作导致vector扩容,原空间被释放,这个时候it就是指向一段被释放的空间了。元素,这意味着可以使用下标访问它的元素,这和数组很像,但是vector是可以。,在其他位置操作涉及到挪动数据效率较低。1.vector是一个表示。删除操作也会导致迭代器失效。其中有两个点需要我们注意。大小数组的序列容器。3.vector在其。

2023-12-12 16:09:01 371

原创 c++的set与map学习笔记

关联式容器中存储的数据是一对一对的形式的键值对数据,每一个key都有对应的value数据,类似于字典的形式,通常使用一个结构体pair来存储这样的数据,以下是pair的定义。1、set的底层是使用搜索二叉树(红黑树)实现的,所以set中存储的数据总是有一定的次序默认小的在左边。map与set所不同的点在于map存储的是真正的pair,pair中有key和value值。map和set一样是基于搜索二叉树构成的,大致的结构是类似的,当然也有不同的点。insert的返回值是一个pair值。

2023-11-14 14:47:12 28

原创 C++继承笔记

子类的析构函数必须先执行析构子类的成员,再执行父类的析构函数,如果反过来的话有一些子类在执行的时候要使用父类的一些数据,但是这个时候父类的成员已经被释放了,会导致问题,编译器会强制最后执行父类的析构函数。父子类的作用域是相互独立的,如果父子类中有同名的成员,这个情况构成隐藏,也叫重定义,默认只会访问子类的成员,也可以通过指定父类作用域的方式访问父类的同名成员。如果父类的构造函数被我们定义了,那在子类的构造函数中必须显式调用父类的构造函数,子类无法初始化父类的成员变量,但是可以改变父类成员变量的值。

2023-11-02 16:38:41 21

原创 C++内存管理

自定义类型使用new和delete的方式与内置类型无异,差别在实现方式上public :delete A;return 0;在使用new和delete操作自定义类型时会调用类的构造函数和析构函数我们在使用new和delete操作多个对象的空间时候,new和delete会对每一个对象分别调用构造函数和析构函数。这里的new还有一种用法叫定位new,就是说使用new来初始化一个没有初始化的对象new(p1) A;如果这个类的构造函数有参数则需要传参。

2023-05-23 20:54:05 38

原创 Linux中的权限

一个文件能否被删除,取决于这个用户有没有文件夹的写权限,这就容易导致一个问题,你创建了一个文件,你不想被别人访问他,但是别人却可以删除他,这就有点不合适了,在Linux中有一个特殊的权限粘贴位,只要给这个文件夹设置了这个权限,用户在这个文件夹就不能删除别人的文件了,使用方法为root用户为文件夹添加。比如一个文件的权限为rwxr-x-rw-,用二进制表示为111 101 110,每部分相加得到7 5 6,我们可以使用字母设置权限,也可以使用数字设置权限。在Linux中设置权限的指令为chmod。

2023-05-23 16:57:02 68

原创 C++类和对象(下篇)

其实我们在使用带有返回值为类的的函数或者参数为类的函数的时候,也会调用拷贝构造函数。

2023-05-19 17:10:09 33

原创 C++日期类的实现

由于日期类的成员都是简单的内置类型,我们可以不用写析构函数,这个时候编译器会自动生成一个简单的析构函数,可以将其处理,需要注意的是,如果成员变量有数组之类或者复杂的自定义类型时候,我们需要手动写一个析构函数进行处理。我们在实现部分运算符需要注意返回值,因为我们经常会有a=b=c=0,这样的操作,为什么我们先实现+=呢,因为+不改变自身,我们实现+的时候可以复用+=如果我们想对日期进行加减之类的操作,这个时候就需要我们使用运算符重载,在operator后面加上重载的运算符就可以自定义实现对运算符的重载。

2023-05-03 20:31:27 66

原创 c++类和对象(上篇)

我们在调用mc.print的时候为什么能够准确的打印出10和k,c++给每个非静态的成员函数引入一个this执政,让成员函数指向该对象,ptint中访问i和c的操作都是通过this指针实现的。析构函数,就是释放对象变量课件的函数,当对象生命周期结束的时候,c++会自动调用,当用户没有定义这个函数的时候会自动生成,析构函数的函数名在类名之前加一个~,要求无返回值。c++是面向对象的编程语言,面相对象的意思就是在解决问题的过程中,注重在解决问题的过程中把事情拆分成不同的对象,通过对象之间的交互完成的。

2023-04-23 10:21:19 37

原创 c++中的引用

内联函数的实现就是在调 用该函数的位置将其展开,避免建立栈帧,但是直接展开会导致代码量加大,所以你在函数声明前加上inline之后,编译器会对函数进行判断,如果函数代码量比较大,则这个函数不会成为内联函数。当一个小型函数要进行大量的调用时候,重复建立栈帧的动作会消耗大量的性能,内联函数的出现就是为了解决这个问题,在定义函数的时候在前面加上 inline 关键字就能建议编译器将此函数成为内联函数。上面的代码中,是把x的值赋值给了b,这使得a和c的值都变成了20,并不能实现把b的指向修改成x。

2023-04-20 11:09:37 39

原创 c++命名空间、重载函数和缺省函数笔记

比如在工作中你定义了一个函数并且已经大规模使用,然后这个项目需要使用一个库函数,你就包含了一下头文件,但是这个头文件中有一个函数和你定义的函数重名了,这个时候就会很麻烦。这个是如何实现的呢,c++和c在编译的时候稍有不同,c++编译的时候会将函数参数也一起体现在函数名中(编译之后的文件中),在你调用的时候通过识别参数类型来调用相对应的函数。因为编译器在编译的时候先找到声明,如果调用的时候没有给全参数,声明中也没有给默认参数,这个时候就会报错,也不能声明和定义同时给,因为怕你写错。我们要避免写出这样的代码。

2023-04-16 20:48:50 54

原创 数据结构八大排序

冒泡排序的思想是从第一个数据开始不断地向后比较,如果这两个数不满足目标顺序则进行交换,这样一趟循环下来可以确认数据最后未排序的数据。时间复杂度O(N^2)空间复杂度O(1)稳定性 是插入排序的思想是类似于我们在打牌的时候理牌时候的方法每轮排序选择一个数字向前比较,直到到达合适的位置则插入该位置时间复杂度在数组接近有序的时候比较快,如果数据为倒序则时间复杂度为O(N^2)空间复杂度O(1)稳定性 是希尔排序属于是插入排序的进阶版本如果直接使用插入排序,如果数据为逆序,则后面的数据要转移到前面

2023-04-13 14:39:39 38

原创 二叉树与堆学习笔记

但是向上调整和向下调整要求堆调整的时候调整目标方向的结构也为堆,我们面对一个无序的数组的话,我们可以从第二层开始向上调整或者倒数第二层开始向下调整来避免这个问题。对于堆的删除,我们选择删除堆顶的数据,因为堆顶的数据总是最大或者最小的,我们通过交换堆顶与最后一位的数据,再把堆顶交换过去的数据进行向下排序来完成数据的删除。如果把一个数组看出一个堆,那么下标位置为N的节点的父节点为(N-1)/2,下标为N的左孩子为N。堆的排序不能直接选择排升序就建小堆这种的形式,因为不能保证一个小堆在数组中的顺序的完全升序的。

2023-04-09 20:02:11 48

原创 数据结构队列笔记

循环队列是一种有限容量的,空间可以循环利用的队列,循环队列没有固定的头和尾,需要根据情况灵活判断。第一个结构体代表单个节点,下面的结构体表示整个队列,使用时候构建结构体也是使用下面的结构体。2.在队列中多留一个空间作为未来要插入数据的位置,如果该空间的下一个是头节点,说明队列已满。队列是先进先出的一种结构,出数据只能在从队头出,进数据只能从队尾进。1.在队列中加入一个变量size,如果size和容量则队列已满。i由于循环队列的空间是有限的,所以我们使用数组来实现。

2023-04-03 21:04:55 37

原创 C语言预处理

预处理 c语言预编译链接器

2023-02-14 15:55:07 52

原创 结构体在内存中的存储

这个数在不同的环境中不同,在vs2022中这个数默认是8,而每一个结构体成员的对齐数就是这个成员自身大小和默认对齐数中较小的那个。比如成员n自身大小是4,而默认对齐数是8,取其较小值,所以n的对齐数是4。如果结构体成员中嵌套有结构体,那属于成员的结构体要对齐到自身成员中最大对齐数的整数倍处,那么这个结构体大小要是,所有成员(包括嵌套结构体中的成员)中最大对齐数的整数倍。如上结构体a中有四个字节大小的整形n,也有一个字节的字符c等,结构体存储并不是简单的将这些变量紧挨着存在一起。上面的结构体a的大小是12。

2023-01-14 16:20:44 136

原创 c语言数据在内存中的存储

对于我们大于为8位的处理器,例如16位32位和64位的处理器,寄存器宽度大于8,就面临多个字节如何安排的问题,就这样产生了大小端字节序的问题。有效数位M总是大于等于1小于2,所以在存储的时候,就不存1了,直接存小数点后面的数,比如保存1.01的时候,只保存01,取出来算的的时候再把1加上,这样就能多保存一位了。而有效数位M又是怎么来的呢,比如5.0,转换成二进制就是101.0,再把小数点左移2位得到有效数位1.01,而这个时候指数位E就是2,上面的公式就是1.01*2^2。这是32位浮点数在内存中的存储。

2023-01-04 11:40:56 97

原创 c语言入门操作符

两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同。

2022-11-04 09:28:27 114

原创 c语言入门递归实现字符串逆序

c语言入门递归实现字符串逆序

2022-11-04 08:40:20 101

原创 c语言初步学习

编写代码模拟三次密码输入的场景。 最多能输入三次密码,密码正确,提示“登录成功”,密码错误, 可以重新输入,最多输入三次。三次均错,则提示退出程序。关键在strcmp函数,比较字符串内容是否相等

2022-10-20 09:33:27 134

空空如也

空空如也

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

TA关注的人

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