自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 初识C++ · 继承(1)

对于面向对象这门语言的三大特性 -> 封装 继承 多态,我们已经学习了封装,这里简单理解一下封装,在面向过程的时候,数据和方法(函数)的分离开来的,所以C语言干什么事情都是要自己造轮子,比较麻烦,对于C++ 来说,有了类和对象这个概念,就可以把数据和方法放在一起,那么访问数据就更容易,不需要自己造轮子,这是一种封装,比如不同的数据结构,顺序表链表等,C++有专门的头文件,这也是一种封装,对于反向迭代器来说,是对迭代器的一种封装。那么今天,就进入到继承这一特点来。

2024-06-20 17:31:13 877

原创 数据结构初阶 · 链式二叉树的部分问题

链式二叉树我们在C语言阶段已经实现了,这里介绍的是涉及到的部分问题,比如求树的高度,求树的节点个数等,连接部分就手动连接,用一个样例来介绍涉及到的几个问题。这里对前面知识反馈比较大的是递归,可以说每个问题都用到了递归。

2024-06-10 17:28:05 1085

原创 初识C++ · 模板进阶

前面模板我们会了简单的使用,这里带来模板的进阶,当然,也就那么几个知识点,并不太难。

2024-06-07 22:40:07 1163

原创 初识C++ · 反向迭代器简介

继模拟实现了list和vector之后,我们对迭代器的印象也是加深了许多,但是我们实现的都是正向迭代器,还没有实现反向迭代器,那么为什么迟迟不实现呢?因为难吗?实际上还好。我们实现const迭代器的时候,有两种路,一是直接来一个类,二是通过模板,非const迭代器的复用来实现的,同理,我们实现反向迭代器的话,也可以每种结构都来一个单独的反向迭代器的类,但是科学家们觉得太麻烦了,所以把反向迭代器的高度拉的很高,高到什么程度呢?

2024-06-05 21:39:41 530

原创 初识C++ · 优先级队列

栈和队列相对其他容器来说是比较简单的,在stl里面,有一种容器适配器是优先级队列(priority_queue),它也是个队列,但是不大像队列,本文中简略介绍如何使用和模拟实现它。

2024-06-05 15:36:39 733

原创 初识C++ · 模拟实现stack和Queue

经历了list三个自定义类型的洗礼,来个简单的放松放松,即栈和队列:文档记录的,栈和队列是一种容器适配器,它们不属于stl,但是它们的大体结构我们都是了解的,在数据结构初阶我们已经用了C语言进行实现,这里用C++进行实现。

2024-06-03 22:10:30 601

原创 初识C++ · 模拟实现list

有了string,vector的基础,我们模拟实现list还是比较容易的,这里同样,先看源码进行简单的分析,这里直接说了就,list的模拟实现难就难在于,需要三个自定义类型,所以我们的重难点就是如何捋清它们三个之间的关系:一共三个自定义类型,分别是用来控制节点的,控制迭代器的,控制链表的,那么为什么会这么复杂呢?尤其是在迭代器部分的模板有三个参数。

2024-06-01 22:10:58 1169

原创 初识C++ · 模拟实现vector

目录前言:1 部分简单函数的实现2 push_back和pop_back3 reserve和resize4 Print_vector5 insert和erase6 拷贝构造7 构造8 赋值9 memcpy的问题10 迭代器失效继上文模拟实现了string之后,接着就模拟实现vector,因为有了使用string的基础之后,vector的使用就易如反掌了,所以这里直接就模拟实现了,那么实现之前,我们先看一下源代码和文档:源码不多看,因为很容易绕晕进去,我们从这两个部分得到的信息就够了,首先,vector是一个

2024-05-27 22:12:30 826

原创 初识C++ · 模拟实现string

继上文介绍了string的函数实现之后,本文介绍模拟实现string的大部分函数。

2024-05-20 21:53:25 940

原创 初识C++ · string的使用(2)

这个函数是缩容,但是是在C++11中引进的,虽然可以实现我们想要的功能,但是实际上内存越来越发达的时代,我们更多的追求的是效率,空间不够的情况是比较少见的,而且这个函数使用代价挺大的,我们大多数人以为的缩容是这样的:有一块空间,释放到不需要的部分,但是在动态内存管理章节我们知道,释放空间不能一段一段的释放,只能一整块的释放,所以实际的缩容是把原来的空间释放掉,重新开一块我们想要的小空间,这个代价挺大的,所以不推荐使用。

