自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 别在学你的C++98了,程序员需要跟上时代,快来学C++11,30000字把C++11的常用特性一次性讲清

绑定bind的底层和lambda类似,也是生成了一个仿函数,仿函数中通过我们传的 类对象 或者 对象的指针,分别通过 . 或者 -> 来访问类,我们的传递的第一个参数test_class::sub就能够确定是访问类中的哪个函数,然后后面的这些placeholder就用于控制rsub2到这个仿函数的传参顺序,也就是说,我们并没有通过bind真正的改变函数的参数顺序,只不过是套了一层外壳,外壳的顺序是我们想要的顺序,内部调用的顺序就是函数定义的顺序。比如,Fun(string&& str) { //…

2023-11-02 17:45:04 222

原创 数组越界访问导致死循环的情况

我们在程序中先定义了 i,所以先为 i 开辟了空间,里面存储的数据是0,然后再为数组arr开辟空间,并且对于数组越界的检查并没有太严格,这里我们循环这个数组,去访问到了arr[10]、arr[11]、arr[12]的空间,并分别对其赋值为0,由于栈空间的“生长方向”是先使用高地址,再使用低地址,所以在我们访问arr[12]时,就同时访问到了 i 的空间,并将其赋值为0,此时 i 从12变成了0,又继续循环下去。这种情况比较特殊,是否会触发,还需要看编译器检查的脸色,所以还得多调试看内存空间的存储情况。

2023-10-17 20:47:43 167

原创 C++ 位图与布隆过滤器

位图与布隆过滤器是用来在海量数据中判断一个数据在不在的问题的数据结构,这种数据结构在存储空间上大大的优于红黑树、哈希等数据结构。

2023-10-12 21:58:53 200

原创 Linux环境变量

第二种方法:关掉XShell,再次打开,之前的路径就回来了,因为我们使用PATH=[新路径]的方式是一种内存级别的,也就是我们修改的是内存中的环境变量,当我们关闭XShell,重新登陆XShell,原来的路径都又出现了,也就是说,环境变量是存储在了磁盘上的一些配置文件中的,当我们系统启动时,会从配置文件加载到内存中。我们在Linux中指令就是C、CPP、汇编写的程序,为什么我们自己写的程序,运行时,需要**./mycode.exe**,而像ls pwd这些指令,就可以直接运行,不需要。

2023-10-12 19:01:20 101

原创 Linux_进程 20000万字精讲

我们需要知道,任何进程在运行时是可以具有独立性的,比如我的QQ崩了,不能影响我的网易云音乐,对于父子进程,也是两个进程,如果父进程没有用到子进程的某些资源,子进程也没有用到父进程的某些资源,这两个进程也是独立的(如果用到了对方的资源,形成了依赖关系,那么对方崩了,势必会影响到自身,非父子进程也可能会发生这种情况),父子进程为了防止数据被另一个进程修改,子进程在形成时,会把父进程的程序(代码 + 数据)中的数据拷贝一份,而代码是共享用同一份,此时一个进程运行时,就不会影响另一个进程了。int status;

2023-09-20 09:27:50 93

原创 浅谈冯诺依曼体系结构和操作系统的概念

我们的计算机都是由一个个硬件设备组成的,这些硬件在冯诺依曼中扮演了不同的角色,不同的硬件之间需要协同工作,我们先来介绍一下这些组件分别是些什么a、 存储器是什么?简单来说:内存,硬件级别的缓存空间,是冯诺依曼结构的核心b、输入设备是什么?人与计算机、计算机与计算机交互的工具,比如:键盘、摄像头、话筒、磁盘(磁盘是存储文件的,具体是从磁盘文件中读取数据时作为输入设备)、网卡(计算机网络读取数据)c、输出设备是什么?显示屏、视频播放器、磁盘(具体是向磁盘文件中写入)、网卡(向网络发送数据)

2023-09-06 16:57:43 49

原创 C++关于greater和less

对于我们使用的容器和算法,比如map set priority_queue sort都是使用的less作为比较器,对于排序结果来说,是升序排列。greator和less常用于算法和容器的比较函数,比如sort、set、map、multiset、multimap。使用标准库中的 graeter< T > less< T > ,标准库中的函数可以直接使用,不需要包头文件。greater和less是函数对象,也就是仿函数,是一个类,其中包含了一个bool operator()

2023-09-03 20:40:50 1606

原创 工程利器 —— C++异常

回顾C语言对于错误处理1、assert —— 断言,直接终止程序,并且assert只能在debug环境下执行,在release版本下是无法生效的,过于暴力//fopen不会失败,断言file不为空,如果失败,直接终止程序,并告诉我们程序的终止位置// 文件操作...return 0;2、errno、perror —— 返回错误码,打印错误码对应的错误信息,需要程序员自己去调用perror查找对应的错误信息,不灵活。

2023-09-03 15:20:00 181

原创 C++ 多态

子类的虚函数表是有可能有父类的虚函数的,因为每一个父类虚函数指针(被virtual修饰的成员函数都是虚函数)都会被放进虚表,在子类对象创建时就会把父类的虚表放进子类的虚表中,然后子类与父类构成多态的虚函数就会进行重写,覆盖掉父类的虚函数指针,并且独属于子类自己的虚函数(用于子类与子类的子类构成多态) —— 简单来说子类的虚函数表就是:父类拷贝 + 子类覆盖 + 子类虚函数添加(所以这里可以看出,为什么函数重写也叫覆盖),我们并不会创建一个animal类对象,而是仅仅会使用其子类。为什么不能是父类的对象?

2023-09-01 12:56:55 52

原创 菱形继承、虚拟继承

确实有virtual比没virtual大。后面这个图,D直接继承了A,也通过B继承了A,那么此时D存储了两份A成员变量,也就是菱形继承的模样,当然也就需要给B D加上virtual,可以不用深入研究这里,因为菱形继承一般都是在笔试、面试、考研中遇到,但对于实际工作敲代码,很少会搞菱形继承这种结构来坑害自己,并且其实不同编译器上,对于菱形继承、菱形虚拟继承的实现,都有小小的差异,我上面也大多是都是验证,得到的答案,以后在新的环境中,也可以同样的方式去思考总结,得到该环境对于菱形继承、菱形虚拟继承的处理方式。

2023-08-19 21:19:54 41

原创 C++ 继承 8000字精讲

由上例,Person类我们称为父类、基类,Student Teacher类我们称为子类、派生类关于继承方式这里会涉及到public继承、protected继承、private继承,继承方式会影响到父类的public、protected、private成员变量、函数,在派生类中是作为public、protected、private中哪一种,父类的三种访问限定符以及三种继承方式,就会涉及到九种情况,听着十分复杂,

2023-08-18 11:19:07 82

原创 关于class和typename的一些补充

在大多数情况下class和typename是没有区别的,只不过在涉及嵌套从属类型会涉及到两者的差别,具体情况是什么,后文讲解。

2023-08-15 16:58:14 37

原创 C++动态内存管理 - new和delete关键字

下面我定义了一个ListNode类对new和delete分开讲解。

2023-07-27 10:26:45 72

原创 C/C++静态变量

这是一个很小的点子,但是困扰了我许久,因为经常会需要多文件间操作,这里就写一篇博客来记录一下这个关于static的语法知识。

2023-07-25 15:26:23 73

原创 Linux基础工具——gcc/g++以及动静态库

这就是编译器的工作,并且,所有程序员在调用库函数时,都是去动态库中执行,因此这个动态库也叫共享库,共享库在承载能力内是只需要一个的,动态库不能缺失,一旦对应的动态库缺失了,可能会导致很多程序都无法进行正常的运行。然后用库管理工具(比如Visual Studio的lib指令工具)将这些.o文件进行链接,此时就会生成.lib文件,这个.lib文件,就是我们的库的一种后缀(在Linux下.a .so是库的后缀,Windows下是.lib .dll后缀),比较著名的库有:c的标准库,c++中的stl库等。

2023-07-25 08:53:40 85

原创 Linux基础工具——vim

上图中我用happy_grass执行sudo,想在根目录下创建一个文件,此时,给出了一些提示,希望我们尊重他人隐私,输入前多想想,更大的权力意味着更大的责任,然后我们输入了我们自己的密码后,提示我们happy_grass is not the sudoers file 也就是说我们的happy_grass账号没有在白名单中,不被系统信任,也就不能用自己的账号去做root的事情。(n)p ———— p,粘贴刚才复制或者剪切的内容到光标所在行的下一行,如果有数字n,俺么就是粘贴n次到光标所在行的下一行。

2023-07-25 08:50:54 163

原创 Linux基础工具——yum

在Windows、安卓环境安装软件,主要是为了盈利,客户群体是广大消费者,所以安装的方式不能太麻烦,需要追求极致的简单,与极致的高效,因此我们平时只需要点击下载,安装,就可正常使用软件了。源代码安装——去软件的官网安装或者镜像网站安装,需要将源代码所在的编译、运行环境也安装一份,成本很高,难度很大(实在没办法了会使用源代码安装)rpm安装——去官方地址下载rpm包(也不推荐,有些安装有依赖关系,不独立 并且对应机器需要下载对应的版本 恶心程度仅仅亚于源代码安装)

2023-07-25 08:45:40 146

原创 Linux 权限——与所有文件都相关的知识,重中之重!

比如我用gcc编译test.txt文件时,就会报错,因为gcc是一款在Linux操作系统上跑的编译器,是软件,它要求文件后缀,不是系统的行为,所以我们以后在进行文件命名的时候,也需要考虑文件的后缀问题,你是想用来写文本,就.txt,写代码就.c .cpp .py,用于执行的文件就.exe,目录文件就什么也不带 .out …这里有三组权限,分别为拥有者、所属组、其他组的权限,每个位置的含义是明确的,有具体指定的权限,如果该组下没有某权限,则为 - ,有某权限,则是对应权限的首字母缩写。

2023-06-18 19:37:30 65

原创 Linux常用指令以及基本知识

,就是例如上面的sshd,而我们的客户端就是ssh。另外,一个项目中可能会形成多个可执行程序,也就是会有多个main函数,所以我们可以通过grep来寻找所有main,进而进行代码理解(代码理解有两种方式,第一种,深度优先的理解,跟着代码调用函数时,进入函数理解函数的实现,也就是我们debug时一行行的方式,第二种就是广度优先的理解方式,我们先看每个函数干了什么,从整体的角度对程序进行把握,然后从头再依次进入函数理解实现)

2023-06-17 12:47:14 146

原创 Linux学习前期准备

比如我是一家互联网公司,有1000万用户数据,最终所有数据,都要经过操作系统,进行数据传送,数据处理,那如果我们使用windows macOS,这些都不是开源的,底层做了什么事情,我们都不知道,所以很多互联网公司,不会选择这类不清楚代码底层逻辑的操作系统。成本低:如果选择Windows这类企业级使用需要收费的操作系统,那成本是非常高的,像阿里巴巴、腾讯,背后有上百万台计算机服务器,也就是说这些服务器什么也没干,一年就需要千万量级的成本因此一款免费的操作系统是必要的,能够为企业省下大量的钱。

2023-06-10 11:50:36 48

原创 三分钟教你Word修改默认样式

替换默认样式——说到底就是替换一个word默认的.dotm文件。

2023-06-03 17:10:43 7573

原创 C++ 类和对象 20000字详解!!!

类是面向对象编程中的一个概念,用来描述一类具有相同特征和行为的对象。它定义了一组属性和方法,这些属性和方法可以被对象使用。类可以看作是一种模板或者蓝图,用来创建具有相同属性和行为的对象。在类中定义的属性和方法可以通过实例化对象来进行使用。这里的特征和行为、属性和方法,可以统一成一种表达:成员变量和成员函数我们定义类用到的关键字为class和struct//类体 };//注意分号不能忘。

2023-05-17 19:15:36 215

原创 C++的另一大利器——引用

当我们学数据结构的时候一定会写单链表,但是很多同学在学习时很难理解为何要用二级指针,什么时候需要用二级指针,因此C++为了简化这种痛苦,提出了引用的概念,并用这个概念扩充出了很多十分方便的使用技巧。

2023-04-23 21:45:27 44

原创 缺省参数以及函数重载

祖师爷本贾尼用这两种方式处理了函数调用以及重名问题,提高了函数的灵活性和可复用性,以及减少编写代码时需要传递的参数数量,简化代码,使得函数调用更加方便易读,提高了开发效率。当然C++在函数传参方面不止缺省参数和函数重载,更核心的便是提出了引用的概念,这是C++的另一大杀器,下一篇博客我将会尝试为大家讲解。

2023-04-19 14:18:02 67

原创 C++命名空间(你需要了解的关于命名空间的所有知识,这篇文章都会告诉你)

要理解命名空间,首先我们先了解了解作用域这个概念。全局作用域 (Global scope):在程序的任何地方都可以使用,如全局变量。局部作用域 (Local scope):在代码块(花括号)内定义的标识符,只能在该代码块内使用。命名空间作用域 (Namespace scope):由命名空间限定的标识符,只能在该命名空间内使用。类作用域 (Class scope):由类定义的成员变量、成员函数以及嵌套类所形成的作用域。

2023-04-14 20:25:20 111

原创 C语言文件操作——使数据能够长久保存的方法

在我们接触文件操作之前,我们所有的操作都是在内存中进行的,当我们关闭程序,所有的数据就会消失,所以当我们需要将数据长久的保存下去时,就需要内存与文件进行交互,让数据存放在硬盘中。

2023-02-09 23:57:44 2099

原创 C语言重中之重!动态内存的所有问题你都能在这篇文章中找到答案

这个GetMemory函数是传值调用,并且没有返回值,所以无法在Test中改变str的值,并且p的生命周期在离开GetMemory函数时就结束了,也就是str还是NULL,我们无法对0x00000000位置进行(写入)解引用操作,除此之外,没有释放,所以还发生了内存泄露。情况2:扩大空间,原有空间之后没有足够多的空间时,扩展的方法是在堆空间上另找一个合适大小的连续空间,并把原来的旧数据拷贝到新空间上去,然后realloc函数内会把旧地址的动态空间释放掉,这样函数返回的是一个新的内存地址。

2023-02-09 15:26:30 63

原创 C语言自定义类型8000字精讲(结构体 枚举 联合)

int x;int y;//可以在创建结构体类型时创建变量并初始化 struct Stu {int num;char ch;//这里的p就是定义的一个结构体成员名,这个成员的类型是struct Point结构体类型 float d;1 , 2 };//可以在main函数中创建变量并初始化 struct Stu s1 = {//打印结构体内容 100 w 2 5 3.140000 struct Stu s2 = {

2023-02-08 23:03:05 68

原创 C语言通讯录(附有完整代码)

通讯录对于C语言学习有着重大的意义,是一次非常综合性质的练习,囊括了C语言大多数知识,并且可以根据自身能力写出不同难度的通讯录。

2023-02-06 21:55:55 1650

原创 速学!让你轻松掌握C语言常用的字符串函数和内存函数

strlen、strcpy、strcat、strcmp、strncpy、strncat、strncmp、strstr、strtok、strerror、perror、memcmp、memcpy、memmove、memset

2023-01-11 23:04:43 161 1

原创 都2023年了还有程序员搞不明白数据的存储?一篇文章带你全面学会数据存储

整形存储、浮点存储、大端小端、类型转换

2023-01-10 14:19:29 293

原创 C语言操作符详解(一篇文章教你搞懂C语言的操作符)

执行 a == 0xb6时,a会发生整形提升,0xb6本身是整形,不需要提升,a整形提升补的是1,因此不相等(如果a的最高位是0,那整形提升就不会改变值),c == 0xb6000000,c和后者都是整形,不会发生整形提升,因此相等。||操作符发现a为0,还无法判断出结果,因此还要计算++b,a本身加了1,b本身也加了1, 因此 a= 1 b = 3 c = 3 d = 4。总结:&&的停止是需要寻找假,因为&&是遇假则假,全真才真,同理,||的停止是需要寻找真。

2022-12-30 22:56:06 83

原创 C语言 扫雷(代码及详细注释可直接前往我的Gitee仓库下载代码)

所有的逻辑思考我都会放在代码注释中,大家只需要按照main函数一步一步走下去就能明白整体逻辑。

2022-12-27 17:54:58 130

原创 C语言 三子棋

三子棋是语言学习前期中较为综合的一次思维训练,会大量的用到循环、判断语句,以及各种函数嵌套调用,能够很好的训练学习者对知识的掌握与运用。

2022-12-21 01:15:33 107 3

原创 VS2022 warning C4828: 文件包含在偏移0x处开始的字符,该字符在当前源字符集中无效(代码页)

原编码格式不符合要求时,在保存时会出现问题,我们只需要更改保存时的编码格式即可解决。

2022-12-20 12:43:53 5507 7

原创 C语言 冒泡排序法

冒泡排序法是语言学习中最基础的排序方法,基本上每个学习的人都会遇到这个算法。冒泡的核心就在于相邻元素的连续比较换序,多次相邻元素比较称为一轮冒泡,每一轮冒泡都能确定一个元素的正确排序位置,用多轮冒泡进而完成整体排序。

2022-12-20 11:09:22 127

原创 C语言 字符串倒置的递归与非递归解法

字符串倒置函数的实现,需要我们在函数中使用left、right分别定位字符串的起点、末点,因此我们传参时需要字符串的首地址(str)、字符串的长度(len),将这两个位置的字母互换,然后让left++到字符串下一个地址,right–到字符串末尾的上一个地址,一直重复互换操作,直到不满足left < right,即可实现字符串倒置递归与非递归解法大体的思路是相似的,只不过递归解法中需要考虑如何进行left和right的更新,以此逼近递归条件。

2022-12-19 20:07:02 208

原创 C语言 二分查找

二分查找又称折半查找,是一种很经典的查找算法,其目的就在于在一组数据中寻找元素key,其核心就在于用一组数据的中位数,去与想要查找的元素key进行比较,每次比较都能筛去一半不符合要求的数据,通过循环最终去找到元素key,返回下标,或者发现这组数据中不存在元素key,此时返回 -1因此二分查找的时间复杂度为O(logn)

2022-12-18 12:08:49 108

原创 初见CSDN,我想说......

一些展望,肯定不是flag,肯定不是!

2022-12-17 19:25:29 143 1

空空如也

空空如也

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

TA关注的人

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