自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【C++】STL - List类

1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。

2026-11-08 23:34:32 209

原创 【Linux】Linux基础IO(一)

我们知道,当fopen以写入的方式打开一个文件时,若该文件不存在,则会自动在当前路径创建该文件,那么这里所说的当前路径指的是什么呢?这时我们做一个测试,我们之前认识过一个系统调用接口chdir,他可以帮助我们更改当前目录return 1;fclose(fp);return 0;我们先删除log.txt运行程序后,发现并没有在当前目录生成文件而是生成到了更改后的目录我们在proc目录下查看该进程的信息。

2026-11-08 23:33:51 168

原创 【Linux】进程控制

main函数是代码的入口,但实际上main函数只是用户级别代码的入口,main函数也是被其他函数调用的,main函数调用结束后就应该返回相应的退出信息,而这个所谓的退出信息就是以退出码的形式作为main函数的返回值返回,我们一般以0表示代码成功执行完毕,以非0表示代码执行过程中出现错误,这就是为什么我们都在main函数的最后返回0。对于父进程来说,子进程是需要被标识的,因为父进程创建子进程的目的是让其执行任务的,父进程只有知道了子进程的PID才能很好的对该子进程指派任务。

2026-11-08 23:33:07 220

原创 【C++】STL - Vector类的模拟实现

我们最后需要更新_finish指针的指向,计算出有效数据的偏移量,当_start指针的指向改变后我们再调用size函数通过_finish - _start计算出的有效数据的个数就是一个随机值了。erase函数可以删除所给迭代器pos位置的数据,在删除数据前需要判断容器释放为空,若为空则需做断言处理,删除数据时直接将pos位置之后的数据统一向前挪动一位,将pos位置的数据覆盖即可。_start指向容器的头,_finish指向容器当中有效数据的尾,_endofstorage指向整个容器的尾。

2026-09-20 19:36:25 170

原创 【C++】STL - Vector类

1. vector是表示可变大小数组的序列容器。2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问,和数组一样高效。3. vector使用动态分配数组来存储它的元素。4. vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是 对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。

2026-09-20 19:35:56 42

原创 【C++】STL - string类的模拟实现

append函数的作用是在当前字符串的后面尾插一个字符串,尾插前需要判断当前字符串的空间能否容纳下尾插后的字符串,若不能,则需要先进行增容,然后再将待尾插的字符串尾插到对象的后方,因为待尾插的字符串后方自身带有’\0’,所以我们无需再在后方设置’\0’。在C字符串中我们通过[ ] +下标的方式可以获取字符串对应位置的字符,并可以对其进行修改,实现[ ] 运算符的重载时只需返回对象C字符串对应位置字符的引用即可,这样便能实现对该位置的字符进行读取和修改操作了,但需要注意在此之前检测所给下标的合法性。

2026-09-20 19:35:23 159

原创 【C++】STL - string类

string();//复制s字符串//复制s所字符串的前n个字符//生成n个c字符//复制str//复制str的字符从pos位置开始向后len个字符string s1;

2026-09-20 19:35:03 226

原创 【C++】模板

class 类模板名//类内成员定义public:_a = tmp;_size = 0;_size = 0;类模板中的成员函数若是放在类外定义时,需要加模板参数列表。void Pop();~Stack();_a = tmp;_size = 0;

2026-09-20 19:34:27 64

原创 【C++】类和对象(下)

若一个类没有默认构造函数,那么我们在实例化该类对象时就需要传参对其进行初始化,所以实例化没有默认构造函数的类对象时必须使用初始化列表对其进行初始化。

2026-09-13 09:31:29 182

原创 【C++】类和对象(中)

这里区分一下以下三行代码。

2026-09-13 09:31:14 86

原创 【C++】类和对象(上)

1、声明和定义全部放在类体中。需要注意:成员函数如果在类中定义,编译器可能会将其当成。

2026-09-13 09:30:51 162

原创 【C++】初识C++(二)

当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

2026-09-13 09:30:19 214

原创 【Linux】进程概念

