自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 [C++初阶]模板初阶

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数。函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定。如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。巧的是前人早已将树栽好,我们只需在此乘凉。2. 代码的可维护性比较低,一个出错可能所有的重载均出错。,对于字符类型也是如此。,对于模板函数的使用,

2024-04-26 22:20:49 207 4

原创 [C++初阶]C++内存管理

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常, malloc会返回NULL。申请空间失败, 尝试执行空间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。2. 在申请的空间上执行N次构造函数。

2024-04-26 20:40:51 530

原创 [C++初阶]一些类的选择题

A.友元函数不是类的成员函数,就相当于你的朋友再亲密也不是你的家人,既然不是类成员函数,那和普通成员函数调用一样,不需要通过对象调用。A.初始化顺序由定义类时的声明顺序决定,所以先初始化_a2,由于初始化_a2时_a1还未初始化,所以为随机值,故错误。B.友元的目的就是为了访问类的私有数据,成员函数可以直接访问类的私有数据。B.友元函数和类的成员函数都可以访问类的私有成员变量或者是成员函数。C.类的成员函数是属于类的,调用的时候是通过指针this调用的。6.下面有关友元函数与成员函数的区别,描述错误的是?

2024-04-25 22:34:44 226 4

原创 [C++初阶]日期类

前面我们讲过了类和对象,现在我们来建立一个日期类来实践一下吧。

2024-04-25 16:02:14 590 8

原创 [Linux初阶]常见的指令

