自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++map和set

顺序容器中的元素是按照他们在容器中的存储位置来顺序保存和访问的,比如list、string、vector、deque、array。set底层使用红黑树来实现,增删查效率是O(logN),迭代器遍历采用的是中序遍历(双向迭代器)关联式容器也是用来存储数据的,逻辑结构通常是非线性结构,两个位置交换一下存储结构就被破坏了。map一个节点里存两个值,插入的是pair,里面有first和second两个数据。序列式容器逻辑结构为线性序列的数据结构,两个存储的值之间一般没有紧密关联,

2025-07-24 18:18:48 562

原创 贪心算法简介

其实是贪心策略,是解决问题的策略,局部最优->全局最优解释:1、将解决问题的过程分为若干步2、解决每一步的时候,都选择当前看起来最优的解法3、希望得到全局最优解。

2025-07-23 21:23:42 608

原创 Linux入门介绍

2、计算机有操作系统---计算机+操作系统必然会进入高校---1991年,芬兰赫尔辛基大学 雷纳斯托瓦兹,在用学校的搭载Unix的电脑,想要打造一个免费的操作系统---Linux诞生(现在也可以找到当时的原码,C语言+部分汇编)---所有的操作系统刚开始诞生,都是没有图形化界面的。第一条线---最有代表性的Unix(用的是汇编语言,肯 · 汤普森)---丹尼斯里奇发明C语言---两人用C语言加上部分汇编对Unix进行重写---全部用C语言重写。第二条线---苹果OS,微软os。

2025-07-21 20:48:15 229

原创 C++二叉搜索树

二叉搜索树是一棵空树,或者是具有以下性质的二叉树:1、若左子树不为空,则左子树上所有节点的值都小于等于根节点的值2、若右子树不为空,则右子树上所有节点的值都大于等于根节点的值3、他的左右子树也分别为二叉搜索树——和堆还不一样,它不区分左右子树,要么都小,要么都大,或者相等二叉搜索树的结构决定了查找一个值时,只要根的值比查找的值大,就往左走;只要根的值比查找的值小,就往右走;直至最后走到空,若还没有找到,就结束,没有这个值。

2025-07-21 16:13:49 613

原创 C++虚函数易错点整理

虚函数只能是成员函数,友元函数不能作为虚函数·重载是在相同作用域中的同名函数,拥有不同的参数(类型或者是数量不同),返回类型可以不同,来进行行为的函数·重写就是覆盖,针对多态,重定义就是隐藏,两者都是要在同一个继承体系当中,但是父类和子类都有自己独立的作用域,因此重写和重定义不是重载;而重写要求三相同(函数名、返回类型、参数),但是协变除外(可以返回基类或子类的指针或者引用),在以上体系中只要不构成覆盖,就构成隐藏。

2025-07-20 21:00:39 401

原创 C++多态知识点真理

多态,通俗来说就是多种形态,分为编译时多态(静态多态)和运行时多态(动态多态)编译时多态主要就是前面讲的函数多态和函数模版,通过参数不同达到多种形态,将它叫做编译时多态,是因为他们的实参传给形参的过程中实现的一般将编译时成为静态,将运行时成为动态运行时多态,具体点就是去完成某个行为(函数),可以传不同的对象就会完成不同的行为,就达到多种形态class Apublic:virtual void print() final//final修饰的虚函数无法被重写。

2025-07-20 17:51:42 1040

原创 C++重载、重写、隐藏的对比

2025-07-20 16:25:19 101

原创 C++继承与组合

/对父类的成员使用父类的运算符重载。// 1、子类的构造函数必须调用父类的构造函数构造父类的部分,如果父类没有默认构造函数。// ·组合是一种黑箱复用对象的内部细节不可见,要求被组合的对象有定义良好的关系,耦合度更低。// 2、当子类和父类有同名的成员变量时,子类会限制父类对同类成员变量的访问,这叫做隐藏。// (父类的private子类不能访问,因此如果继承的话子类中父类的部分无法被初始化)//迭代器的设计就是封装,有可能是原生指针,有可能是类封装的指针,屏蔽了底层的复杂细节。

2025-07-19 16:27:06 1048

原创 C++中vector和list的优缺点对比以及deque

