自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 环境变量,本地变量,命令行参数和内建命令

系统指令能够直接执行,自己编写好经过编译的程序需要加上前缀./才能运行,原因是在系统的一个名叫PATH的全局变量中存放了系统指令所在的路径: 在当前路径下有一个编译好的可执行程序,command,将该程序的路径加入到PATH环境变量中,也可以像系统指令一样,不需要加./前缀就可以直接运行: PATH=$PATH:【要添加的内容】 添加好后自己编译的程序可以直接运行: 要查看系统中所有的环境变量用env指令: HOME记录用户的家目录HISTSIZ

2024-02-20 21:37:07 919

原创 C++11中的简化声明

用于自动类型推断,显示定义变量: typeid推导出来的是字符串,只能看不能用,通过打印来查看变量的类型,用法如上。 同样是用来自动推导类型,与auto的区别是,auto在定义时必须赋值,它需要通过等号右端的常量或者变量来推到类型,如果你只想定义一个变量不希望赋值,就用decltype: 为了补NULL的坑。早版本NULL被定义成了字面常量0,但我们期望它的涵义是地址为0的一个指针: C++11用nullptr来表示空指针。 工程实践中如

2024-02-12 19:35:20 428

原创 {}初始化和初始化列表

{}初始化和初始化列表是对内置类型和自定义类型初始化时底层的实现的差异,但是在语言层面实现的效果是相同的。对于内置类型或者自定义类型来说,用{}初始化是对C++98花括号功能的拓展,如果{}内的参数有相应的构造就去调用相应的构造,如果没有相应构造,并且{}内的参数类型与类成员变量类型匹配会依次赋值。如果{}内的参数类型与成员变量不匹配,并且没有相应的构造,编译器就会寻找构造函数中是否有initializer_list类型的形参,然后执行构造的代码。和自定义类型进行初始化,使用时,可以加=号,也可以不加。

2024-02-12 18:48:20 409

原创 Liunx:线程控制

说线程的时候说过,liunx没有选择单独定义线程的数据结构和适配算法,而是用轻量级进程来实现线程,有人将轻量级进程的系统调用进行了封装,在应用层实现了线程的相关功能,目前大部分的liunx平台都默认安装了第三方库,pthread.h。

2024-01-18 22:13:06 2033

原创 虚拟地址如何转换到物理地址

当数据第一次被加载到cpu时,它会被放到CPU内部的缓存中,目的是为了暂时保存从内存中加载的数据,访问页表寻址是消耗时间的,缓存的存在就是为了优化cpu频繁访问内存中的同一个数据的情况,并且加载到内存中的不仅仅是你访问的数据,还有该数据上下地址范围内的一些数据(预加载),所以cpu的访问数据的顺序是先去缓存中查找,包括一级缓存二级缓存三级缓存,如果缓存中存放了自己需要的数据,那么就叫做一次命中。而多个线程由于访问的都是同一个程序的数据,所以线程切换的时候缓存中的数据不需要替换。这里以32位虚拟地址为例。

2024-01-17 17:36:52 1070

原创 Liunx:线程

进程在liunx中用一个结构体来定义,该结构体中有一个成员叫做页表,每一个程序都有自己各自的页表,页表的作用是完成虚拟地址到物理地址的映射。对于CPU来说,他调度的基本单位是一个PCB,我们为运行一个程序先创建了一个PCB,CPU调度该PCB又基于同一份代码文件创建了多个PCB,也就是线程,相应的线程执行这个代码文件的部分功能,那么通过这个操作,将原本一个较大的程序,分割成了多个较小的执行流,这些多个执行流共同构成了该程序(进程),所以我们说,线程具有比进程更小的粒度,线程是CPU调度的基本单位。

2024-01-17 15:51:32 909

原创 mysql

数据库文件所在路径以及日志文件所在路径:

2024-01-14 14:17:47 525

原创 Centos7 安装与卸载mysql

下载的是一个mysql的yum源,下载执行以后,你系统的安装源中会新增一个mysql的安装源,相当于一个mysql的应用商场,安装好该yum源之后,你再使用yum安装mysql指令,系统会为你自动安装与自己系统匹配的版本。将查询到的mysql安装包以命令行参数的形式传递给 yum -y remove指令,也就是逐个卸载查询到的mysql。如果不可以就修改 /etc/my.cnf 配置文件,在文件的最后一行加入一行。到此,mysql写在完成。没有的话就不需要卸载咯。写在完成后,mysql还有些残留数据 在。

2024-01-14 13:38:11 657

原创 Git使用

git提交,暂存库,版本库,分支查看,切换,删除,新建,合并等常用操作

2024-01-03 21:19:29 1150 1

原创 Liunx:进程

我们用一个具体的例子来解释.我们都做过学生,学校中的管理能够很好的解释我们是怎么被管理的.我们把模型简化一下,校长,辅导员,学生.校长就是一个典型的管理者,但是我们作为被管理者,校长很少直接面向我们进行管理,但是我们被管理的很好,并且一切工作也都有序,这就说明,管理者与被管理者之间不需要面对面才能实现管理.那么面都不见,怎么把我管理好的?