我们学Linux指令,其实就是和学windows一样,学习Linux的操作ls [选项] [目录或文件:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。-a 列出目录下的所有文件,包括以 . 开头的隐含文件。-d 将目录象文件一样显示,而不是显示其下的文件。如:ls –d 指定目录-i 输出文件的 i 节点的索引信息。如 ls –ai 指定文件-k 以 k 字节的形式表示文件的大小。ls –alk 指定文件-l 列出文件的详细信息。-t 以时间排序。

2024-04-24 23:13:25 850 2

原创 [C++初阶]类和对象(三)

类是对某一类实体(对象)来进行描述的,描述该对象具有那些属性,那些方法,描述完成后就形成了一种新的自定义类型,才用该自定义类型就可以实例化具体的对象。

2024-04-22 20:54:21 1122 8

原创 [C++]类和对象(二)

而_t是Time类对象,所以在d销毁时,要将其内部包含的Time类的_t对象销毁,所以要调用Time类的析构函数。但是,main函数中不能直接调用Time类的析构函数,实际要释放的是Date类对象,所以编译器会调用Date类的析构函数,而Date没有显式提供,则编译器会给Date类生成一个默认的析构函数,目的是在其内部调用Time类的析构函数,即当Date对象销毁时,要保证其内部每个自定义对象都可以正确销毁main函数中并没有直接调用Time类析构函数,而是显式调用编译器为Date类生成的默认析构函数。

2024-04-21 21:33:32 944 10

原创 [C++初阶]类和对象(一)

1. 声明和定义全部放在类体中,需注意:成员函数如果。

2024-04-16 13:54:23 827 10

原创 [C++初阶]初识C++(二)

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。我们可以举个例子:比如:李逵,在家称为"铁牛",江湖上人称"黑旋风"。铁牛,黑旋风,都是李逵的别名。写法是用&符号修饰,类型& 引用变量名(对象名) = 引用实体;

2024-04-06 00:03:25 731 2

原创 [C++初阶]初识C++(一)—————命名空间和缺省函数

在编程语言中,命名空间是一种特殊的作用域,它包含了处于该作用域中的所有标示符,而且其本身也是由标示符表示的。命名空间的使用目的是为了将逻辑相关的标示符限定在一起,组成相应的命名空间,可使整个系统更加模块化,最重要的是它可以防止命名冲突。就好比在两个函数或类中定义相同名字的对象一样,利用作用域标示符限定该对象是哪个类里定义的。定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员// 命名空间中可以定义变量/函数/类型。

2024-04-03 22:56:17 778 2

原创 [数据结构]排序

本篇主要是对常见排序的分类和一些排序的详解。

2024-04-01 21:53:07 1004 2

原创 [数据结构]oj二叉树的几道选择题

如果这棵树每一层都是满的,则它的深度最小,假设它为一个四叉树,高度为h,则这个数的节点个数为(4^h - 1) / 3,当h = 5, 最大节点数为341, 当h = 6, 最大节点数为1365,所以最小深度应该为6。由后序遍历确定子树的根,后序遍历从后向前看,最后一个元素为根,和前序遍历刚好相反,从后向前看后序遍历,应该是根,右,左,根据中序遍历确定子树的左右区间。通过前序遍历找到子树的根,在中序遍历中找到根的位置,然后确定根左右子树的区间,即根的左侧为左子树中所有节点,根的右侧为右子树中所有节点。

2024-03-31 22:19:17 753

原创 [数据结构]插入和希尔排序

插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

2024-03-28 22:54:24 1041 2

原创 [数据结构]二叉树的层序遍历

设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。

2024-03-25 19:51:54 399 4

原创 [数据结构]二叉树与递归OJ

上回我们手撕了一棵二叉树,并且通过递归完成了遍历,这回我们将深入理解用递归解决相关的二叉树问题,数量使用分治的思想.

2024-03-24 20:37:22 684 2

原创 [数据结构]二叉树的建立与遍历(递归)

首先我们拥有如下二叉树:要了解二叉树遍历,我们得先了解二叉树的三种遍历方式:前序遍历,中序遍历,后序遍历。

2024-03-24 19:27:08 593

原创 [堆的数据结构oj]找出一大堆数据中最大的前十个数

之后遍历10亿个数,把每个数与堆顶比较。遍历结束后,堆里面的就是最大的10个数。首先我们知道100亿个数char类型需要越40G的空间,如果我们通过排序来看,我们不难发现需要大量的时间。如果我们直接用堆排序,我们的速度就是N*logN所以我们的这种新方法效率明显高于堆排序。这道题是找N个数中最大的K个数,我们这个算法可以把效率提高到K+(N-K)*logK。这里我们来实验一下,先造10亿个数,然后找最大的前10个。1.我们可以建立一个堆存放10个数字,做小堆.如何在100亿个数据中找出最大的前10个数。

2024-03-23 20:34:52 181

原创 [数据结构]二叉树(下)

我们可以假设二叉树有N个节点,深度为h我们可以恒容易得到满二叉树每行的节点数,然后错位相减,算出节点与高度的关系。

2024-03-23 19:58:27 401

原创 [数据结构]堆

堆是一种完全二叉树的定义:完全二叉树的形式是指除了最后一层之外,其他所有层的结点都是满的,而最后一层的所有结点都靠左边。​​​​​​,从左到右连续。教材上定义如下:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

2024-03-18 12:32:11 1008

原创 [数据结构]二叉树(上)

对于深度为K 的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对 应时称之为完全二叉树。但是我们发现这样子有个很大的问题,我们发现是不是有很多的空间开辟了确没有存放数据,造成了空间的浪费,如果缺的数据多的话,会造成大量的空间浪费。概念:一棵二叉树是结点的一个有限集合,由一个根节点加上两棵别称为左子树和右子树的二叉树组成(可以为空)。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继,因此,树是递归定义的。:一个节点含有的子树的根节点称为该节点的子节点;

2024-03-14 20:13:56 778 6

原创 [数据结构]OJ用队列实现栈

官方题解:https://leetcode.cn/problems/implement-stack-using-queues/solutions/432204/yong-dui-lie-shi-xian-zhan-by-leetcode-solution/首先我们要知道栈是一种后进先出的数据结构,元素从顶端入栈,然后从顶端出栈。队列是一种先进先出的数据结构,元素从后端入队,然后从前端出队。

2024-03-07 22:07:38 685 4

原创 [数据结构]OJ一道------用栈实现队列

每次 pop 或 peek 时,若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈,这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。然后我们可以遍历IN栈,然后把存储的内容压入OUT栈,我们知道栈只能头插,所以我们在这些操作后会发现OUT栈和IN栈中数据的顺序颠倒了。然后是判断队列是否为空,这里我们可以直接判断两个栈是否是空的如果都是空的,则队列也是空的.因为我们知道队列只能头删,而OUT现在正好是颠倒的栈,对其尾删其实就是对输入的数进行头删。我们可以先创建栈,以及其相应的功能。

2024-03-05 20:40:58 459 7

原创 [数据结构]队列

只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有:进行插入操作的一端称为:进行删除操作的一端称为。

2024-03-05 19:29:54 325 2

原创 栈的OJ一小道-->Leetcode有效的括号

所以我们可以这样想,创建一个栈,当我们获得一个左括号时,我们将其放入栈,然后等出现右括号时,与左括号比较,如果不匹配就返回false,匹配就将这个符号出栈.反正我们只要记住,这道题我们乍一看可能会选择暴力遍历法,但这题我们可以选择栈,这样可以大大降低我们的时间复杂度.这题要求非常简单。如果检测到左括号则返回相应右括号,这样之后我们只需要让出现的右括号和栈顶的右括号比较就可以知道是否匹配了.那么我们就可以尝试实现代码了,但其实有一种情况,我们不需要遍历就能知道括号不匹配,那么是什么情况呢?

2024-03-04 19:20:39 368

原创 [数据结构]栈

一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则。:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。:栈的删除操作叫做出栈。出数据也在栈顶。此图来源与网络这里我们可以比作肉串,我们先把肉串好,后串上的肉,是先吃的.

2024-03-03 20:10:27 491

原创 [数据结构]链表OJ--环形链表判断是否有环(快慢指针法)

当慢指针和快指针从链表上的同一个节点开始移动时,如果该链表中没有环,那么快指针将一直处于慢指针的前方;等到慢指针进入环时,由于快指针的速度快,它一定会在某个时刻与慢指针相遇,即套了慢指针若干圈。我们想可以考虑给的链表为空的情况,而且我们观察例子,我们可以看出存在只有一个头的没有下一个节点的链表,所以我门要对这两种情况进行判断。然后我们让指针跑起来如果最后有一个指针跑到NULL说明,这个链表没有环,如果快慢指针不相等就接着跑,知道两个指针相遇.说明有环。它默认给我们创建了一个链表,给了这个链表的表头的地址。

2024-03-03 19:13:20 324

原创 时间复杂度和空间复杂度

这里我们默认CPU的每个单元运行消耗的时间都是相同的。随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这称,记为O是什么呢?算法导论是这么写的:大O用来表示上界的,当用它作为算法的最坏情况运行时间的上界,就是对任意数据输入的运行时间的上界。那么我们怎么算呢?实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要1、用常数1取代运行时间中的所有加法常数。2、在修改后的运行次数函数中,只保留最高阶项。3、如果最高阶项存在且不是1。

2024-02-06 09:09:10 596

原创 [C语言]C语言实战项目------单链表通讯录

今天我们将用单链表的知识去完成一个通讯录。我们需要完成通讯录的增删查改以及通讯录每次写入的内容的存储和下次使用的导入。

2024-02-06 08:54:04 856

原创 C语言实战项目<贪吃蛇>

我们这篇会使用C语言在Windows环境的控制台中模拟实现经典小游戏贪吃蛇 实现基本的功能: 结果如下:本次实现呢我们会用到一些Win32 API的知识(WIN32 API也就是Microsoft Windows 32位平台的应用程序编程接口):我们在C语言中可以用函数system来执行,入上面这两个,我们可以这么写:给坐标赋值:实例:这个结构体,包含有关控制台光标的信息 实例: 7)SetConsoleCu