开辟若干个数组(buff),还有一个中控数(是一个指针数组ptr),会试图把第一个数组的地址放在中控数组中间;假设每个buff数组大小是N,要获取第i个数据,x = i / N就是第x个数组,y = i % N就是第x个数组的第y个。访问方式就是ptr[x][y],即 *(*(ptr + x) + y)1、尾插尾删效率不错,支持高效下标随机访问。2、物理空间连续,所以告诉缓存利用效率高。1、按需申请释放空间,不需要扩容。1、空间需要扩容,扩容有代价。2、头部和中间插入删除效率低。两者基本上优缺点互补。

2025-07-16 15:59:31 122

原创 C++中list各种基本接口的模拟实现

在一个就是关于iterator和const_iterator的实现问题,比较简单的方法可以是先实现一个iterator,在复制一份,将其中的解引用和箭头更改为const版本;两种方法在效率上没有区别,但第二种相对更加简洁。因为我们的链表在内存中不是连续存储的,所以不能够使用原生指针作为迭代器,所以需要单独封装一个类,来实现迭代器比如解引用、++、--、->、!三、还有一个可以注意一下的小点是struct默认是公有,class默认是私有,因此迭代器作为非常常用的类可以将它写为struct,访问更加方便。

2025-07-15 17:20:53 430

原创 vector各种接口的模拟实现

其实相比string,vector的接口就要简单许多而且更加规范清晰,但是这里也有我们需要注意的问题,一个是浅拷贝的问题,另一个就是迭代器失效首先是浅拷贝,这里最容易给自己挖坑的就是在reserve()函数的时候,直接用memcpy()去一个字节一个字节的拷贝,一但调用时使用的是自定义类型,就会因为浅拷贝崩溃(例如vector<string>);

2025-07-13 15:59:04 451

原创 初阶数据结构易错点整理

我们通过顺序表来实现,其实最难判断的点就是队列已满和队列为空,所以采取简单的方法是,如果我们需要存储 k 个数据的循环队列,那么我们只需要开 (k + 1)的空间,这样的话让队尾(rear)指向最后一个数据的下一个,这是如果(rear+1)%(k + 1)就是队头,则队列已满;然后,对于笔试题来说,前序序列最大的用处就是确定根节点,中序序列最大的用处就是确定子树(左子树是哪些节点,右子树是那些节点,这里判断出来的不是顺序,是有哪些),后序就是前序的逆置,看的方法就是从后往前看,一次是根、右子树、左子树。

2025-07-12 10:44:39 605

原创 C语言易错点(二)

本文整理了C语言编程中的12个关键知识点:1)转义字符用法;2)除法和取模运算规则;3)大小端字节序判断方法;4)printf的参数传递机制;5)位段的使用及跨平台问题;6)枚举类型的特性;7)文件读写操作要点;8)预处理、编译、链接的区别;9)二进制位交换宏实现;10)offsetof宏的实现原理;11)头文件防护机制;12)动态内存常见错误。这些内容涵盖了C语言底层特性、内存管理、编译过程等核心概念,对理解C语言工作机制具有重要参考价值。

2025-07-11 15:00:40 1205

原创 C语言易错点整理(一)

9、变长数组是用整型变量或表达式来定义数组大小,他的大小一定在运行的时候确定,不是在编译的时候,而且一但确定了就不能再改变(注意区分柔性数组)1、对于字符数组而言,只是将这些字符放进我们所开辟的空间里,不能直接用strlen计算,因为没有"\0",会导致出现随机值,例如一下代码。13、对于一个表达式,就是我们已经确定了优先级以及结合性,也不一定能确定计算结果,比如以下代码,在vs和Linux gcc测试结果就不同。14、A中const修饰的是*p表示的是*p不可修改,即p指向的对象不可以被修改;

2025-07-10 17:38:40 501

原创 C++中string的模拟实现

一、模拟实现string的基本功能列表,以及直接写在头文件中的短小频繁调用的被编译器视为内联函数的函数定义。——其中包括一些功能的现代写法,利用构造函数来方便书写代码,如赋值运算符重载。二、以上各功能的具体代码实现。

2025-07-07 20:36:29 329

原创 C和C++内存管理方式

而realloc是为目标对象申请一块指定大小的空间,再将对象直接迁移过去,或者直接在目标对象之后开辟空间,让目标对象空间变为指定大小。在对象数组头上多开的4个字节,其实是为了告诉delete【】我要释放多少空间,并告诉delete第一个对象的前一个空间也要释放。//——new底层调用的是malloc,而new【】调用了10次malloc。//在编译器开多个对象的数组时,会在头上多开四个字节的空间,用于存储数组中对象个数。