2023-08-03 18:13:13 235

原创 搜索二叉树

二叉搜索树本质上是一个二叉树,它的特点是,要么为空,要么具有以下性质: 1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 2.若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 3.它的左右子树也分别为二叉搜索树 二叉搜索树也被叫做二叉查找树或者二叉排序树 这里实现增删查改: val的类型根据传入的模板参数定义,left和right为指针,分别指向左孩子右孩子,同时给了默认构造,新节点构造将val设

2023-07-29 11:33:02 75

原创 C++:多态

首先先说重写与重定义:重写与重定义是发生在继承体系中的,当子类继承了父类,子类成员与父类成员有着各自独立的作用域,你通过子类调用一个成员函数,编译器会首先在子类的类域中寻找该函数,如果没有,则到父类的类域中去寻找该函数,那么又会有这样一种情况发生,子类中的函数与父类中的函数存在同名函数,并且参数列表也相同,同时不是虚函数,这个时候,我们就说二者之间构成了重定义,重定义又叫隐藏.这个时候你该说了,那这不就是重载吗?

2023-07-27 19:36:34 169 1

原创 C++:模板

在C中,加入我们要实现一个函数,该函数的功能是实现两个变量之间的交换,我们希望该函数不仅可以实现int类型的交换,还可以实现double,char等内置类型的值交换,一种解决办法是通过函数重载实现:用函数重载虽然可以实现,但是有一下几个不好的地方:1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数2. 代码的可维护性比较低,一个出错可能所有的重载均出错。

2023-07-24 18:09:04 66

原创 C++:vector 模拟实现

vector的以下三个私有成员,start_是首元素地址,finish_指向最后一个元素的下一个位置,end_ofstroage是空间上限的位置。

2023-07-19 18:08:57 65

原创 C++:string模拟实现

reverse()在开辟空间的时候只调整了capacity_,而重载的 [ ] 在使用的时候需要先对pos进行检查,pos如果大于size_直接返回终止符的位置,所以我们返回的tmp串中既没有终止符,size_也是0,我们后续重载流插入和流提取的时候,size_时判断字符串是否结束的重要标志,所以如果出现这个错误,返回值直接打印一堆乱码.n如果小于capacity_我们直接返回,如果大于,新开辟一块空间,还是需要注意新开辟空间的大小是n+1,终止符在用户眼里是看不见的。

2023-07-16 16:08:31 71

原创 C:排序算法

1.直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用2.时间复杂度:O(N^2)3.空间复杂度:O(1)4.稳定性:不稳定堆排序:堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是 通过堆来进行选择数据。

2023-07-15 15:58:12 38

原创 C:预处理符号

目录 预定义符号: #define #define定义标识符 #define 定义宏 #define 替换规则 #和## 带副作用的宏参数 宏和函数对比 undef: 命令行定义 条件编译 C中内置的一些预定义符号: 这里的预定义符号是预处理符号中的其中之一,预处理符号在文件预编译的时候会被处理,我们在liunx中用g

2023-07-04 09:40:22 51

原创 liunx开发工具--gcc

对c/c++文件直接编译:编译完成后再当前目录下会生成可执行执行文件:对c++文件将gcc指令改成g++

2023-07-01 16:54:21 50

原创 liunx--将用户添加到白名单

su指令输入密码后切换到root用户。这里就是相应的配置信息.在底行模式下输入wq!

2023-06-30 18:19:57 488

原创 Liunx--vim使用

vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window、 mac os、windows。

2023-06-23 12:21:30 138

原创 Liunx权限

读,写,执行权限,分别可以用一个二进制位表示,也就是我们可以用三个比特位来表示三种权限的状态,如果有相应的权限,相应的比特位置为1,没有则置为0,例如,可读可写可执行可以表示为111,可读可写可以表示为110,依次类推.当我把权限修改成如上图所示,我的身份是os,是test文件的拥有者和所属组,我作为权限的拥有者只有可读权限,而作为所属组成员,我具有读写权限,那么我最终的权限是遵循哪一个呢?对目录来说,具有进入目录的权限。其计算过程是,将权限掩码按位取反,然后跟初始权限进行&操作,结果为最终的文件权限.

2023-06-22 18:42:01 46

原创 Liunx基本指令

tar指令是liunx中的打包压缩指令,将文件打包压缩.打包的意义在于,将数量较多的文件,例如100个文件由A发给B,如果不打包,100个文件依次发,同时在文件的网络传输过程中,可能会出现文件的丢失,100个文件发出只接受到了99个文件,丢失的文件需要经过99次对比才知道丢失哪个文件然后重发,将文件打包成一个文件,要么全部丢失重发,要么一次全部到位.而压缩则是通过特定的算法将文件内容重新编码让文件中的字节数减少,解压的时候再按照特定的算法还原,压缩文件后体积变小,网络传输较快.

2023-06-07 13:49:04 141

原创 C++:函数重载