2024-05-14 16:12:12 641

原创 初识C++ · string的使用(1)

STL是一个标准库,是C++标准库的一个重要部分,那么什么是STL?STL是一个模板库,包含了算法框架和数据结构。STL有不同的版本,比如原始版本,P.J 版本,R.W 版本,SGI版本,不同版本有不同的特点,比如SGI版本的可移植性好,比如P.J版本的可读性较差。STL这个库里面有六大部分,分别是算法,容器,迭代器,仿函数,空间配置器,配接器。我们即将介绍的,是容器部分的string,可以形象的把容器理解为数据结构,里面还有链表list,树set,顺序表vector等。

2024-05-13 18:40:40 1031

原创 初识C++ · 模板初阶

这里就需要用到模板了,模板使用到了两个关键字,一个是template ,一个是typename,template是模板的英文名,typename是类型名的英文,还是很好理解的。既然是多参数,那么我们使用不同的模板就行,但是返回值的话,就用auto即可,这里可以说auto很妙,不会存在丢失精度的问题,也不用显式实例化,也不用强转什么的。有了模板之后,我们实现相同的就很容易了,这里如果里面的函数定义和声明分离的话,如果不是同一个.h文件的话,造成的效果是很难想象的,会造成编译的时间大幅度的增加。

2024-05-08 22:03:12 863

原创 初识C++ · 内存管理

因为抛异常是后面的知识了,这里简单介绍,在C语言中报错是通过返回错误码,比较暴力,在C++中有一种温和的报错方式就是抛异常,通过try - catch ,比如我一次性开辟很大的空间,系统分配的内存不够了,那么try-catch就会起作用,程序运行完毕会打印一行字,告诉你有错误,new里面的抛异常就是为了防止开辟空间不够,因为链表每次开辟一个节点就要检查是否为空,new底层中的malloc开辟之后,抛异常直接就帮忙解决了空指针的问题(因为malloc函数开辟失败返回的是空指针)。*pChar3在哪里?

2024-05-08 14:11:35 1033

原创 初识C++ · 类和对象(下)

对于类中有自定义类型的,我们原本的想法是给MyQueue一个值,然后初始化,并且stack调用自己的默认构造,如果没有初始化列表,Stack就完不成自己的初始化,那么MyQueue也就完不成自己的默认构造。我们先声明的_a2,所以_a2先给值,是_a1给的,_a1还没开始初始化,所以给的是随机值,然后初始化_a1,这时候_a1初始化为了1,所以打印出来有一个是1,有一个是随机值。如果是有名对象,那么析构函数的调用会在主函数结束的时候调用,那么666的打印就会在~A之前打印,但是这是匿名对象,创建即是销毁。

2024-05-03 14:08:16 845

原创 初识C++·类和对象(中)(3)

前言,最难的已经结束了,来点轻松了放松一下。

2024-04-21 21:08:54 901

原创 初识C++ · 类和对象(中)(2)

上篇文章已经介绍了6个默认成员函数中的3个函数,分别是构造函数,析构函数,拷贝构造函数,本文介绍的是后三个,

2024-04-20 20:48:46 814

原创 初识C++ · 类和对象(中)(1)

目录1 类的6个默认成员函数2 构造函数3 析构函数3 拷贝构造函数这是一个空类,试问里面有什么?可能你会觉得奇怪,明明是一个空类,却问里面有什么。其实一点也不奇怪,这就像文件操作章节,系统默认有三个流一样,标准输出流(stdout),标准输入流(stdin),标准错误流(stderr),类里面系统是有默认的函数的,一共有6个默认函数。默认函数是指用户没有显式实现,系统会自己生成的函数,下面依次介绍。当我们写了一个日期类之后,我们想要对它进行初始化,我们通常都会写一个函数叫做Init()函数,

2024-04-14 21:00:24 1047

原创 初识C++ · 类和对象(上)

/...其中,类体(花括号)里面的变量叫做类的属性或者是成员变量,类体里面的函数叫做类的方法或者成员函数。类中定义函数的时候有两种方法:一是定义和声明放在一起return 1;//...二是声明和定义放在对应的文件里面//Stack.hpublic:private:int* arr;int size;s1.Print();return 0;