2025-07-03 11:10:13 442

原创 C/C++内存分布

—全局数据、静态数据放在数据段(静态区)int num1[10] = {1, 2, 3, 4};*pchar3——常量区。

2025-07-02 19:02:10 479

原创 类和对象3

/ //初始化列表->缺省值(不是在构造函数里写的,是在声明这个地方)->内置类型(不确定是否初始化》/自定义类型(调用对应的默认构造)// 是在一个类里定义的另一个类,是包含它的类的友元,并且受到包含他的类的访问限制(要先访问外面的在访问里面的)// //成员变量的定义放在初始化列表里,每个成员变量都会走初始化列表,初始化列表里不写也会走。//const只有一次复制的机会,只能在定义的地方初始化。// //初始化列表初始化的顺序按照声明里给的顺序,与初始化列表里的顺序无关。

2025-07-02 17:34:11 435

原创 类和对象中2

/ Date& operator= (const Date& d)//这里也可以传值,但最好传引用,可以减少拷贝。// //Date(const Date& d)//这里用别名的话,就不会传参,也就不会形成拷贝构造。// //每次拷贝都要传参,而传参又要调用拷贝构造,最后就会因为没有结束条件而引发无穷递归。// //没有显示定义,编译器会自动生成,重载行为跟默认拷贝构造类似,会完成浅拷贝,// //这里如果传值参的话,就会引发无穷递归,因为每次传参都要调用拷贝构造。

2025-06-30 15:39:42 596

原创 【无标题】

/其实类里的每个成员变量都是这样访问的。// // 因为CPU有数据总线,规定必须从固定的整数倍位置开始读,每次读固定的整数字节。// //结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。// // 空间换时间,CPU读取内存数据的时候,不是能够从任意位置开始读的。// 析构函数和构造函数相反,不是完成对对象本身的销毁,完成的是对象中的资源清理。// //当有嵌套结构体时,嵌套的结构体对齐到自己的最大对齐数的整数倍处。

2025-06-29 20:44:20 308

原创 C++基本语法与类和对象一

/这里d的整型部分会给一个临时对象,而ri是这个临时对象的别名,而临时对象具有常性。//}这里就是野指针一样的东西,因为a建立在栈上,用完即销毁,这里返回的引用是野指针一样的东西,编译会给警告。//namespace 本质是定义一个域,不同的域可以有相同的命名,相同的与不可以有相同的名。// //cout是ostream类对象,主要面向窄字符的标准输出流,有自动类型识别。//rbb是临时对象的别名。//nullptr是一个特殊的关键字,是一种特殊类型的字面常量,可以转换成任意指针类型,

2025-06-28 15:44:03 959

原创 常见排序算法整理

(比如说第三个位置是最大值,将最大值换到是最小值的首位(假设),如果这时候第二位也是最小值,则顺序发生改变)稳定性:相同的值先后顺序排完后是否发生变化:一般情况下没问题,但比如排结构体的时候很有意义。现规定,总分相同,看语文成绩,所以我们可以:(有点类似于基数排序的思想)(如果使用稳定的排序的话,可以保证相同的总分,语文分高的在前面)(相同的数据有可能预排序时分到了不同的组里面)(可以保证每个值插入相等的值的后面)(快排要走递归,递归要走logN层)2、再按总分排序(稳定的排序)(跨位置交换的都很不稳定)

2025-06-25 16:23:54 584

原创 二叉树的性质

在后序的过程中,每增加一个度为1的,这个节点有一定是由度为0的节点过来的,即增加一个度为1的,就会减少一个度为0的,但也多出了另一个度为0的;若增加一个度为2的,度为2的,一定度为1的变过来的,会增加一个度为0的,减少的是度为1的。三、对于任何一棵二叉树,度为0的节点即叶节点(n0)的数量一定比度为2的分支节点(n2)多一个。四、完全二叉树中度为1的节点的个数要么是1,要么是0(具体有做题的时候式子是否成立可得)二、若规定根节点的层数为1,则深度为h的二叉树最大节点数是2^h-1。3、右孩子为左孩子加一。

2025-06-22 21:20:43 194

原创 链式二叉树经典题目