当一个进程将要退出的时候,在系统层面,该进程曾经申请的资源并不是立即被释放,而是要暂时存储一段时间,以供操作系统或是其父进程进行读取,如果退出信息一直未被读取,则相关数据是不会被释放掉的,一个进程若是正在等待其退出信息被读取,那么我们称该进程处于僵尸状态(zombie)。有了进程地址空间后,每个进程都认为看得到都是相同的空间范围,包括进程地址空间的构成和内部区域的划分顺序等都是相同的,这样一来我们在编写程序的时候就只需关注虚拟地址,而无需关注数据在物理内存当中实际的存储位置。

2026-09-13 09:29:58 162

原创 【C++】初识C++(一)

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度 的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语 言。为了表达该语言与C语言的渊源关系,命名为C++。

2024-06-29 21:18:53 1350 1

原创 【Linux】初识操作系统

现在该体系的运行流程就是:用户输入的数据先放到内存当中,CPU读取数据的时候就直接从内存当中读取,CPU处理完数据后又写回内存当中,然后内存再将数据输出到输出设备当中,最后由输出设备进行输出显示。但是输入设备和输出设备相对于中央处理器来说是非常慢的,于是在当前这个体系整体呈现出来的就是,输入设备和输出设备很慢,而CPU很快,根据木桶原理,那么最终整个体系所呈现出来的速度将会是很慢的。这里有三个身份,校长,老师,学生,校长想要学生的信息,让老师去收集,在这里校长就是决策者,老师就是执行者。

2024-06-27 16:18:53 655

原创 【Linux】gdb调试器

在Linux当中gcc/g++默认生成的可执行程序是release版本的,是不可被调试的。1)「list/l n」:显示从第n行开始的源代码,每次显示10行,若n未给出则默认从上次的位置往下显示.。5)「print/p 表达式」:打印表达式的值,通过表达式可以修改变量的值。6)「display 变量」:将变量加入常显示(每次停下来都显示它的值)。7)「display &变量」:将变量的地址加入常显示。4)「delete/d 编号」:删除指定编号的断点。4)「print/p &变量」:打印变量的地址。

2024-06-26 16:45:39 1241

原创 【Linux】makefile与进度条小程序

对于依赖关系而言,: 左边为目标文件,: 右边为依赖文件依赖方法前需要有一个 tab ,为固定格式: 右边可以有多个依赖文件 ,: 右边通常被称为依赖文件列表对于 : 右边,目标文件对应的依赖文件列表可以为空 (例如 clean)makefile 默认执行第一组的依赖关系和依赖方法,对于第一组可以直接使用 make 执行,后面则需要 make + 目标文件。

2024-06-25 21:20:25 713

原创 【Linux】Linux编译器(gcc,g++)与动静态链接库

首先清楚一点,我们写的代码里面经常会用库函数,这些调用接口的方式是我们写的,但是这些库函数的底层实现不是我们写的,而这中间就有一个调用库的过程。我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而 没有定义函数的实现,那么,是在哪里实“printf”函数的呢?

2024-06-24 19:40:59 1407

原创 【Linux】Linux基础开发工具(yum)

yum工具在每次安装指定软件包的时候,都会检测源服务器上的软件包信息,为了便捷不用每次都去搜索软件包信息,因此使用 yum makecache将软件包信息缓存到本地,使用 yum clean all 清理老旧的缓存信息。因为yum是从服务器上下载RPM包,所以在下载时必须联网,可以通过ping指令判断当前云服务器是否联网。yum会自动卸载该软件,这时候敲“y”确认卸载,当出现“complete”字样时,说明卸载完成。就是因为有了该文件里面的下载链接,系统才会知道软件在哪里下载,系统只会承认此文件名。

2024-06-23 13:18:47 820

原创 【Linux】权限的概念

Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。 而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。什么是shell: 从技术角度,Shell的最简单定义是:命令行解释器(command Interpreter)主要包含:对于shell的理解:对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作shell 对于Linux,有相同的作

2024-06-21 13:06:58 1336 2

原创 【Linux】基础指令(三)

安装和登录命令:login、shutdown、halt、reboot、install、mount、umount、chsh、exit、last;网络操作命令:ifconfig、ip、ping、netstat、telnet、ftp、route、rlogin、rcp、finger、mail。系统管理相关命令:df、top、free、quota、at、lp、adduser、groupadd、kill、crontab;文件处理命令:file、mkdir、grep、dd、find、mv、ls、diff、cat、ln;

