
C++
文章平均质量分 82
明 日 香
快和我一起快乐学习
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++:红黑树
红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或 Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路 径会比其他路径长出俩倍,因而是接近平衡的。原创 2024-05-17 13:23:20 · 1013 阅读 · 0 评论 -
C++:set和map的介绍
1. set是按照一定次序存储元素的容器2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行 排序。4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对 子集进行直接迭代。5.原创 2024-05-05 14:54:35 · 1167 阅读 · 1 评论 -
C++:多态
重写确实发生在继承体系中,子类重写父类的虚函数。重定义通常指的是在派生类中定义一个与基类同名的成员,这可以发生在继承体系中,但它与重写不同,因为重写特指虚函数的覆盖。重载是发生在同一个类中的,它指的是在同一个作用域内使用相同的函数名但参数列表不同的函数。重载与继承体系无关,重载只能在一个范围内,不能在不同的类里。原创 2024-04-21 17:36:44 · 2330 阅读 · 0 评论 -
C++:继承
于是,为了方便对这些拥有相同属性的类做管理,以及减少代码带来的冗余,就将这些相同的属性全部提取出来,放在了一个类 person 中,将person作为父类,而减去了相同属性的各个类,则变成了子类,内部只存放着自己独特的属性,而那些原先相同的属性则以继承父类的方式进行获取。如图所示,父类和子类的成员可以重名,因为它们都是独立作用域,所以它们的成员可以同名,但是子类的成员和父类的成员同名后,编译器会遵循就近原则,在调用这个同名的成员时,会优先调用子类的这个成员。调用Print可以看到成员函数的复用。原创 2024-04-12 19:52:32 · 1032 阅读 · 3 评论 -
Stack_经典例题_最小栈
在满足栈的特点的同时,还需要设计一个接口,就是获取栈内的最小元素!原创 2024-04-11 20:23:44 · 297 阅读 · 0 评论 -
模板的进阶
前提须知: 模板的本质其实就是传参,换言之,模板可以类比函数传参,二者的特性类似,但各有各的特点,可以通过函数传参来学习模板。以上面类模板代码为例,我们可以知道, template 中的 size_t N = 10 就算我们所讲的非类型模板参数。和其他模板参数不同的是,非类型模板参数 = 类型 + 常量 ,他的诞生也是为了让编译器在编译的过程中尽可能的省力,也让使用者可以更为方便和便捷的使用一个模板但却创造出更多的类。同时减少了代码的冗余,通过为不同原创 2024-04-11 19:38:38 · 639 阅读 · 0 评论 -
list的常用接口底层实现与介绍
自定义类型的完善 ,因为我们写的是一个自定义类型,所以读取*it后解决完后还是一个自定义类型的数据结构,所以需要在使用数据结构的写法,表明其中内部的数据即可!it->是需要进行拆解的,可以变成it.operator()->,这里其实是编译器的一种隐藏操作,之前的it++也是一种隐藏操作,可以变化为it.operator++()而it->_a1这里隐藏的是另一个-> ,也就是图中第二个->,第一个->是属于it的重载运算符标识!原创 2024-04-04 15:49:14 · 1381 阅读 · 3 评论 -
vector的简单介绍及常用接口的模拟实现
本篇博客是从底层角度来模拟实现STL的vector,在C++的学习过程中vector是一个非常重要的知识点,vector有多个接口,且每个接口的功能和接收参数都不一样,所以本篇将会重点介绍和讲解几个重要接口的常用方式,并将其进行模拟实现。vector 容器名储存int型的值 vector v;储存double型的值 vector v;储存string型的值 vector v;储存结构体或者类的值的值 vector v;原创 2024-03-30 15:06:27 · 680 阅读 · 0 评论 -
滑动窗口_水果成篮_C++
问题转化就是求最长的连续的子数组!而且这个数组只能有两种数字!原创 2024-03-28 15:32:27 · 614 阅读 · 0 评论 -
双指针算法_三数之和
给定一个整数数组 nums ,判断是否存在三元组nums[i]、nums[j]、nums[k],满足 i!=j 且 i!=k 且 j!=k也就是同一个位置只能选择一次!,且还要满足三个数相加等于0,同一个位置只能选择一次!答案中不可以包含重复的三元组、如下图所示,虽然有三组,但是其中两组虽然顺序不一样但是内部的数值是一样的也不行!原创 2024-03-28 15:08:12 · 376 阅读 · 0 评论 -
双指针算法_和为 s 的两个数_C++
输入一个的数组,和一个数字s,在数组中查找两个数,使得它们的和正好是数字s,如果有多对数字的和等于s,只需要任意输入一对即可。原创 2024-03-28 14:46:10 · 421 阅读 · 0 评论 -
双指针算法_盛水最多的容器
如图所示,一个数组内部存储的是高度,求数组中,能够组成最大容量的两个元素,需要注意的是容量是 高度*宽度,这里的宽度指的是两个数字之间的距离,且需要注意高度中,容量要变成最大容量和高度有关,两个数字中最小的那个 * 两个 数字之间的距离 =最大容量。先用指针指向左右两端,然后算出容量v1,随后使用左端的1进行查看是否和其他位置的数字计算出的容量比v1大,答案当然是没用,这是因为在高度不变(高度是1)的情况下变动了宽度(两个数字之间的距离),所以容量没用v1大。原创 2024-03-26 11:58:35 · 394 阅读 · 0 评论 -
双指针算法_快乐数
通过示例的图解可以看出,如果计算的过程中出现了1,那么就将会在1时进行持续的循环,使得变成一个1的循环,而如果在计算的过程中,没用出现1,则会在计算的过程中,得出某个结果和之前计算的结果一致,成为一个环状。所以最后可以得出,如果有出现1则会进入1的循环,如果没用出现1则一直循环都有1。 这题和判断链表是否有环很像!不过这里只要判断环里面的数字是否是1,所以可以采取判断链表是否有环的方法,使用快慢双指针。定义快慢指针的方法和判断链表循环的双指针方法一样,快指针每次移动两次,慢指针每次移动一次,当二者相遇时,判原创 2024-03-26 11:35:24 · 387 阅读 · 0 评论 -
string 底层模拟实现常用接口
本篇博客是从底层角度来模拟实现STL的string,在C++的学习过程中string是一个非常重要的知识点,在之前的介绍讲解中,我们了解到string有多个接口,且每个接口的功能和接收参数都不一样,所以本篇将会重点介绍和讲解几个重要接口的常用方式。C++:string相关内容的简单介绍-CSDN博客什么是string?为什么要学习使用string?string的优势?原创 2024-03-09 11:42:36 · 891 阅读 · 2 评论 -
String 类 经典例题题集
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)输入描述:输入一行,代表要计算的字符串,非空,长度小于5000。输出描述:输出一个整数,表示输入字符串最后一个单词的长度。原创 2024-03-05 18:15:09 · 640 阅读 · 1 评论 -
C++:string 相关接口的简单介绍
string是表示字符串的字符串类该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。string在底层实际是:basic_string模板类的别名,typedef basic_string string,所以string 在底层的本质上也是一个模板不能操作多字节或者变长字符的序列。在使用string类时,必须包含#include头文件以及using namespace std;原创 2024-02-28 15:35:46 · 960 阅读 · 3 评论 -
C++ :内存管理 new&delete
在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与 free不会。//类Aclass Apublic://类A的构造函数的初始化列表: _a(a)//类A的析构函数~A()private:int _a;int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数//使用了malloc进行空间的开辟,但是没有初始化操作。原创 2024-02-13 15:08:07 · 1297 阅读 · 18 评论 -
C++:友元函数与友元类
缺点:友元函数不是类的成员但是却具有成员的权限,可以访问类中受保护的成员,这破坏了类的封装特性和权限管控;优点:可以实现类之间的数据共享;比如上面互为友元类,则可以互相访问对方受保护的成员;总结:友元函数是一种破坏封装特性的机制,可以让程序员写代码更灵活,但是不能滥用;原创 2024-02-12 14:21:10 · 507 阅读 · 1 评论 -
C++: const 的 权限放大缩小!
关于权限的放大和缩小问题,在文件领域讲诉可以理解为,当某个文件具有读取权限时,我们赋予这个文件读写权限,这个过程叫做权限的放大,而反之,当某个文件同时,但是我们了它,这就叫做而将权限放大缩小放在C++的指针和引用中,便是变量的数值是否能够修改的问题,如果将变量的数值从可以修改变到不能修改,则是权限的缩小,而将变量的数值从,则是但是在指针和引用中,权限放大是不可取的!原创 2024-02-11 16:21:41 · 976 阅读 · 4 评论 -
C++: 模板初阶
在下列函数中,它们都是swap函数,但是却因为参数的不同和而导致了需要使用函数重载进行实现,虽然解决了问题,但是函数重载也有不好的地方:1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函 数2. 代码的可维护性比较低,一个出错可能所有的重载均出错那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?原创 2024-02-07 15:11:19 · 549 阅读 · 9 评论 -
C++:类的简单介绍(六)——初始化列表
1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)引用成员变量const成员变量自定义类型成员(且该类没有默认构造函数时)除了以上三类,其他的成员变量在初始化列表或者在函数体({}内部的)的使用影响都不是很大!但是还是建议使用初始化列表。原创 2024-02-05 14:42:25 · 1388 阅读 · 5 评论 -
C++ : 类的简单介绍(五)————— 拷贝构造函数 & 函数传参 & 运算符重载
又如上图所示,如果进行传值,那么在传值交给拷贝函数的同时,在逻辑上也相当于是传值调用了拷贝构造函数,而C++的传值原理就是要把传递的数值先给到构造函数。于是乎就有了一种现象,一个数值在传递给拷贝构造之前,要先进入另一个拷贝构造函数内部进行拷贝,然后传回返回值,但是在进入另一个拷贝构造函数前,上面的现象又会出现,而这种现象就是无穷递归。原创 2024-02-01 16:21:53 · 1330 阅读 · 33 评论 -
C++ : 类的简单介绍(四)——析构函数
析构函数的功能类似于 栈、链表、队列的distroy的功能,用来进行内部空间的清理和释放,而于这些数据结构的distory 功能不同,在有了析构函数栈之后,这些数据结构,就不需要再写distorty 因为析构函数会在这是变量结束后自动进入清理模式。5.编译器默认生成的析构函数和构造函数一样,不会处理内置类型,对于自定义类型会去它们的内部调用它们的析构函数。与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由 编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。原创 2024-01-31 16:20:03 · 322 阅读 · 5 评论 -
C++: 类的简单介绍(三)———构造函数的初步认识
就如上面代码所示,图中没有构造函数的出现,编译器自己生成了一个构造函数,而后主函数内定义了一个构造函数 对象 d1 ,d1调用了成员函数 print ,而print 内部的内置类型函数,被编译器生成的默认构造函数赋予了一堆乱七八糟的随机值。在不写构造函数的时候,定义了一个构造函数的对象,同时编译器会自动生成一个默认的构造函数,同时调用了使用对象调用 成员函数 而得到的反馈缺是一堆随机值,就如下图的代码所示。默认的构造函数总共有三种:全缺省构造函数,无参数构造函数,因为没有构造函数编译器自己生成的构造函数。原创 2024-01-31 16:03:04 · 543 阅读 · 0 评论 -
C++ :类的简单介绍(二) ——this指针
对于上述类,有这样的一个问题: Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函 数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?根据之前的博文,我们得知了类中的成员函数是处在一个公共的区域,类中的成员变量仅仅只是声明,只有在主函数内部定义了 以类为类型的变量,才算是开辟了成员变量的空间。同时,在成员函数内部的成员变量,也同类中的成员变量一样,仅仅只是一个声明。原创 2024-01-31 15:12:38 · 549 阅读 · 1 评论 -
C++:类 的简单介绍(一)
/类:类体:由成员函数和成员变量组成// 一定要注意后面的分号//其实和结构体的定义差不多//结构体:struct tagclass为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分 号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者 成员函数。1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内 联函数处理。原创 2024-01-28 17:38:25 · 2011 阅读 · 27 评论 -
C++:auto 关键字 & 范围for
于是就有了auto关键字,C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一 个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。2、当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译 器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。5、虽然在最新版本的C++中,auto可以作为返回值的返沪类型使用,但是还是不太建议使用auto作为返回类型的。1. for循环迭代的范围必须是确定的。原创 2024-01-28 16:30:13 · 1216 阅读 · 17 评论 -
C++: 内联函数
因为宏的本质上是替换,所以对于需要替换的内容十分的严谨,倘若一步错,则步步错,所以对于宏而言,内联函数其实是更加完善的,可以说内联函数其实是完善了宏的问题,解决了宏的缺点。实际上,内联函数使用的场景并不是很多,很多时候内联函数只是也只能使用在较为小型的函数当中,如果是较为大型或者调用函数的次数非常多时,内联函数就会导致函数膨胀问题的发生!以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调 用建立栈帧的开销,内联函数提升程序运行的效率。原创 2024-01-28 15:46:11 · 1102 阅读 · 20 评论 -
C++:引用
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间。如上代码所示,引用符是&,但是要和C语言中的&区分,如上代码就第一个&是c++的,而第二个是C语言的 ,且我们开辟了一个空间,它叫做a ,同时他又叫做b,二者的空间地址都是一样的。取别名的同时还可以给别名取别名!这就相当于把李逵叫铁牛的同时,又把李逵叫做黑旋风。原创 2024-01-27 15:35:56 · 845 阅读 · 10 评论 -
C++:缺省参数&函数重载
而后通过Linux的翻译工作原理我们可以知道,编译器在执行代码之前会执行四个步骤,分别是:预处理、编译、汇编、链接。其中,在预处理阶段,函数定义中包含的头文件,会将头文件的内容完全展开并复制在定义代码的上方。其次,在链接阶段,函数定义中的代码会变成一串机器代码以便编译器进行执行,而这一串机器代码在形成的过程中会将这一大串代码的首个元素的地址,发送到一共特点的函数中,最后这个函数同样会形成一个地址,发送到函数声明中,由函数声明调用。原创 2024-01-25 15:48:29 · 1174 阅读 · 14 评论 -
C++ :命名空间域
结果显而易见,因为rand在stdlib.h中是一个函数,所以在使用stdlib.h将程序进行扩展后,你命名的变量极有可能会因为和函数名重复,而造成冲突,但我们又不明白那些是函数,那些又不是函数,所以,这个问题一直是C语言的不足之处!这其实和编译器的工作原理有关,编译器在查看到变量的存在的同时,会在局部区域内搜寻变量的存在,若该变量不存在于局部区域,编译器则会从全局的范围内搜寻变量是否存在,如果还是不存在,则编译器发生报错。但是,命名空间的写法不是很方便,而且每次使用的时候都需要加上::和空间的名字。原创 2024-01-21 15:07:37 · 4114 阅读 · 27 评论 -
空间复杂度
在斐波那契额数列的递归中,它是如上图所示,先完成一条分支,然后再接着完成下一条分支,直到全部完成,而在这里的过程中,它所开辟的空间是会被重复利用的,并不会直接创建一个新的空间, 这也符合了函数栈帧的性质。根据malloc函数开辟空间以此来建立二维数组,在代码中,我们先开辟了行的空间,一个开辟了N个,而再每一个行的空间内部,又开辟了N个列的空间,于是总共开辟的空间便是N^2。和时间复杂度一样,再递归中空间复杂度是累加的,在这里我们调用递归了N次,而也开辟了N个不同的空间,所以这里的空间复杂度是O(N)原创 2023-10-27 19:14:38 · 235 阅读 · 11 评论 -
时间复杂度
但是按照大O渐进表示法的规则,取数学表达式中的最大一项,且若最大一项是常数,则用1表达,若最大一项有系数,则删除系数。因此衡量一个算法的好坏,一般 是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。大O符号(Big O notation):是用于描述函数渐进行为的数学符号。在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。分析,由于此处的基本操作是三个循环:且因为时间复杂度的本质是。算法中的基本操作的执行次数,为算法 的时间复杂度。算法中的基本操作的执行次数。原创 2023-10-21 16:33:16 · 269 阅读 · 5 评论 -
结构体的简单介绍(3)——结构体的内存对齐
以上代码是寻求一个结构体在内存中所占的字节大小。按照平常的逻辑理论,这里的结构体大小理论上说,应该是六个字节,因为成员c1占一个字节,成员i占四个字节,成员c2占一个字节,所以加在一起一共是6个字节。但答案真是如此吗?结果算出的是12个字节。而后,我又将结构体的成员顺序进行调换,结果还会是12个字节吗?通过运算,我们得知,最后得到的是八个字节。是不是很奇怪,明明成员内容都是一样的,只不过调换了顺序,最后结构体的字节大小却发生了改变,这是为什么?其实这是和结构体的内存对齐有关!原创 2023-09-06 17:18:19 · 229 阅读 · 2 评论 -
strcat函数
被称为字符串的追加/链接函数,它的功能就是在一个字符串后面追加上另外一个字符串。原创 2023-08-27 16:56:34 · 206 阅读 · 1 评论 -
结构体的简单介绍(2)
在声明结构的时候,可以不完全的声明。以上结构在声明的时候省略掉了结构体标签(tag)。那么会有什么影响呢?由于摘掉了标签,我们再main函数内进行变量赋值的时候,无从下手也无法成功赋值,所以得到结论,这种摘取标签的声明方式,只能使用一次,而这一次也只能是在声明的时候进行创建变量使用。当不看标签 ,我们可以发现两个结构体的成员一样,所以当我们进行以下操作时,是否成立呢?p = &x;原创 2023-09-05 15:41:44 · 175 阅读 · 0 评论 -
枚举的简单介绍
枚举顾名思义就是⼀⼀列举。 把可能的取值⼀⼀列举。⽐如我们现实⽣活中:⼀周的星期⼀到星期⽇是有限的7天,可以⼀⼀列举性别有:男、⼥、保密,也可以⼀⼀列举⽉份有12个⽉,也可以⼀⼀列举三原⾊,也是可以一一列举这些数据的表⽰就可以使⽤枚举了。原创 2023-09-02 09:53:59 · 290 阅读 · 1 评论