6、给定一个字符数组,用数组中的每个元素构建一个二叉树,若为空格,则用#表示,在树中为NULL,最后中序遍历,输出树中的所有元素。// //这里的int* returnSize是为了收到数组的个数,而采用整型指针的原因是为了修改实参。// if (p == NULL || q == NULL)//其中一个为空,另一个不为空。//前序遍历一个二叉树,将每个数放入一个数组中,并让使用者的主函数里关于二叉树大小的局部变量改变。// //找到这棵树的所有子树。//判断一棵树是不是轴对称的树。

2025-06-21 17:38:46 696

原创 链式二叉树的基本功能

/但是这样会有问题,第一次调用不会有问题,但第二次调用,size就不再初始化了,会在第一次基础上累加。//用递归解决问题,其实所要做的事情就是先设置返回条件,然后让每个人只干自己干的事,不管其他人是怎么干的。//递归的时候自己调用自己,并不会死循环,只要有结束条件,因为每次自己调自己的时候传的参数不一样。//左子树的第(k-1)层节点个数+右子树第(k-1)层节点个数。//前序遍历——根、左子树、右子树。//中序遍历——左子树、根、右子树。//后序遍历——左子树、右子树、根。//这里创建全局变量。

2025-06-20 14:50:24 393

原创 二叉树基本学习

/这里的i相当于是数组中的第i个元素,而我们在这里做的事情是对每个节点都一步步进行向下调整(这里的节点是每个叶节点的父节点)//这里进行的目的是让完全二叉树成为堆,所以从最后一个节点的父节点开始,一直到根节点的每个节点进行AdjustDown。// ——这里有递归的思想,对于前序,任何一棵树的访问,都要符合前序,只有空才不能再拆,也就是循环的回归条件。// 用前k个数,建一个小堆,剩下的数据跟堆顶比较,若比堆顶的数据大,则替换堆顶的数据进堆。//前面的size-1个都是元素。

2025-06-19 22:44:47 372

原创 初识树及二叉树

/ 树都是由递归定义的:将大问题拆解为小问题,小问题被拆解为更小的问题,但最后会被拆成一个。// 二叉树是树的子集,每个节点最多有两个孩子,有一个根节点,加上两棵左子树和右子树。// 满二叉树:每一层的每个节点的度都是二(除了叶子),h层的满二叉树共有2^h-1个节点。// 祖先:从父节点到根节点都是祖先节点(都是直系亲属)// ·孩子节点或子节点:一个节点含有的子树的根节点。// 兄弟节点:(亲兄弟)有同一个父节点的两个节点。

2025-06-18 20:48:55 500

原创 设计循环队列以及用栈来实现队列、用队列实现栈、和括号匹配问题

/解决方法一:用一个size表示个数,解决方法二:开辟一个新空间,大小是循环队列的大小+1。//因为这里使用数组来实现的栈,所以这里的top相当于栈顶元素的下一个位置在数组中的下标。//开辟结构体的时候用结构体大小,而开辟数组和顺序表的时候用单位大小×元素个数。//队列是以链表的方式实现的。//这里应理解为结构体是一个整体,这个整体里有一个数组,两个指针,以及数组的大小。

2025-06-17 21:05:38 569

原创 有效的括号

/因为这里使用数组来实现的栈,所以这里的top相当于栈顶元素的下一个位置在数组中的下标。//让top指向我们的栈顶数据。//让top指向栈顶数据的下一个位置。//这里top相当于数组下标。STDataType STTop(ST* pst)//返回栈顶元素。// 看左括号和右括号是否相等。

2025-06-16 15:47:44 444

原创 六月十五号Leetcode

这里可以理解为先让我们的meet指针回到我们的环的起点位置(-N),此后再让他走x圈(+x*C),在某次他走完一圈以后,从head开始的cur指针就也到达了环的起点,而这时meet也在起点,两者相遇。slow走的路程一定是小于C的,因为slow每走一步,两者之间的距离都小一,而两者间最大距离最大就是C(不等于),所以slow只走环的一部分就追上了。假设slow进环时,fast与slow之间的距离是N,两者之间的距离每次运动缩小一,一定会出现N = 0 的情况,所以一定会相遇。

2025-06-15 20:59:47 716

原创 找两个链表的公共节点

/A链表的节点一次跟B链表的所有节点比较,A某个节点跟B链表某个节点相等,这个节点就是交点。//abs(lenA - lenB)求绝对值。//也不能同时走,相交都会变成不相交。//这样我们就不在关注到底谁长。//再求两链表的长度差值。

2025-06-15 12:31:44 281

原创 轮转数组题解

/不知道循环条件写啥,就先空着,看最后一次运算是什么样的。