2024-06-19 15:08:10 1926

原创 【Linux】基础指令(二)

所以,输入重定向就是改变原先从键盘上读取数据的方式,改为从其他文件中读取数据,其实这里使用 cat test.txt 和 cat < test.txt 的效果是一样的,但是还是有些区别:第一个是通过命令行参数获得文件名,第二个是通过重定向获得文件名。cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。less 工具是对文件或其它输出进行分页显示的工具,应该说是linux查看文件内容的工具,功能强大。

2024-06-18 19:33:49 809

原创 【Linux】基础指令(一)

tab:自动补全,当指令忘记时,例如 mkdir,只输入了 mk,这时快速按两次 tab 就会列出和 mk 相关的指令,并保留输入。ctrl + x 为退出,ctrl + x 后会提示是否保存,y(保存),n(不保存),c(取消),然后按下回车 enter 退出。Linux的目录结构整体是一个多叉树,他的叶子结点一定是空目录或者非目录文件,路上节点一定是一个非空目录。对于目录,该命令列出该目录下的所有子目录与文件。Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。

2024-06-14 11:11:05 1288

原创 【数据结构】排序(归并排序,计数排序)

稳定性。

2024-05-16 09:59:23 695 1

原创 【数据结构】排序(冒泡排序,快速排序)

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。中间的 key 值不用管,当前 key 值已经到了正确的位置。3.停止之后,left 开始走,如果 left 指向的元素小于key 指向的元素,则left++ ,如果指向元素大于key 指向的元素,则停止。

2024-05-15 22:02:53 1051

原创 【数据结构】排序(选择排序,堆排序)

当begin 和maxi 的位置重合,那么begin 和mini 在交换的时候,就把最小值换到了 begin(maxi) 处,最大值被换走了。在剩余的array[i]--array[n-2](array[i+1]--array[n-1])集合中,重复上述步骤,直到集合剩余1个元素。每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的 数据元素排完。若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换。4. 稳定性:不稳定。

2024-05-15 12:56:25 395

原创 【数据结构】排序(直接插入排序,希尔排序)

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法是稳定的;直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个新的有序序列。所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

2024-05-15 00:04:47 1120

原创 【数据结构】二叉树相关题目(2)

思路:每一层函数栈帧中都包括,如果 root 等于空,返回 false,如果调用相同的树为真,返回 true。每一层往下判断是否为相同的树。思路:先求出树的结点个数,开好数组之后进行后序遍历即可。思路:先求出树的结点个数,开好数组之后进行中序遍历即可。思路:先求出树的结点个数,开好数组之后进行前序遍历即可。思路:用求树深度的方式判断。

2024-05-04 19:22:46 289

原创 【数据结构】二叉树相关题目

时每一层函数的栈帧中存在这样的条件:p 为空,q 也为空,返回 true;p 或者 q 只有一个为空,返回 false;p 和 q 的 val 不等,返回 false;否则 p 和 q 的 val 是相等的才递归。两边同时遍历,边遍历边进行比较,完成遍历后返回真,否则为假。使用后序遍历的思想,先遍历,后调整。一棵树对称就是 它的左右子树呈。把左右看成两个独立的树。

2024-05-02 20:04:15 425 2

原创 【数据结构】二叉树的实现

而第二种情况是队列不为空,但在访问队头节点时访问到了 NULL,这时我们需要再次进行循环,若队列不为空,就进入循环逐个查找并删除队头的节点,若发现不为空的节点,说明节点间有 NULL 相隔,即该二叉树不是完全二叉树,返回false。设二叉树的根节点所在层数为 1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第 2 层上的节点,接着是第三层的节点,以此类推。若节点不为空,但节点的值不是我们要查找的值,就查找节点的左子树,如果查找的结果不为空,就返回该节点。

2024-05-02 18:25:40 257 2

原创 【数据结构】二叉树的结构与堆