1.参数类型不同2.参数个数不同void f()3.参数类型顺序不同3、参数类型顺序不同注意:1.返回值不同不能够构成重载.2.参考下面代码,两个Function()函数构成重载,但是在调用时由于都不需要传参,编译器在编译时构成歧义,到底该调用哪一个?1.列表参数不同的同名函数构成重载,这里列表参数不同即:形参个数不同,形参类型不同,形参类型的顺序不同.2.c代码编译可执行文件经过了预编译,编译,汇编,链接几个过程:预编译阶段去掉注释,头文件展开,宏替换,条件编译.

2023-05-28 15:11:02 59

原创 C++:缺省参数

概念: 缺省参数是声明或定义函数时为函数的参数指定一个缺省值(默认值)。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

2023-05-28 11:41:37 49

原创 c++:命名空间

C++命名空间

2023-05-28 11:23:10 49

原创 c++:构造函数

1.构造方法是为了自动化结构体初始化的过程.2.当未显式定义构造函数时,编译器会自动生成默认构造方法,编译器自动生成的默认构造方法对内置类型变量和自定义类型变量区别处理:(1) 对内置类型变量初始化时,赋随机值(2) 对自定义类型变量初始化时,调用该变量的默认构造方法3.无参构造方法,全缺省构造方法,编译器自动生成的构造方法 ,这三种构造方法被统称为默认构造方法,因为他们都不需要传递参数,并且,三种形式的构造方法在同一个类中只能有一个.

2023-05-02 21:10:56 2815

原创 C++:内联函数

2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。因为inline被展开,就没有函数地址了,链接就会找不到。

2023-05-01 12:28:57 51

原创 C++:引用

1.语法层面,引用类型是对一个变量取别名,不开辟空间,指针则是开辟一块空间存放变量的地址2.引用类型必须进行初始化,一旦初始化后,表示的空间不能再被更改3.做函数参数时,就相当于c中的传地址,在传递的数据量较大时,可以减少拷贝,提高效率3.做引用类型返回值时,要注意引用的空间需要在静态区或者堆区4.权限放缩,整型家族或者字符类型作为返回值,不能直接用相应类型的引用变量接收,要加const修饰;整型提升或者截断时的引用,也需要const修饰。

2023-04-24 20:21:17 117

原创 函数栈帧的创建与销毁

图中,上面是低地址,下面是高地址,esp减去一个值,表示esp向上走了,减去的这个值就是为main()函数开辟的栈帧的空间大小.函数内部执行完的结果在ebp-8的位置,这里执行return,就是想刚才的运算结果赋值给eax寄存器,随后函数栈帧空间被销毁.通过上文,希望你能够大致了解,函数栈帧是如何创建的,参数是怎么传递的,以及函数调用完之后是如何返回的.最后的花括号,出栈三个寄存器,每pop一次,esp++一下,然后将ebp的值赋值给esp,

2023-04-18 11:31:31 276 1

原创 队列实现:

用单链表实现队列,队列要求元素先进先出定义节点结构体QNode定义队列,包括指向队首的指针和指向队尾的指针,int size用于记录当前队列元素个数Type data;}QNode;int size;//记录当前队列元素个数} Queue;

2023-03-22 15:21:44 90

原创 栈 实现:

/动态增长的栈Type* arr;int pop;//栈顶指针用动态数组的方式队栈结构进行定义,而不用单链表,一是因为数组在CPU访问缓存时的命中率高,二是在进行入栈是,避免了链表尾插时每次都需要找尾节点的情况.

2023-03-19 18:58:47 145

原创 返回带环链表中的入环节点

fast和slow相遇, 回到第一个图,假设slow刚走到环入口,而此时fast已经走了n步,由于fast每次都比slow多走一步,所以每循环一次,slow和fast之间的距离就-1.最后的slow和fast一定会相遇.定义slow和fast指针,slow和fast指针从起始点开始,slow每次走一步,fast每次走两步,2*(L+X)=L+X+n*c;fast走的步数是slow指针的二倍.一个指针从起始点开始走,一个指针从相遇点开始走,最终会在入口相遇.就有:L=n*c-x;

2023-03-11 10:13:43 90

原创 时间复杂度

时间复杂度

2023-02-22 12:18:00 46

原创 自定义结构类型----位段

位段内存空间的分配

2023-02-09 18:20:34 57

原创 动态内存开辟常见问题

动态内存开辟

2023-01-26 12:37:28 52

原创 结构体内存对齐

结构体内存对齐

2023-01-12 15:00:22 45

原创 内存函数说明

memset、momove、momcmp、momcpy

2023-01-12 13:50:43 50

原创 字符串匹配模式--BF算法与KMP算法

BF、KMP

2023-01-10 19:53:05 187

原创 qsort函数

qsort函数使用,以及模拟实现

2023-01-06 10:05:10 88

原创 指针----进阶

指针相关内容,数组指针,指针数组,函数指针,指针常量与常量指针

2023-01-05 18:50:13 412

空空如也

空空如也

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

TA关注的人

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