2024-04-07 17:58:17 963

原创 初识C++ · 入门(2)

内联函数是被inline修饰的函数,使用频繁且代码量小的情况下会使用内联函数,实际上就是一种空间换取时间的做法,因为编译期间会在函数处将函数代码展开,有点像预处理期间的头文件展开,那么为什么是空间换时间呢?因为函数展开了就相当于把一段代码放过去,没有单独的函数栈帧开销,所以时间上会省事,但是因为代码量的增加,所以生成的可执行文件占用的存储空间是会变大的,一旦内联函数的代码量大了一点,频繁使用之后可执行程序的内存大小加的可不是一点,所以要求内联函数的代码量是少量代码。int main()

2024-03-31 22:50:04 890

原创 初识C++ · 入门(1)

C++与C语言是有一定交集的,可以理解为本贾尼在使用C语言的时候认为有缺陷,于是加了一些小语法进行改良,后来经过委员会的修改,C++98问世了,是第一部标准版本。这个代码在C语言里面是有个大问题的,就是重定义的问题,写过猜随机数的朋友都知道rand是一个函数,我们常说命名不能以关键字命名,实际上我们定义变量的时候定义成函数的名字也会冲突,这时候本贾尼不舒服了,觉得这个名字我一定要取,所以加入了命名空间(namespace)的概念。

2024-03-28 21:17:03 764

原创 数据结构·二叉树(2)

前面介绍了树以及二叉树及其二叉树的存储方式,本文就介绍基于二叉树模式下的一种结构——堆。

2024-03-27 17:09:12 1186 5

原创 数据结构·二叉树(1)

结合树的概念,我们知道二叉树的子树可以分为左子树和右子树,并且度不能超过2,二叉树实际上就是由空节点,根节点,左子树,右子树,左右子树均存在复合而成的。前面所学到的顺序表链表等,都是线性的数据结构,今天介绍的树,是一种非线性的数据结构,因为它看起来像一棵倒挂的树,所以这种结构被称为树。二叉树的优势是在于搜索,存储只是一方面,搜索方面二叉树才是强项,如后面介绍的,AVL树,红黑树等。:从该节点的线路一直往上遍历,所有的节点都是该节点的祖先,如A是所有节点的祖先。

2024-03-25 22:17:45 619

原创 数据结构·栈和队列

在学习C语言的时候我们可以了解到,局部变量是在栈中创建的,动态开辟的空间是在堆上开辟的,用了static关键字的变量是在静态区创建的,我们在学习数据结构的时候同样会涉及到栈和堆的概念,但是此栈非彼栈,堆也是,因为这是两门不同的学科。局部变量在栈中创建等是隶属于操作系统的知识,而今天介绍的栈和队列,是隶属于数据结构的内容,他们是一种结构,比如栈,是后进先出的结构(Last in first out),即LIFO,队列是相反的,是先进先出的结构(First in First out),即FIFO。

2024-03-18 12:06:56 962

原创 数据结构·复杂度

复杂度分为时间复杂度和空间复杂度,两者是不同维度的,所以比较不会放在一起比较,但是时间复杂度和空间复杂度是用来衡量一个算法是否好坏的标准,时间复杂度用来描述算法运行的时间快慢,空间复杂度用来衡量一个算法所需要的额外空间。最初的计算机时代计算机的存储量很小,所以额外注重空间复杂度,随着发展,计算机的存储已经不是让人担心的点了,所以更为注重时间复杂度。

2024-03-12 21:53:24 908

原创 数据结构·双向链表

上文提交的链表有八种,我们介绍两种,一种是单向不带头不循环链表,我们简称为单链表,一种是双向带头循环链表,我们简称为双向链表,虽然提及到双向链表是难度最大的,可是实际上写完后你会认为双向链表是最好理解并且最好写的。

2024-03-06 15:55:50 1070 2

原创 数据结构·单链表

链表链表,像链条一样把东西串起来,比如火车,每个车厢都是用链条连接起来的,在计算机中,顺序表以数组为基础,每个数据类型都是挨着的,也就是内存中的分布的紧凑的,链表就不一样了,每个数据类型所在的内存空间不一定是挨着的,因为前一个数据存储了下一个数据的地址。那为什么要学习链表呢?链表相对于顺序表的优点在哪里呢?顺序表存储的数据量大的时候,不免涉及到移动数据,数据一多,移动次数就多,浪费的时间越多,链表不一样,因为链表的数据是一个一个串联起来的,插入数据只需要连接就行,不存在移动数据的时间。