堆删除的实质是删除堆顶元素,如果我们直接删除堆顶的元素,再将数据挪动,就会破坏堆的结构,所以这种方法并不可取;在这里选择的调整方法是:将根节点与它的孩子中的较小值交换,然后再将交换后的节点作为父节点继续与它的子节点交换,直到该节点小于它的子节点,或者成为叶节点。插入时从尾部插入,而是否为堆取决于子节点和父节点的关系,若为小堆则子节点要比父节点要大,否则就需要交换子节点和父节点,大堆则相反。换句话说,将根节点最大的堆叫做最大堆或大堆,根节点最小的堆叫做最小堆或小堆。,相反根节点始终大于子节点则称为。

2024-05-01 22:16:03 73 1

原创 【数据结构】二叉树概念与结构

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

2024-04-30 15:09:32 607 1

原创 【数据结构】堆的复杂度,堆排序和TOP-K问题

堆通常是一个可以被看作一个完全二叉树,满二叉树也可以看做一个完全二叉树,所以我们可以用满二叉树来证明。调整次数用N来表示,从倒数第二层开始调整(叶子节点不用调整)

2024-04-22 18:38:49 1180 1

原创 【数据结构】栈与队列相关题目

队列大小是固定的,空间可以重复利用,当放置完最后一个数据后rear需要回到头部。,把有数据的队列的元素出到空队列直到只剩一个元素。再出栈剩下的那个数据,此时出栈数据就是栈顶数据。栈是先入后出,队列是先入先出,我们可以创建两个栈PushST,PopST,用来入队列和出队列。如果PopST中没数据则把PushST中数据导入到PopST,若有数据直接出栈。此题思路和栈很契合,遇到左括号压栈,遇到右括号就取栈顶元素匹配。因为队列是先进先出,栈是先进后出,所以我们可以创建两个队列,直接把数据放到PushST里。

2024-04-13 17:11:27 406

原创 【数据结构】队列的链表实现

这里注意,当队列里只有一个数据时,仅释放phead后ptail会变成野指针,所以这里多加一个判断,当队伍里只有一个数据时,phead和ptail都置空。队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out)因为队列是队尾入数据,队头出数据,在考虑到数组的头删效率比较低后,我们选择用链表来实现队列。因为单链表在尾插时比较麻烦,所以可以记录下队列的头和尾,以便尾插。入队列:进行插入操作的一端称为队尾。

2024-04-09 14:24:07 825

原创 【数据结构】顺序栈

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。栈中的数据元素遵守后进先出(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,出栈:栈的删除操作叫做出栈。

2024-03-28 13:38:18 420 1

原创 【数据结构】链表相关题目(2)

思路是先在原链表每个节点后面复制一个相同的节点,这样复制节点的random就是原节点random-->next,再断开复制节点即可。还是先用快慢指针,找到相遇点,存储下此点的下一个点作为。大体思路为先用快慢指针找。走,当两指针相遇时,就是环的。,找到相遇点后用一个指针从。,后用链表相交的方法即可。,然后让此点指向空作为。

2024-03-26 13:33:17 445

原创 【数据结构】 双向链表

在我们学习单链表的过程中,发现单链表有个,在单链表尾插时,需要找到尾节点。在单链表尾删时需要找到尾节点前一个节点。这里的时间复杂度都为O(N),而带头双向循环链表就完美的解决了这个问题。与单链表不同,双向链表多了一个prev指向了前面一个节点,最后尾也不指向NULL,而是指向了哨兵位。所以哨兵位的prev就直接能找到尾节点,简单且快速。

2024-03-14 17:27:01 1005 1

原创 【数据结构】单链表相关题目

Q1:slow 和 fast一定会相遇么?A1一定会相遇,fast会先进环,假设slow进环时,slow和fast之间的距离是N,slow进环后,fast开始追击,slow每走1步,fast每走2步,他们之间距离每次会缩小1。追击过程中他们的距离变化:当fast每次走两步以上slow 和 fast能不能相遇?不一定,slow进环后,fast开始追击,slow每走1步,fast每走3步,他们之间距离每次会缩小2。

2024-03-06 17:23:27 832 1

原创 【数据结构】单链表

链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链 接次序实现的。

2024-02-26 13:03:33 990 1

空空如也

空空如也

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

TA关注的人

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