2024-01-31 22:48:03 921

原创 【数据结构】链表的分类和双向链表

本篇是基于上篇单链表所作,推荐与上篇配合阅读,效果更加。

2024-01-24 21:54:45 1302 2

原创 【数据结构】单链表

1. 链表的概念及结构上回我们一起学习了线性表中的顺序表,今天我们将一起来学链表中的单链表。1. 链表的概念及结构概念:链表是⼀种的存储结构,数据元素的是。链表的结构跟火车车厢相似,淡季时车次的车厢会相应减少,旺季时车次的车厢会额外增加几节。只需要将火车的某节车厢去掉/加上,不会影响其他车厢,每节车厢都是独立存在的,且每节车厢都有车门,你只能再火车上移动,车厢是独立存在的,只能从所以前面的车厢一节一节的往后走,从这节车尾到下节车头。在链表里,每节“车厢”是什么样的呢?

2024-01-23 20:07:24 962

原创 [数据结构]顺序表

1、顺序表的概念及结构1、顺序表的概念及结构1.1 线性表线性表()是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储。案例:蔬菜分为绿叶类、⽠类、菌菇类。线性表指的是具有部分相同特性的⼀类数据结构的集合2、顺序表分类2.1顺序表和数组的区别。

2024-01-22 20:33:19 1169 1