2025-06-14 13:49:20 179

原创 给定从0到n的整数但缺少了一个找出来

把所有从0到n的数都加起来,在把给定的数都减去这个和,得到的就是这个缺少的数。//零跟任何数异或都是这个数本身。}//相同的数字异或为零。

2025-06-14 10:03:06 171

原创 初学时间复杂度

/时间复杂度是一个函数(数学里的函数式),计算的是算法中基本操作的执行次数(实际上估算出来的是量级)//时间复杂度主要衡量主要衡量一个算法的运行快慢,而空间复杂度主要衡量运行一个程序所需额外开辟的空间。//O(n)线性阶;//算法就是定义良好的计算过程,是一系列计算步骤,将输出结果转化为输出结果。//大概估算:大O的渐进表示法:O(影响最大的一项)若影响同等则都写上。//时间复杂度是一种保守的、悲观的预估,看的是最坏、最慢的情况。//O(1)不是代表一次,代表的是常数次。//目的是计算算法属于那个量级。

2025-06-13 22:44:29 469

原创 memcpy和memmove的区别

两者都可以将src(源头)指向的内容拷贝到dest(目标)指向的空间,但两者对于重叠部分的处理不同:前者对于重叠区域未定义,直接使用会导致数据丢失;而后者能够处理重叠的情况(若进行模拟实现,可以根据dest和src的相对位置关系来决定是从前往后拷贝还是从后往前拷贝)

2025-06-13 16:51:43 253

原创 双向链表——(有头双向循环链表)

/先通过查找找到要进行插入的节点,然后再将这个节点传给函数,让函数在她的后面插入。//LTErase和LTDestroy参数理论上要传二级,因为我们需要让形参的改变影响实参,但是为了保持接口的一致性才传的一级。//传一级的问题是,当形参phead置为空后,实参plist不会被释放,若继续使用plist会导致野指针。//若双向链表为空,仍然成立,因为哨兵位的prev和next都指向自己。//哨兵位节点不能被改变,节点的地址也不能发生改变,所以建议采用一级指针。//单链表为空的时候,就是一个空链表。

2025-06-13 16:14:55 965

原创 链表的分类

1、共八种:带头、不带头(是否带有哨兵位,该哨兵位结点即头结点);单向、双向(每个结点具有两个指针域一个数据域,可以指向前后的结点,可以从两个方向进行遍历);循环、不循环(尾节点的next是否为空若为空则不循环,否则循环)。共1×2×2 = 8种。4、虽然双向链表的结构看上去很复杂,但实际上双向链表的实现比单链表简单的多,代码量也少得多。2、不带头单向不循环链表叫做单链表 SList中的S为single。3、常见的只有单链表和双向链表(带头双向循环链表)。5、基本上双向链表不存在循环的代码(除了销毁)

2025-06-12 21:49:28 82

原创 单链表经典算法题之分割链表

/防止死循环,并将next指针初始化。//思路三:创建两个链表,一个是大链表,一个是小链表,都整一个哨兵位。//思路二:创建新链表,使用哨兵位,比x大的尾插,比x小的头插。给定一个头结点和一个值x,是链表中所有小于x的值都在x前面。//小链表的尾节点与大链表的第一个有效节点结合。//超出时间限制只有一种情况:就是代码出现了死循环。//思路一:在原链表上进行修改。//创建新链表时,若进行尾插,则要考虑。

2025-06-12 21:33:58 456

原创 单链表经典算法

/此时链表不为空,头尾指针都指向了没有存储有效数据的有效地址。while(fast && fast->next)//fast要在前面,因为若fast为NULL,则对他解引用会报错,若fast为空,fast在前,就不会执行后面的。* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可。// 找值不为val的节点,尾插到新链表中。* @param n int整型。* @param m int整型。//根据n创建代还链表。// 创建一个空链表。//先创建第一个节点。

2025-06-12 17:26:02 581

原创 单链表专题

/链表也是线性表的一种,物理结构上非连续、非顺序,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。//针对顺序表:中间/头部插入效率低下,增容降低运行效率、增容造成空间浪费。// printf("找到了");// printf("未找到");// 链表是由一个一个的节点组成(结点)// //将四个节点连接起来。// //调用链表的打印。// //创建几个节点。//在指定位置之前插入数据。//在指定位置之后插入数据。//删除pos之后的节点。

2025-06-11 16:29:25 641

空空如也

空空如也

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

TA关注的人

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