- 博客(40)
- 收藏
- 关注
原创 【C++】模板2.0
上述示 例中,&t2指向的t2显然小于&t1指向的t1对象,但是Less内部并没有比较&t2和&t1指向的对象内 容,而比较的是&t1和&t2本身的值,这就无法达到预期而错误。通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些 错误的结果,需要特殊处理,比如:实现了一个专门用来进行小于比较的函数模板。模板声明和定义分离到不同文件下,且不在模板定义的位置显示实例化的话,会出现链接错误的原因的话,感兴趣可以自己去查阅哈,我就不介绍了。此时,就需要对模板进行特化。
2025-04-21 19:02:06
941
原创 【C++】priority_queue及其模拟实现
那么优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用 priority_queue。当其为大堆的情况下,它的第一个元素总是它所包含的元素中最大的,在堆中可以随时插入元素,并且只能检索最大堆元素(优先级队列中位于顶部的元素);小堆的情况下,反之。说白了,优先级队列底层是数据结构里面的堆(默认是大堆),也就是说,优先级队列数据的存放必须满足堆的要求。
2025-04-21 00:21:57
943
原创 【C++】stack和queue及其模拟实现
1. 不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构。均发挥了deque的优点。是一个类模板,有两个模板参数,第二个模板参数有缺省值deque<T>,这是个啥东西我们不用理先,也就是说不必理会第二个模板参数先,先学会stack的使用即可。
2025-02-27 19:21:54
843
原创 【C++】list模拟实现
额额额,浅学了list,老规矩,模拟实现一下list,能让我们更好的理解list。若有兴趣,不妨垂阅!同样的,我不可能把list所有接口都模拟实现出来,我也没有这个能力。So,模拟实现一些简单常用的接口。本工程包括2个文件:mylist.h:用于模拟实现list。test.cpp:用于测试模拟实现的list接口是否达到预期。1.模拟实现list以下代码均放到mylist.h文件中。1.1.list节点由于底层是带头(哨兵位)双向循环链表。
2024-12-21 21:30:13
907
原创 【C++】list
迭代器按功能来划分可以分为:普通正向迭代器(iterator)、普通反向迭代器(reverse_iterator)、const正向迭代器(const_iterator)、const反向迭代器(const_reverse_iterator)。返回一个迭代器,该迭代器指向新插入元素。list底层是带头双向循环链表,所以其迭代器可以支持++、--等操作,但是不支持+、-等操作,例如其迭代器执行+n操作,无法得到下n个节点的迭代器,因为它们底层物理空间并不连续,固然可以用操作符重载+来实现,但是是不划算的。
2024-12-18 00:07:25
1276
原创 【C++】vector模拟实现
而匹配另一个构造函数的话,参数类型1个是size_type,1个是int,也可以匹配,但是相比于构造函数模板的实例化来说就没那么匹配了,当匹配了构造函数模板的实例化时,实例化而来的函数函数体内需要解引用操作,拿一个int类型的数据去解引用不报错才怪。由于vector是一个类模板,那么俺模拟实现也搞一个类模板。由于模拟实现的vector于命名空间std的vector类模板名相同,为了方便本博客的讲述,以下若是所述vector均默认指模拟实现的vector,若是指命名空间std的vector,则会标红,如。
2024-12-02 21:15:41
934
原创 【C++】vector
6.读者老爷好,俺最近浅浅学了一些vector的知识,vector是STL容器的一种。有兴趣的话不妨垂阅!首先使用vector需要包含头文件好吧。中的其中一个类模板就是本博客要介绍的。进入可以看到:确实是一个类模板,第一个模板参数就是要存储的数据的类型,第二个模板参数是跟空间配置器和内存池相关的,不用理先。那我们就浅浅介绍一下。其实当这个类模板实例化成具体的类时,这些个具体的类底层就是顺序表。也就是可以认为vector是“一个可以存放任意类型数据的顺序表”。
2024-11-28 18:59:44
1083
原创 【C++】string模拟实现
思路:调用swap时要先传参,由于C++规定⾃定义类型对象进⾏拷⻉⾏为必须调⽤拷⻉构造,那么理论上,operator=的形参str拷贝构造一个临时对象,这个临时对象再拷贝构造swap的参数str,哪怕编译器优化掉了临时对象,swap的形参str也是通过ooperator=形参str拷贝构造的一个新对象,将这个新对象str与*this的内容交换一下不就搞定了。因为substr接口是传值返回,理论上是将substr的返回值S1拷贝到一个临时对象当中,局部对象S1便销毁了,再用临时对象拷贝构造S2的。
2024-11-12 13:13:59
854
原创 【C++】string
1.成员函数接口浅浅介绍一下string,若读者老爷有兴趣不妨垂阅!俺上一篇博客最后浅浅介绍了一下STL,其中STL的六大组件之一就是容器。容器大致来说就是现成的数据结构,当俺们编程的时候想要使用栈、队列、二叉树……的模式来管理数据时,可以直接使用现成的STL里面的容器(栈、队列、二叉树……),就不用我们自己先手动实现栈、队列、二叉树……了。需要明确的是:string严格来说不属于STL的一部分,属于C++标准库,因为string的诞生时间要早于STL。
2024-10-31 20:02:22
1093
原创 【C++】模板1.0和STL简介
该语句不能通过编译,因为在编译期间,当编译器看到该实例化时,需要推演模板参数实际类型,通过实参a将T推演为int,通过实参b将T推演为double类型,但模板参数列表中只有 一个T,编译器无法确定此处到底该将T确定为int或者double类型而报错。有了STL之后,若是我们希望使用某个数据结构或者算法什么的,我们就不需要自己手撕一个出来了,直接使用STL里面的模板生成对应的东西就可以使用了,那不爽歪歪!用不同类型的参数使用函数模板时,也就是用函数模板生成对应模板参数(类型)的函数,称为函数模板的实例化。
2024-08-04 20:46:34
932
原创 【C++】内存管理
使用new操作符进行动态内存管理也是有失败的风险的,当失败了就会抛异常,但是吧,俺们平时写的小程序申请那三瓜两枣的空间一般是不会失败的,一般不必担心,所以俺就不检查了。的意思是有一个存放在代码段的常量字符串"abcd\0"(其实代码段存放的是"abcd\0"的ASCII码),pChar是栈上的一个指针变量,这个指针变量指向常量字符串"abcd\0"的首元素。的意思是使用malloc函数在堆区申请了16个字节的空间,ptr1是栈上的一个指针变量,这个指针变量指向这块堆区开辟的空间的首元素。
2024-07-30 01:08:30
791
原创 【C++】日期类
鼠鼠实现了一个日期类,用来练习印证前几篇博客介绍的内容!!本鼠创建一个工程,工程包含三个文件,分别是Date.h、Date.cpp和test.cpp。1.日期类的定义本鼠对日期本鼠对于成员函数大部分都采取声明和定义分离的方式。成员变量无非就是年、月、日呗。还运用了友元的知识。如上代码所示。2.得到某年某月的天数对于这个日期类所要实现的成员函数中有很多场景我们需要得到某年某月的天数,所以我们将这个功能实现成函数。又因为需要频繁调用这个函数,我们将他实现成内联函数。3.检查日期是否合法。
2024-07-05 22:25:06
1329
2
原创 【C++】类和对象3.0
但是如果自定义类型成员没有默认构造函数的情况下,如果我们不在初始化列表显式写该成员,编译器是不知道该如何调用俺们显式实现的构造函数的,所以编译器会认为没有合适的默认构造函数可用,就报错了,所以这种情况我们必须在初始化列表显式写,也就是显式调用其构造函数。难道是对象的具体成员变量定义的位置是在构造函数的函数体当中吗,当然不是,原因跟上面一样,函数体内关于某成员变量的语句可以多次出现,如果说关于某成员变量的语句第一次出现是其定义,那么当关于其成员变量的语句多次出现时,难道其成员变量可以多次定义吗?
2024-07-05 22:23:58
1054
原创 【C++】类和对象2.0
看主函数第一条语句创建Date类类型的对象d1,由于Date类中没有显式定义构造函数,就通过编译器生成的默认构造函数创建对象d1,由于内置类型成员变量在类的声明中给了缺省值,这个编译器生成的默认构造函数就将d1的内置类型成员变量初始化成了缺省值,对于d1的自定义类型成员变量_t,去调用它的默认构造函数Time()(本鼠显式定义了),所以d1的自定义类型成员变量_t的成员变量分别被初始化成了14、57、30。很简单,对象a是被const修饰的常对象 ,调用Print函数隐藏的this指针接收a的地址。
2024-06-23 02:01:05
911
原创 【C++】类和对象1.0
我们看PrintA函数内部需要用到this指针解引用的哦,this指针接收到的值是空指针,而且成员变量_a是存储在this指向的空间里面的(成员变量存储在类实例化对象里面),当然会崩溃了。这两个对象个中成员变量是不同的(需要存储不同的属性,所以说是不同的),但是调用同一份函数(类方法是一样的)。this指针是隐藏起来的,拿上面代码来说:当d1调用Init函数时,传递的实参不仅仅有明面上的2024、6和4,还有该对象的地址,即d1的地址,而且第一个传递d1的地址。这些都是编译器完成的,我们不应该显示写出来。
2024-06-04 02:06:19
637
原创 【C++】C++入门1.0
首先我们要知道C++中的域分为:1.全局域;2.局部域;3.命名空间域;4.类域。这个知识对于命名空间的介绍有帮助所以提前介绍。那么开始介绍命名空间如下:定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员。注意:以下代码如果写在.c文件中会报错!1.正常的命名空间定义。// HD是命名空间的名字,一般开发中是用项目名字做命名空间名// 命名空间的成员可以定义变量/函数/类型struct LCDint age;
2024-05-29 00:19:08
991
原创 【数据结构1.0】计数排序
读者老爷好,本鼠鼠最近学了计数排序,浅浅介绍一下!计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用,是非比较排序的一种!这个排序算法不难理解,万物皆可举例,我们举例讲解啊!很久很久以前,有一只可爱的肥龙猫,叫做冬冬。有一天冬冬的男朋友给冬冬出了一个题目:有一组数组a如下,要冬冬用排序算法排成升序。
2024-05-20 00:48:02
904
原创 【数据结构1.0】归并排序
本博客以排升序为例介绍归并排序!我们先看一个问题:有两组均为升序的数组要合并到一组数组当中,要求合并后的数组也是升序的,怎么办?办法:从头开始遍历两组数组,找“小”尾插到合并数组当中。举例如图:这其实是归并的思想!归并排序的基本思想:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有 序,再使子序列段间有序。
2024-05-18 21:40:58
416
原创 【数据结构1.0】选择排序
鼠鼠前面的博客介绍过选择排序是常见的排序算法,选择排序有但不限于直接选择排序和堆排序!那么鼠鼠今天浅谈一下选择排序!鼠鼠本博客用排升序来介绍选择排序!选择排序的基本思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
2024-05-13 23:24:38
376
原创 【数据结构1.0】希尔排序
鼠鼠最近学习了希尔排序,做个笔记!希尔排序也是插入排序的一种捏!本篇博客也是用排升序来举例捏!希尔排序是基于直接插入排序的,是由大佬D.L.Shell提出的。
2024-05-06 21:56:45
1083
3
原创 【数据结构1.0】直接插入排序
最近浅学了直接插入排序,写个博客做笔记!笔记功能除外若能对读者老爷有所帮助最好不过了!直接插入排序是插入排序的一种,那么介绍直接插入排序之前先介绍一下常见的排序算法!
2024-05-05 20:32:33
1386
原创 【数据结构1.0】二叉树
我们在前两篇博客中主要介绍了堆及其应用,针对的对象堆是完全二叉树,存储方式采用顺序结构存储的方式。那么好的,这篇博客我们浅谈二叉树的链式存储,针对的对象是二叉树,并不局限于完全二叉树了!我们先来回顾以下二叉树的定义:一棵二叉树是结点的一个有限集合,该集合:1. 或者为空(就是说空树也是二叉树)。2. 不是空树:由一个根节点加上两棵别称为左子树和右子树的二叉树组成。说简单点呢,二叉树是一颗特殊的树,这颗树的度最大为2,就像是对这颗树的节点进行了计划生育,最多只能生两个节点宝宝。
2024-04-09 00:20:13
1128
1
原创 【数据结构1.0】堆的应用
各位读者老爷好,鼠鼠又来了捏!鼠鼠上一篇博客介绍的堆,那么今天来浅谈以下堆的应用,那么好,我们先来看两个问题:1.如果有一组乱序的数组数据,希望你将这组数组的数据排成升序或降序,该怎么排?2.如果有1万个乱序的数据,希望你找出其中最大的前5个,该这么找到捏?对于问题1,当然可以使用冒泡排序,但是冒泡排序的时间复杂度是O(N^2),显然不是一个很好的方法!鼠鼠我呀在这里介绍一个解决办法:堆排序!堆排序的时间复杂度是O(N*logN),相对于解决办法之冒泡排序好用的不是一星半点捏!
2024-04-01 00:39:48
762
1
原创 【数据结构1.0】二叉树
int size;}Heap;这里重命名int为HeapDataType,大大方便后续代码的维护!用a指向后来动态开辟的连续内存,该连续内存用来存储堆的数据,size用来记录堆的数据个数或者指向堆最后一个数据的下一个,capacity用来记录连续内存可放入数据的容量。这里用一个结构体来定义堆如代码所示,定义的跟顺序表一样,但是我们这里表示的堆对数据的摆放要求是大堆或者小堆,而顺序表就没有这个要求!
2024-03-23 01:23:25
788
5
原创 【数据结构1.0】队列
QNode;int k;}Queue;老样子我们将int重命名成QDatatype,方便以后代码的维护。让后定义并重命名结构体QNode充当队列节点 ,这些节点根据数据元素的入队列或者出队列按需申请或者释放。QNode中成员_data用来存放数据元素,QNode中成员_next用来链接下一个节点。
2024-03-07 22:10:08
1574
4
原创 【数据结构1.0】栈
int top;}Stack;方便后续代码的维护,我们先不妨将int重命名成STDataType。由于实现动态生长的栈我们需要一个STDataType*类型指针a维护以后动态申请的空间(用来存放需存储的数据元素的)。用top指向栈顶元素的下一个元素(可以理解成元素个数)。用capacity记录以后动态图申请空间的大小。将a、top和capacity用结构体包起来并重命名成Stack。
2024-03-06 21:38:04
1013
1
原创 【数据结构1.0】双向链表
ListNode;由上分析可知,该链表节点需要包含三个数据域,所以我们定义结构体,结构体成员data用来存储需存储数据、结构体成员next用来存储后一个节点地址、结构体成员prev用来存储前一个节点地址。至于为什么要把int重命名成LTDataType,那是因为如果需存储数据的类型如果有所变化的话,我们只需更改此处的int更改成需存储数据的类型即可,极大方便后续的代码维护。
2023-12-02 04:00:13
1030
2
原创 【数据结构1.0】单链表
各位读者老爷好,鼠鼠我又来了哈。鼠鼠我呀现在来基于C语言实现以下单链表,希望对你有所帮助!鼠鼠我上次浅谈了顺序表。但是吧,Any coin has two sides。顺序表有一些缺陷:1.尾部插入效率还不错。头部或者中间插入删除,需要挪动数据,效率低下。2.顺序表满了以后只能扩容。扩容是有一定消耗的,扩容一般是存在一定的空间浪费:一次扩得越多,可能浪费越多;一次扩得少,可能需要频繁扩容。当然,顺序表也有它的优势:得益于它的物理空间连续,顺序表支持随机的下标访问。
2023-11-28 02:37:30
1290
2
原创 【数据结构1.0】顺序表
int size;//有效数据//空间容量}SeqList;根据上面定义的顺序表,咱们创建一个顺序表s1,并实现该顺序表一系列接口实现。SeqList s1;//顺序表。
2023-11-12 22:19:56
1248
5
原创 【数据结构1.0】算法的时间复杂度和空间复杂度
数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。其实简单来说吧。数据结构就是在内存中管理数据。拓展:1.什么是数据库?简单来说:数据库就是在磁盘中管理数据。2.内存和磁盘的异同同:内存和磁盘都是电脑的两个核心存储介质,都是存储数据的两个硬件。异:内存的速度快,需要带电存储;磁盘的速度(相对)慢,不带电存储。
2023-11-11 03:40:59
1210
1
原创 【C语言】内存函数及其模拟实现
各位读者老爷好,继上篇字符串函数模拟实现之后,我现在来介绍一些内存函数,希望能对你有所帮助!另外,博主本身就是编程小白,如有不足,恳请斧正!无论是字符函数、字符串函数还是内存函数,都是C语言的库函数,只是我们根据它的使用对象自己给它们取得名字。博主前面介绍的字符函数和字符串函数的使用对象只能是字符或字符串!而接下来介绍的一些内存函数使用对象就不仅仅局限于字符或字符串,所以内存函数的存在是很有必要的!
2023-10-17 01:35:38
800
9
原创 【C语言】字符函数和字符串函数
各位读者好,小编现在来浅浅介绍一些C语言库函数中处理字符或字符串的函数。注意:1.C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。2.字符串常量适用于那些对它不做修改的字符串函数。3.以下代码的运行环境均处于32位(x86)系统且为小端机器下运行。以下函数都可以在。
2023-10-13 15:53:36
688
3
原创 【C语言】指针和数组笔试题解析
各位读者好,我们现在来看几组指针和数组笔试题,小编才疏学浅,如有错误,恳请斧正!既然是指针和数组相关的笔试题,我们可以先明确数组名的3种意义:1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。3. 除此之外所有的数组名都表示数组首元素的地址。指针变量的大小与指针变量类型无关,不管什么类型的指针变量,大小都是4/8个字节。
2023-09-24 16:54:41
230
7
原创 【C语言】qsort函数模拟实现
各位读者好,上篇文章我们介绍了qsort函数,知道了qsort函数的功能。现在我们用冒泡排序的算法模拟实现qsort函数,小编拙作,恳请斧正,我们开始讲解。
2023-09-17 15:40:26
475
9
原创 【C语言】杨氏矩阵
所以,我们有一个时间复杂度满足要求的方法:我们不难发现杨氏矩阵的左下角和右上角的元素是有特点的。我们以左下角查找为例:如果左下角元素大于需查找元素(比最小的元素还小),我们就可以去掉左下角所在行;如果左下角元素小于需查找元素(比最大的元素还大),我们就可以去掉左下角所在列。有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。我们可以知道一个二维数组满足每行从左到右是递增的,每列从上到下是递增的就可以说它是杨氏矩阵。要求:时间复杂度小于O(N);
2023-09-10 22:20:02
187
2
【单片机课设】十字路口交通灯的设计
2024-06-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人