2024-03-01 20:36:13 1083

原创 数据结构·顺序表实现通讯录

有了前面顺序表的基础,我们可以尝试利用顺序表实现通讯录,日常使用中,通讯录可以实现的功能有增加联系人,删除联系人,查找联系人,修改联系人,查看联系人等,我们通过本章的学习实现以上五种功能(

2024-02-27 18:56:23 1199 2

原创 数据结构·顺序表

学习数据结构与算法之前,一般是先学数据结构,方便之后学习算法,那么数据结构拆开介绍,就是数据 和 结构,数据,生活中到处都是,结构,就是数据存储的方式,即。

2024-02-21 23:36:05 1019 2

原创 初识C语言·预处理详解

_FILE__//进行编译的源文件__LINE__//文件当前的行号__DATE__//文件被编译的日期__TIME__//文件被编译的时间__STDC__//是否支持ANSI C标准使用就是直接打印就好了,因为VS是不支持ANSI C标准的,支持的话返回值就是1int main()return 0;需要注意的就是LINE打印的时候占位符是%d,这些符号都是可以直接使用的,并且都在预处理阶段就处理完了。

2024-02-07 22:50:13 1550 4

原创 初识C语言·编译与链接

C语言标准ANSI C 实现C语言代码的时候 一般需要经过两种环境,一是翻译环境,二是运行环境,计算机能识别的是二进制的指令,人写完代码后通过翻译环境,使代码变成计算机能读懂的可执行的机器指令,运行环境就是用来执行实际的代码操作的环境。那么翻译环境如何让源代码变成可执行的机器指令的呢?翻译环境包含的是编译和链接两大过程,其中编译包含预处理(也可以叫做预编译),编译,汇编。编译的时候,机器通过编译器使.c文件生成.obj文件,.obj文件是目标文件(在windows是.obj为后缀,Linux环境下是.o为后

2024-02-04 20:14:29 976

原创 初识C语言·文件操作

它有3个参数,第一个参数是文件指针,第二个是偏移量,第三个是计算偏移量的起始位置,偏移量很好理解,光标指向第一个字符的时候偏移量就是0,往后一次偏移量增加1,那么第三个参数写的时候有三个选择,SEEK_SET,SEEK_CUR,SEEK_END,CUR就是当前位置的意思,SET就是起始位置的意思,END就是末尾的意思,所以移动光标的时候需要先确定好计算偏移量的起始位置,然后确定偏移量,从起始位置开始,往左计算偏移量就是负数,往右计算就是正数。在电脑中文件是随处可见的,那你思考过为什么存在“文件”吗?

2024-01-31 22:53:44 904 1

原创 初识C语言·动态内存开辟

3) 对非动态内存开辟的空间释放//对非动态开辟的空间进行释放int main()int a = 10;free(pa);pa = NULL;return 0;前面提到free函数只能释放动态内存开辟的空间,因为局部变量 全局变量是在栈区 静态区的,而free适用于堆区的动态内存开辟,所以使用free释放非动态内存开辟的空间的时候系统就会报错。4)free释放一部分动态内存开辟的空间//使用free释放一部分动态内存开辟的空间int main()assert(p);p++;

2024-01-27 21:30:26 911

原创 初识C语言·自定义类型(2)

什么是结构?结构也就是元素的集合,在C语言里面,结构体里面的可以有多个变量,类似于集合中的元素,结构体里面的元素被叫做成员变量,成员变量可以是不同类型的多个变量,那么创建好结构体之后,定义的就是结构体变量,那么结构体的创建用到的是关键字struct,创建如下:variable-list在创建的时候是不用写的,这种写法是定义结构体的同时创建好结构体变量,需要注意的是分号不能丢,tag标签一般都要写,不然就是匿名结构体了。

2024-01-25 22:58:03 799

原创 初识C语言·自定义类型(1)

像这样,但是在C语言里面是可以用整数给枚举常量赋值的,c++里面是不可以的,因为c++的类型检查比较严格,会认为这是两种不同的类型不能进行赋值。因为vs是小端存储,所以存的16进制的11223344,所以存的顺序是44332211,那么a的值就是44,b的值就是11223344。可以看到,成员有两个char,一个int类型的,所以联合体的大小应该是4,那么结构体的大小是?联合体,顾名思义,是多个对象连在一起的,即联合体的成员都是共用空间的,所以联合体也叫做。

2024-01-21 23:27:16 1109 1

原创 初识C语言·数据存储

前面讲到,整数在计算机中的存储是以补码形式存储的,其中正数和负数也有些许差别,正数的三码相同,负数的就不相同了,那么这里就涉及原码反码补码。原码:直接把整数用二进制的方式表达出来的就是原码。反码:原码除了符号位不变,数值位按位取反就是反码。补码:反码加1。对于整型来说,计算机存储的一律是补码,这是因为使用补码可以把符号位和数值位一并处理了。同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是 相同的,不需要额外的硬件电路。

2024-01-14 16:42:33 1191 1

原创 初识C语言·内存函数

紧接字符串函数,出场的是第一个内存函数memcpy。前面讲的字符串函数是专门干关于字符串的事的,而这个函数可以干strcpy一样的事,但是区别就是它碰到\0也会继续复制。函数的头文件是string,返回类型是void*,参数有两个,一个是目的地地址,一个是源的地址,还有一个是整型,这个整型代表的是要复制多少个字节,返回值是目的地的地址,因为源的值是不能被修改的,所以用const修饰,因为参数是void*,所以在一会儿模拟实现的时候我们就要强制转化成char*的,毕竟是修改字节。先看一段简单的代码。

2024-01-11 19:46:45 1190 1

原创 初识C语言·字符(串)函数

当两个临时变量都不是结束标志的时候,并且它们相等,就让他们的指向的位置一直往后移,直到这两个不相等了或者是某个变量已经是结束标志了,这里有个很巧妙的判断它们是否相等,对他们相减的结果进行取反,如果相等,相减就是0,取反了就是1,while循环继续下去,循环体内的内容就是s1++,s2++,最后跳出循环的时候判断一下s2指向的内容是不是'\0',如果是的话,返回这个时候的字符1中的临时变量,最后如果整个while循环过去了都没有找到,就直接返回NULL就行了。多了一个n,参数就多了一个num嘛,很正常咯。

2023-12-25 23:15:32 1021 1

原创 初识C语言·指针(5)

其他的是一模一样的。这串代码与代码2的区别就是数组的区别,有结束标志的,那么同理,*arr arr[1]都会报错,因为传的不是地址,其他的arr arr+0 &arr传的地址都是首元素的地址,结果是6, &arr[0] + 1传的是第二个元素的地址,所以结果是5,&arr + 1因为跳过了整个数组,所以答案是随机值。arr + 1表示的是取出整个第一行的地址+1进行指针运算,得到的是整个第二行的地址,那么低地址位就是6,打印的时候- 1在解引用,指向的位置就是5的位置,所以打印的结果就是5。

2023-12-18 18:11:12 826 2

原创 初识C语言·指针(4)

cplusplus对第四个参数的介绍是这样的,全是英文也不要怕,我们用一下翻译器咯,总之介绍的是,这个参数里面还有两个参数,分别是两个指针,被const修饰,因为我们只是对数据进行排序,不会改变它的值,所以用const修饰。首先我们要知道qsort函数是用来对数据类型排序的,然后在函数的篇目中我们提到,学习一个函数,要从函数的返回类型,返回值,参数个数,参数类型,功能这几个方面去看,这里我推荐的是cplusplus这个网站,走看看去。所以第三个参数就是排序的数据类型的大小,参数类型同2,也是不可能为负数。

2023-12-14 21:43:05 689 1

原创 初识C语言·指针(3)

指针变量有很多种,今天我们选取部分进行专门的介绍,首先登场的的是字符指针变量。这是一般的使用方法,但是如果我们给字符指针变量一个常量字符串呢?打印出来的结果是没有异议的,只是,指针变量只能存一个元素的地址,那pc存的是谁的地址呢?这里当然不是把整个字符串都放在了pc里面,不难猜测pc里面存的是该常量字符串的首元素地址。所以打印出来的是整个字符串。现在我们来看一道笔试题,来源于《剑指offer》关于字符指针变量的。提问这里最后打印的结果是什么?

2023-12-12 15:26:05 834

空空如也

空空如也

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

TA关注的人

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