原创 【C语言】预处理

当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能出现危险,导致不可预测的后果。所以用于对数值表达式进行求值的宏定义都应该用这种方式加上括号,避免在使⽤宏时由于参数中的操作符或邻近操作符之间不可预料的相互作用。答案是肯定的,可以,但是这样做查找的效率就低些,当然这样也不容易区分是库文件还是本地文件了。2. 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。这里我们想想,写⼀个函数求2个数的较大值的时候,不同的数据类型就得写不同的函数。

2024-01-22 14:51:12 1275

原创 [C语言]编译和链接

在ANSI C的任何⼀种实现中,存在两个不同的环境。1)翻译环境:将源代码被转换为可执行的机器指令2)执行环境:实际执行代码。

2024-01-19 16:08:04 826

原创 【C语言】文件操作

文件名:⼀个文件要有⼀个唯⼀的文件标识,以便用户识别和引用。文件名包含3部分:文件路径+文件名主干+⽂件后缀例如:为了方便起见,文件标识常被称为文件名。我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存释放,数据就会丢失 ,等下一次次运行程序,是看不到上次程序的数据的,如果要将数据一直保存,我们可以使用文件。我们⼀般谈的文件有两种:程序文件、数据文件。程序文件:我们可能看到过一些文件后缀为.c .obj .exe等这些都是程序文件,.c是源程序文件,。

2024-01-18 22:03:45 915

原创 动态内存管理

这是如果结束时,要free需要将他们两个分别free释放,你自己肯定知道,但如果你是写给用户的那这就可能导致部分内存未释放,用柔性数组,可以让用户一个free就释放干净。有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时 候内存,我们⼀定会对内存的大小做灵活的调整。3.包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。3.这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。

2024-01-17 23:34:47 806

原创 C语言内存函数

(在vs2022中memcpy可以处理重叠的内存,但这对于C语言并不规范,且对环境有要求,所以不推荐)总结:这节我们介绍了C语言内存函数,下节我们要学习C语言中相对重要的内容,动态内存开辟。如果source和destination有任何的重叠,复制的结果都是未定义的。• 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以。memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。• 比较从ptr1和ptr2指针指向的位置开始,向后的num个字节。

2024-01-17 22:38:28 438

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

这个头文件中说明的,C语言程序启动的时候就会使用⼀个全面的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会讲对应的错误码,存放在errno中,而⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。比较str1和str2的前num个字符,如果相等就继续往后比较,最多比较num个字母,如果提前发现不⼀样,就提前结束,大的字符所在的字符串大于另外⼀个。如果num个字符都相等,就是相等返回0.

2024-01-13 18:07:17 740

原创 qsort的使用

该函数不返回任何值,而是通过对数组的元素进行重新排序来修改所指向的数组的内容,如所定义的那样。此函数使用的排序算法通过调用指定的函数来比较元素对,并将指向元素的指针作为参数。对于可以使用常规关系运算符进行比较的类型,常规函数可能如下所示:compar。对 所指向的数组元素进行排序,每个元素的长度为字节,使用函数确定顺序。具体写法大家都看懂了吗,一样定义相关的函数,然后按照格式使用。本片主要讲的是qsort函数排序的使用,不讲解原理。关于字符串的函数我们讲完指针后就讲,这里我多解释。对数组的元素进行排序。

2023-12-19 18:53:12 47 10

原创 指针与回调函数

时,被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用,且是在特定的事件或条件发生时由另外的⼀方调用的,用于对该事件或条件进性响应。如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被用来调用其所指向的函数。上回我们写了转移表计算器,我们可以用回调函数进行优化。将add,sub,mul,div放入一个函数calc。回调函数就是⼀个通过函数指针用的函数。我们也可以跟上次的对比一下。

2023-12-19 10:58:15 22 1

空空如也

空空如也

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

TA关注的人

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