- 博客(40)
- 收藏
- 关注
原创 C++学习之路,从0到精通的征途:继承
几乎很少使用protetced/private继承,也不提倡使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实际中扩展维护性不强。,派生类的构成必须调用基类的构造函数,但是基类的构成函数私有化以后,派生类看不见就不能调用了,那么派生类就无法实例化出对象。,多继承对象在内存中的模型是,先继承的基类在前面,后面继承的基类在后面,派生类成员在放到最后面。基类的其他成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式),
2025-05-13 22:20:33
1001
8
原创 C++学习之路,从0到精通的征途:priority_queue类的模拟实现
以优先队列为例,如果我们想要控制优先队列为大堆或小堆,我们就要实现对应的仿函数:less与greater,仿函数(Functor)也被称作函数对象,它是一种行为类似于函数的对象。在文档中可以看到,对于priority_queue类有三个模板参数,关于向下调整与向上调整算法的原理,在。如此一来,这个类的对象就能够像函数一样被调用。仿函数在算法中能根据具体需求灵活调整行为。三.priority_queue的接口实现。仿函数可依据需求定制其行为,通过重载。中有进行讲解,可以前往学习,3.实现两个简单的仿函数。
2025-05-06 23:38:08
1070
10
原创 C++学习之路,从0到精通的征途:stack_queue的模拟实现及deque原理介绍
双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与 list比较,空间利用率比较高。虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为。(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),来进行,当begin()中的cur与end()中的cur相等时,说明遍历已完成,而。对于deque的头插,对于deque的尾插,对于deque的遍历,可以。
2025-05-06 21:54:08
1050
6
原创 C++学习之路,从0到精通的征途:string类的模拟实现
在函数体内初始化_str,new一个size+1大小的连续空间,用来存放给定的字符串的‘\0’,申请完空间后,最后将给定字符串中的数据按字节拷贝给_str。如果在这里不写拷贝构造,那么编译器则会调用默认的拷贝构造来进行浅拷贝,则会导致同一块空间被析构两次,所以这里需要手动写深拷贝,并将数据按字节转移到新对象中。这里用s1的成员变量_str构造tmp,再将tmp和s2交换swap,这样tmp中的成员变量就与s2中的成员变量交换,出函数体后tmp同时也会被析构。当n>capacity,先进行扩容,再插入数据。
2025-04-13 17:34:05
861
8
原创 C++学习之路,从0到精通的征途:string类
目录一.string类的概念二.string的常见接口1.string类对象的常见构造2.string类对象的容量操作(1)size,length,capacity(2)reserve(3)resize(4)clear,shrink_to_fit 3.string类对象的访问及遍历操作 (1)auto与范围forauto关键字:范围for:(2)遍历1:operator[]/at (3)遍历2:迭代器(4)遍历3: 范围for4.string类对象的修改操作(1)+=,append,p
2025-03-24 23:41:23
836
9
原创 C++学习之路,从0到精通的征途:模板初阶
目录一.函数模板1.函数模板概念2.函数模板格式3.函数模板的原理 4.函数模板的实例化5.模板参数的匹配原则二.类模板1.类模板的定义格式2.类模板的实例化 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。 typename为用来定义模板参数的关键字,也可以使用class。 以Swap为示例:3.函数模板的原理
2025-03-19 22:56:42
758
4
原创 C++学习之路,从0到精通的征途:内存管理
可以看到new在这里除了开了一个A类型的空间外,还调用了A的构造函数,将1传给了初始化列表将_a初始化为1。在汇编中也可以证明这一点,可以看到汇编中有两个call指令当申请多个自定义类型的空间时,也会调用相同数量次数的构造函数:new在申请自定义类型的空间同时会调用该自定义类型的构造函数。
2025-03-18 20:28:21
716
3
原创 C++学习之路,从0到精通的征途:类和对象(中)
如果一个构造函数的第一个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数也叫做拷贝构造函数,也就是说拷贝构造是⼀个特殊的构造函数。2.拷贝构造函数的特点(1)拷贝构造函数是构造函数的一个重载。(2)拷贝构造函数的第一个参数必须是类类型对象的引用,使用传值方式编译器直接报错,因为语法逻辑上会引发无穷递归调用。拷贝构造函数也可以多个参数,但是第一个参数必须是类类型对象的引用,后面的参数必须有缺省值。
2025-03-15 21:21:04
1126
2
原创 C++学习之路,从0到精通的征途:类和对象(上)
1.1class为类的关键字,class后面跟类名{}中为类的主体,注意类定义结束后的分号不能省略,类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。public:// 成员函数perror("malloc申请空间失败");return;top = 0;// ...扩容int Top()private:// 成员变量int* array;size_t top;// 分号不能省略// ...int main()
2025-03-07 14:05:14
851
1
原创 C++学习之路,从0到精通的征途:入门基础
带有缺省参数的函数在声明和定义分离时,不能同时给缺省参数,规定必须在声明中出现。引用不是定义一个新变量,而是给已有的变量取一个别名,编译器不会为引用变量开辟空间,引用变量与被引用的变量使用同一块内存空间。类型& 引用别名 = 引用对象int a = 0;int& b = a;int& c = a;b,c是变量a的别名。这里引用符号&与取地址符号相同,根据用法区分即可。int& d = b;也可以给别名b取别名为d,所以d也是a的别名。
2025-03-04 22:27:24
1583
2
原创 LeetCode每日精进:622.设计循环队列
以队列长度k为4示例: 以队列长度k为4示例: 若用链表实现,那么就得使用环形链表实现循环结构 若用数组实现 分析:这样对比来看,用数组实现循环队列只需定义一个结构体,更加便捷。 以循环队列长度为4示例: 当循环队列长度为k时,我们申请k+1个数据空间的数组: 当队列为空,队头front和队尾rear指向同一个位置,即满足: 当队列已满时,rear的下一个位置指向front,即满足:
2025-02-25 14:51:26
992
原创 LeetCode每日精进:232.用栈实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):实现MyQueueint pop()int peek()truefalsesizeis empty100pushpoppeekemptypoppeek思路。
2025-02-18 23:34:04
1303
3
原创 LeetCode每日精进:225.用队列实现栈
这里我们将除非空队列中的最后一个元素4以外的元素按照顺序入到空队列中,由于需要返回出栈的元素,我们用top记录后,再出队列即可。假设栈中原有数据1,在将下一个数据入栈时,为了方便之后取栈顶元素和出栈的操作,下一个数据2直接找非空队列q1入队列即可。,若q2为空队列,那么令q1为非空队列,q2为空队列,这样无需再区分q1,q2哪个为空队列和非空队列了。所以入栈的操作是:找非空队列直接入队列即可,若两队列均为空,则入哪个队列都可以,图示中栈顶元素为4,对应我们定义的栈中非空队列q1的队尾元素4。
2025-02-18 14:51:17
1082
2
原创 LeetCode每日精进:20.有效的括号
若s为图中所示字符串,在匹配完合法括号后还有左括号入栈,那么就会导致跳出循环后。使用栈之前需要添加实现栈的相关代码:参考。的特性,可以借助栈来实现对应括号的消除,匹配。· 直接让左括号入栈。所以需要对循环后的栈进行判空,这里使用。,s为图示字符串,那么直接。,判断字符串是否有效。,进行下一组括号的匹配。,说明栈中还有左括号,
2025-02-17 22:12:58
874
1
原创 LeetCode每日精进:138.随机链表的复制
图中,pcur指向了一个地址为0x100,值为1的结点,我们让一个新指针repeat指向这个结点,那么repeat就是pcur所指向的这个结点的浅拷贝。由于链表为单向链表,原链表中random的指针的指向是随机的,若指向当前结点前面的结点,直接遍历创建新链表的方法会比较复杂,所以解决问题的关键在于。若又存在一个结点,它的值与pcur指向的结点相同,但是结点的地址不同,那么当前结点就是pcur所指向的结点的深拷贝。,链表结点的next和random指针的指向,结点的值都要与原链表相同,但。
2025-02-17 00:37:11
830
5
原创 LeetCode每日精进:142.环形链表II
找到相遇点后,让头结点和相遇点同时往后遍历,找到入环的起始结点,若相遇点为空,直接返回NULL。指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数。当n等于1时,即相遇时,快指针刚好绕环一圈,则L = R-X。定义快慢指针,找到相遇结点meet,找到后跳出循环。meet到入环的初始结点的距离等于head到入环的初始结点的距离。,返回链表开始入环的第一个节点。在快慢指针相遇时,fast所走的路程为。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。
2025-02-16 18:16:51
535
1
原创 LeetCode每日精进:141.环形链表I
结论:证明快指针走4,5,6...步时证明过程同上,所以无论快指针走多少步,快慢指针一定会在环中相遇。,即此时fast与slow之间的最大距离为C-1,fast在slow的后面,在追逐中,已经。指针再次到达,则链表中存在环。可以看到当快指针走两步,慢指针走一步时在环中相遇,那么。所以当快指针走两步,慢指针走一步时,快慢指针在环中一定相遇。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。最大距离为0时,快慢指针在环中相遇。,即C代表的是环形结点的个数,所以。
2025-02-14 17:37:01
1109
2
原创 LeetCode每日精进:160.相交链表
请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。从各自的表头开始算起,链表 A 为 [1,9,1,2,4],链表 B 为 [3,2,4]。,函数返回结果后,链表必须。
2025-02-14 15:37:25
486
1
原创 LeetCode每日精进:链表的回文结构
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。遍历链表,将链表中的结点值放在数组中,每放入依次size自增一。,请返回一个bool值,代表其是否为回文结构。在题目限制链表结点个数的情况下,这种方法符合题目要求,但。中每个结点对应原链表中结点值相同,即反转链表为原链表的。,显然不符合题目要求,需要进一步优化。,我们可以创建一个可以存放900个整型的。,将链表的结点值逐一存放在数组中,并用。,循环结束,则返回true。的判断方式解决,这样就能将。
2025-02-14 01:28:28
1246
1
原创 LeetCode每日精进:21.合并两个有序链表
比较两个链表中结点值的大小,值小的结点尾插入新链表中,由于尾插需要判断当前链表是否为空,指向新链表头结点的指针需要改变,为了不让代码显得。· 申请完空间后,将头结点的next指针置空,这样直接就能进行尾插,不需要再判断链表是否为空。,那么l2所指向的结点尾插入新链表,并将l2移向下一个结点。,那么l1所指向的结点尾插入新链表,并将l1移向下一个结点。当l1与l2中有一个指向空,即。,l1,l2在两个链表中遍历进行比较。,将l2中剩余结点尾插入链表中。,将l1中剩余结点尾插入链表中。
2025-02-13 19:27:13
384
原创 LeetCode每日精进:876.链表的中间结点
只要结点不为空,size就自增一,跳出循环时,size则为链表结点个数。该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。如果有两个中间结点,则返回第二个中间结点。循环条件为fast的next指针不能为空。定义slow和fast指针,并。再次遍历,获得中间结点位置。循环条件为fast不能为空。,请你找出并返回链表的中间结点。链表只有一个中间结点,值为 3。
2025-02-13 16:51:29
676
原创 LeetCode每日精进:206.反转链表
让pcur的next指针指向新链表的头结点,并让头结点前移到pcur。,当n2为空时跳出循环,此时n1为反转后的链表头部,返回n1即可。,让newTail和newHead都指向pcur。在调整指针指向的过程中,让。,请你反转链表,并返回反转后的链表。,若此时n3指向空,n3不移动。
2025-02-13 16:06:07
595
原创 LeetCode每日精进:203.移除链表元素
找到pcur的前驱结点prev,并将前驱结点prev和后置结点pcur->连接,释放pcur。,将尾结点的next指针指向pcur,并将尾结点移向后一个结点。,否则可能会输出原链表中该结点之后的结点值为val的结点。,让头结点指向当前结点的下一个结点,释放pcur。给你一个链表的头节点。,将头结点和尾结点都指向pcur。,请你删除链表中所有满足。
2025-02-12 23:57:10
572
原创 LeetCode每日精进:88.合并两个有序数组
注意,因为 m = 0 ,所以 nums1 中没有元素。nums1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 nums1 中。,l1越界,将nums2中剩余元素按从后往前的顺序导入l1中。,5,6] ,其中斜体加粗标注的为 nums1 中的元素。需要合并 [1,2,3] 和 [2,5,6]。,在循环中从后往前比大小,大的元素放在数组尾部。,l2越界,说明nums2中元素已经排序完成。需要合并的数组是 [] 和 [1]。需要合并 [1] 和 []。中,使合并后的数组同样按。
2025-02-12 16:59:39
434
原创 LeetCode每日精进:26.删除有序数组中的重复项,27.移除元素
定义两个指针dst和src分别指向数组的起始位置和下一个位置。你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。定义两个指针dst和src,并将两个指针指向数组头部。,将数组中不是val的值“扔给”dst保存。元素的顺序可能发生改变。不需要考虑数组中超出新长度后面的元素。不需要考虑数组中超出新长度后面的元素。,返回删除后数组的新长度。
2025-02-11 00:24:09
577
原创 LeetCode每日精进:189.轮转数组
先保存下标numsSize - 1的元素,将前numsSize - 1个元素往后移动一位,最后将保存的元素放在数组第一个位置。在这里,用malloc动态申请一个新数组arr,用来存放轮转后的数组,将原数组中的下标为i的元素放在arr中下标为。的位置,这里%numsSize的原因时i+k在遇到要向右轮转的元素时会超出numsSize,这里直接让其重新回到数组头部。,在思路二的基础上再次进行了优化,不再借助新数组,实现了一个较为完善的方案。,相较于思路一,运行时间缩短,但相较于思路一,由于这里存在双循环,
2025-02-09 23:28:18
1041
原创 链式二叉树:用指针和递归编织树形结构的艺术
exit(1);// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树//若遍历到#,返回NULL,跳过该字符(*pi)++;//不是#,创建当前结点(*pi)++;//创建左子树//创建右子树// 二叉树前序遍历 -- 根左右return;// 二叉树中序遍历 -- 左根右return;// 二叉树后序遍历 -- 左右根return;// 层序遍历 -- 广度优先遍历Queue q;while (!
2025-02-08 23:38:16
1225
原创 堆排序与Top-K:一场数据“金字塔”的建造与拆解
Top-K问题是指求数据结合中前K个最⼤的元素或者最⼩的元素,⼀般情况下数据量都⽐较⼤。⽐如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。2.解决思想对于Top-K问题,最先想到的是遍历排序,但当数据量非常大时,在执行时可能会由于内存的限制而无法解决,所以在这里我们最好借助堆去解决。首先,以大堆为例,取数据中前K个数据进行建堆。建完堆后,⽤剩余的N-K个元素依次与堆顶元素来⽐较,若元素比堆顶元素小就入堆,替换堆顶元素。
2025-02-05 16:47:41
630
原创 堆:数据结构中的“优先级王者”——从理论到代码的深度拆解
堆中的向上调整算法和向下调整算法尤为重要,下一期我们将借助堆来实现堆排序和解决Top-k问题。
2025-02-04 22:00:18
874
原创 队列:数据结构中的”排队艺术“
队列的结构比较特殊,需要单独定义队头和队尾,但可以借助前面链表的内容进行学习,下一期我们将进入二叉树的世界中,并实现顺序二叉树:堆。
2025-02-03 23:34:00
740
原创 链表:数据结构中的“灵动之链”
我们通过代码实现了单链表,以及增删减改的相关函数,从上述代码中可以看出单链表的遍历因其不涉及环,只能从前往后而不能从后往前,下一期我们将介绍双向链表以及它是如何实现向前遍历的特性,介时我们也将全面地对比顺序表和链表两种数据结构之间的特性与优劣。
2025-01-23 12:18:00
654
原创 顺序表:数据结构的基石
顺序表是一种存储数据的有效方式,但其中存在频繁的申请内存空间,多次进行扩容,可能会造成空间浪费,同时在指定位置插入与删除时间复杂度均为O(n),但后续的链表可以解决上述的空间问题,下一期我们将介绍链表,并讨论它是如何实现,解决空间的浪费问题的。
2025-01-11 23:08:35
830
原创 指针:C语言中的强大工具
在编程的世界里,指针是一种强大的工具,它允许程序直接访问和操作内存。在C语言中,指针的使用尤为广泛,它们是理解C语言和操作系统底层机制的关键。本文将带你深入了解指针的概念、用法以及它们在编程中的重要性。
2024-12-03 17:32:27
286
原创 C语言分支循环语句
循环开始前执行初始化表达式,然后检查条件表达式,如果为真,则执行循环体,之后执行更新表达式,然后再次检查条件。4. **do-while循环**:类似于while循环,但至少执行一次代码块,然后检查条件。1. **if语句**:这是最基本的分支语句,用于在满足特定条件时执行代码块。5. **for循环**:一种通用的循环结构,用于在指定次数内执行代码块。2. **switch语句**:用于基于不同的情况执行不同的代码块。3. **while循环**:在条件为真时重复执行代码块。// 条件为真时执行的代码。
2024-11-03 00:12:56
283
原创 第一篇博客
我对于编程的目标不仅仅是为了完成学校布置的期末任务,同时也旨在提高自我的编程能力,使我有能力去参加一些更高水平的竞赛,为未来的工作简历添上夺目的一笔,在同龄人中脱颖而出。对于编程的学习,我打算以实操为主干,毕竟编程是一项实践性的技能,是学习将理论知识拿到实践运用得重大转变。对于想进入的IT公司,由于我的专业还是比较偏向硬件的,这方面没有过多的考虑。对学习编程的规划:我打算每天花2h进行学习,每周至少14h。我是来自上海电力大学的学生 上海人 喜欢打篮球。
2024-10-17 12:46:26
236
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人