- 博客(50)
- 收藏
- 关注
原创 linux系统下如何提交git和调试
我们默认的ubuntu20.04镜像是没有Git提交的工具,我们需要配置安装包。将我们这个新建的TEXT1提交到我们gittee的远端仓库中。配置用户信息--用于后面提交代码确认提交信息。随便进入linux系统下的一个目录中。创建一个文件在当前仓库目录下。将暂存区文件存储到本地仓库。获取gittee仓库地址。将本地仓库与远端仓库同步。安装和更新git的命令。查看暂存区有哪些文件。
2025-04-10 20:56:46
236
原创 C++List模拟实现|细节|难点|易错点|全面解析|类型转换|
> typedef Ref Ref和typedef Ptr Ptr,简单来说,我们需要让编译器知道Listiterator里面有Ptr和 Ref,后面的反向迭代器ReserveListIterator来使用Listiterator的Ref和Ptr。>> Ref:Ref在后面我们会通过T&来填充这块模板,也就是说Ref就是引用。>> Ptr:Ptr在后面我们会通过T*来填充这块模板,也就是说Ptr就是指针。易错点难点就是以上那么多了,说多了只会妨碍小伙伴们,通过自己学习效率才是最高的。
2025-03-24 21:38:48
345
原创 C++模板进阶
在 C++ 编程中,分离编译(Separate Compilation)是一种常见的编译方式,它允许将程序的代码分散到多个源文件(.cpp文件)和头文件(.h或.hpp文件)中进行独立编译,最后再将各个编译单元生成的目标文件链接起来形成可执行程序。这样做的好处是便于代码的组织、维护以及团队协作开发等,不同的开发者可以并行地对不同的源文件进行开发和编译工作。例如,一个大型项目可以有多个.cpp文件分别实现不同的功能模块,对应的.h。
2024-11-19 19:25:33
713
原创 C++将整形数据转换为字符串
相对更灵活,适合在需要对多种类型数据进行复杂的格式化转换等场景;以上几种方法各有特点,可以根据实际的编程场景和需求来选择使用。则在一些需要兼容 C 风格代码或者特定格式化需求的情况下可以使用。最为简洁方便,在支持 C++11 及以上版本的代码中优先考虑;函数,将这个整数转换为字符串并存储在。在上述代码中,定义了一个整数变量。(表示格式化整数)的格式将整数。中提取出转换后的字符串存储到。变量中,最后输出该字符串。数组中,最后输出该字符串。变量,并输出这个字符串。这里定义了一个字符数组。
2024-11-19 18:58:10
1355
原创 C++虚函数表
每个包含虚函数的类的对象实例中,会隐含一个指针(通常称为虚指针,vptr),它指向所属类的虚函数表。在多继承场景下,情况会复杂一些,因为一个派生类有多个基类,每个基类如果有虚函数表,那派生类对象中就会有多个虚指针(每个基类对应一个虚指针,指向各自基类的虚函数表),同时还可能存在一个额外的属于派生类自己的虚函数表(如果派生类新增了虚函数的话)。虚函数表的核心作用就是支持多态性,也就是让通过基类指针或引用调用虚函数时,能够根据对象的实际类型(是基类对象还是派生类对象)来决定调用哪个类中重写后的虚函数版本。
2024-11-18 12:04:21
1239
1
原创 C++时间复杂度与空间复杂度
例如,对于一个排序算法,如果它的时间复杂度表示为 O(n^2),这意味着随着输入数据量(通常用n表示元素个数等输入规模相关的量)的增加,其运行时间大致按输入规模的平方量级增长。总之,在实际的 C++ 编程以及算法设计中,时间复杂度和空间复杂度是衡量算法优劣的重要指标,需要根据具体的应用场景(如对时间要求高还是对空间要求高)来选择合适的算法和数据结构,平衡两者之间的关系。这里强调的是额外存储空间,也就是除了输入数据本身所占空间之外,算法执行过程中临时开辟的空间。,所以空间复杂度是 O(n)。
2024-11-18 11:56:20
1212
原创 C++set的常用接口
中元素具有唯一性,所以元素要么存在(出现 1 次),要么不存在(出现 0 次),该函数返回值通常是 0 或 1,用于判断元素是否在。中第一个大于等于给定值的元素。常用于查找满足一定条件的元素区间起点等场景。容器丰富的操作功能,能满足各种涉及有序且唯一元素集合处理的编程需求。中,返回一个迭代器指向被查找的元素;若元素不存在,则返回指向。中的所有元素,将其变为一个空的。中第一个大于给定值的元素。所表示的位置)的迭代器。是否为空,为空则返回。返回一个迭代器,指向。返回一个迭代器,指向。
2024-11-17 16:31:45
404
原创 C++set(详解)
如果要将自定义类型的对象放入set中,需要为该类型定义比较规则(通常是重载运算符),因为set要根据这个比较规则来确定元素的顺序以及判断元素是否重复。// 重载 < 运算符,用于定义比较规则return 0;在上述代码中,通过重载运算符为Person类定义了比较规则,这样就可以将Person类型的对象存入set中,并且set能按照定义好的规则来管理这些对象(排序和去重等)。总之,C++ 中的set。
2024-11-17 16:22:34
4442
原创 C++仿函数
从使用方式上看,它能表现出类似函数的行为,但实际上它是一个对象,具备类的各种特性,比如可以拥有成员变量来保存状态等。总之,仿函数在 C++ 编程中是一种很实用的编程技巧,在实现灵活的代码逻辑、适配算法要求以及利用面向对象特性提升代码质量等方面都有着重要的应用。这样的方式来调用它,就如同调用一个常规的函数一样,最终得到 5 的平方值并输出。时都会更新这个变量的值,从而实现了对自身调用次数的统计,这是普通函数很难做到的。结构体组成的向量进行排序,展示了仿函数在自定义算法逻辑方面的灵活性。
2024-11-15 11:41:00
635
原创 C++重写和重定义和重载
概念重定义通常也叫隐藏,是指在派生类中重新定义了与基类中同名的非虚函数(普通函数),或者改变了基类中同名函数(无论是否虚函数)的参数列表等情况,使得派生类中的同名函数将基类中的同名函数隐藏了起来。这并非是为了实现多态,而是在派生类中重新定义了一个和基类有同名情况的函数而已。规则及特点只要同名就可能隐藏:只要派生类中有和基类同名的函数(无论参数是否相同),就会发生隐藏现象。如果想在派生类中访问被隐藏的基类同名函数,可以通过使用基类名加作用域限定符()来访问,例如。参数不同也隐藏。
2024-11-15 09:51:59
2125
1
原创 静态多态和动态多态
是指在编译阶段就能够确定要调用的函数版本,主要通过函数重载和模板(函数模板、类模板)来实现。这种多态性的实现依赖于编译器在编译时根据参数类型、数量等信息进行静态绑定(早绑定),也就是在程序运行之前就确定了具体要执行的代码逻辑。
2024-11-15 09:11:05
547
原创 C++copy memcpy strcpy
InputIt和OutputIt可以是迭代器类型也可以是指针类型first指向数组或者容器的第一个元素位置,last指向最后一个元素的下一个位置,遵循左闭右开原则,d_first指向复制产出对象第一个元素位置。
2024-11-14 15:30:23
232
原创 C++继承(图文非常详细)
我们来看一下下面这串代码注意其中的两个类father 和 son我们可以发现son类定义的SN可以调用father的函数definity()如上图所示,这便是继承的格式。class 类名: 继承方式 继承的类名通过这样继承的方式我们可以想想一下,就是将father里面的内容全部让son可见,如果你觉得不好理解,你可以认为就是father里面的内容全部加进son里面,所以son就可以访问father里面的内容。
2024-11-09 13:49:45
693
原创 C++vector(详解)
迭代器的作用就是让算法不用关心底层数据结构,其底层就是一个指针,或者是对指针进行封装,比如:vector的迭代器就是原生指针T*,因此迭代器失效就是迭代器对应的底层指针指向的那块空间被销毁了,使用了被释放的空间,因此程序会报错。那么访问时会报错,就算迭代器没有指向末尾的数据,在vs的环境下,会进行强制检查,意思就是当删除这个数据时,再次访问这个位置或是访问后面的位置时,即使没有指向末尾的数据,编译器仍然会报错。当我们不去控制vector对象的空间时,一直想其中添加数据那么vector是怎么增长的呢?
2024-10-27 15:46:52
677
原创 string类(详解)
string是一个C++自己库里面定义的一个类类型,它的内部结构如下。它和c语言中的char类型差不多,也是用于定义字符串,但是C++引入string可以更好的对字符串进行操控,使用string必须包含#include头文件以及using namespace std;
2024-10-18 17:12:49
929
原创 C++模板初阶
为什么有模板C++要引入模板??如果我们要实现一个交换函数,比如那么当我要同时进行 double类型 ,float类型,int类型等各种类型之间的转换和不同类型之间的转换,那么我们是不是要写很多代码??比如那么有没有什么办法,让我写一个函数就够用呢???C++为我们提供了一个模板我们只要写一个函数,那么这个函数的形参类型会随着我们给的实参类型而变化我们给什么实参类型,这个形参就变成什么。那么这样是不是就方便了很多模板的格式返回值类型 函数名(参数列表){}
2024-10-11 20:09:03
944
原创 C++类型转换
我们理解类型转换直接看下面的代码我们看上面的a是一个AA类型的,但是为什么8可以给它赋值并且不报错呢???我们看这个图,当8给a赋值时,编译器检测到8是一个int类型,便给8进行了类型转换,首先创建一个临时的AA类型,将8用来给这个类型赋值初始化,再将这个类型复制给a关于类型转换赋值,不单单可以只赋一个值,如果构造函数有两个参数,可以赋两个值,比如如果类中有两个重载的构造函数,比如一个构造函数有一个参数,而另一个构造函数有两个参数,那么会根据给的实参数量不同,而调用不同的构造函数。
2024-10-10 10:05:53
345
原创 C++内部类和匿名对象
内部类就是定义在一个类的内部的类,比如如上所示类BB定义在类AA中BB类虽然定义在AA类中,但BB实际上是存放在静态区中。看代码我们看到AA类的大小为8,意思就是AA类大小只包含它的两个int类型的成员,不包含BB类的大小。内部类默认是外部类的友元类代码解释运行结果用AA类中的BB类定义了B,B中的内置函数可以调用用AA类定义的A中private的成员如果将BB类定义在AA类中的private/protect中那么BB类就是AA类的专属类,其它地方都用不了,只有AA类中能使用。
2024-10-09 18:19:01
289
原创 C++友元
上图的number1和number2被private给保护了起来,以至于print不能访问。有没有什么办法能让print(const Date& d1)能够访问number1和number2?让print()在类中声明,并且在前面加上关键字friend加上关键就说明这个函数是这个类的友元函数。运行结果通过这样的方式便能访问类private的成员变量友元函数并不属于类,只是一种声明权限,它可以访问类的private的成员。一个函数可以是多个类的友元函数。
2024-10-09 17:45:30
464
原创 C++构造函数(初始化列表)
1.无论是否显示写初始化列表,每个类都有自己的初始化列表。2.无论是否在初始化列表显示初始化,每个成员变量都要走初始化列表。
2024-10-09 11:47:59
927
原创 C++赋值运算符重载
运算符的定义要用到一个关键字operator,那么这个定义的格式就是operator+运算符号+(参数列表)+函数主体+返回值,如下图所示。
2024-10-05 14:51:23
966
原创 C++拷贝构造函数
拷贝构造函数的第一个参数必须是类类型对象的引用,如上图所示,const Date& d1是拷贝函数的第一个参数,拷贝函数也可以有多个参数,但第一个参数后面的参数必须都有缺省值。
2024-10-05 11:01:53
351
原创 C++构造函数和析构函数
C++把类型分为内置类型和自定义类型,内置类型就是语言提供的原生数据类型,如int/char/double/指针等,自定义类型就是我们自己定义的类型比如用class和struct定义的类型。对于内置类型类中的默认构造函数可以将它初始化,但是对于自定义类型,类中的默认函数无法将它初始化,但在这个类中生成对象时,会自动调用自定义类型的类中的默认构造函数,但是如果这个自定义类型中的类没有默认构造函数那么编译器就会报错,默认构造函数又分为,无参构造函数,全缺省构造函数,我们不写编译器自动生成的构造函数,
2024-10-04 12:37:58
919
原创 C++nullptr
所以在这里NULL不是一个空指针而是一个值0,而nullptr是C++引入的一个关键字,它可以避免被类型转化,它永远是指针类型,而NULL可能会发生类型转化。按道理来说当函数重载时我们输入一个实参NULL我们想调用的时void Add(int*a)但是为什么C语言明明有NULL可以将指针置为空,C++还要引入nullptr呢。所以为了前面那种情况,我们在C++中最好用nullptr来定义空指针。其实理解nullptr很简单,它其实就是将一个指针置为空。其实简单理解C语言的NULL它其实是一个宏。
2024-10-02 23:08:36
236
原创 C++函数重载
C语言不支持在同一作用域中存在相同的函数名,但C++支持,但是要求这些同名函数的形参不同,可以是形参类型不同,或者个数不同,或者顺序不同,这三者必须要满足一点,否则编译报错,不构成函数重载,这两个Add编译虽然不会报错,但当我们调用Add()的时候编译器会报错,因为编译器不知道该调用那个Add的定义,存在歧义,这两个函数虽然构成重载函数但在使用的时候会发生错误。在main函数中,构建了两个int 变量和两个double变量,当这两组变量用Add函数运算的时候却调用了Add不同的定义。
2024-10-02 17:55:18
221
原创 C++缺省参数
缺省参数就是C++设计出来对C语言函数定义的优化对于上面Func()来说,在主函数中没有给参数但是在函数定义的时候有int a=0那么a就为0去运行函数,但如果给了参数Func(10),那么a就等于10,说白了就是你给我我就把原来有的丢掉用你给的,你要是不给我我就用我自己的。这就是缺省参数。
2024-09-29 17:38:12
315
原创 C++的cin,cout,endl
在学c语言时我们学的是scanf和printf还有"\n",这些就对应了C++中的cin,cout,endl。cin,cout,endl存在于库函数<iostream>中我们要用他就需要引入这个库或者我们可以用using namespace std 来打开标准库用这三个函数但是在实际项目开发尽不建议用这个让我们看代码来对比一下用法这就是printf和scanf和“\n”的用法和cin,cout,endl的不同 endl其实就是换行,差不多相当于“\n”只不过它多了刷新缓冲区。
2024-09-29 17:09:17
498
原创 C++namespace
非常简单,就是用namespace关键字定义一个范围,并且给这个范围取个名字,等下次你想调用你设置的这些个,变量,函数,什么个玩意,你怕跟别的冲突了你就在设置的时候给他划一块范围,等你想用的时候,你告诉系统什么范围的就不会和别的冲突了。看下面代码和解释int main()return 0;你看,上面这个打印rand就和系统的rand函数冲突了,系统不知道你要那个就报错了,但下面这个你告诉了系统范围的名称和rand,系统就知道你到底要找那个了。注意:1.namespace只能定义在全局。
2024-09-29 16:33:07
494
原创 归并的递归和非递归排序
从中间将一整个数组分成两个数组,假设这两个数组已经完成了排序,那么设立一个新的数组,取两个数组各自第一个数据进行比较,那个数组的数据小就放入这个新建的数组,然后再重新在这个数组取数,再和另外一个数组原来取的数进行比较,那个小那个就放入这个新建的数组,直到有一个数组的数被取完,那么另外一个数组的全部数据都将依次放入新建的组,再将新建的数组的数据mencpy到原数组中就完成了排序,那么要怎么使两边的数组都是有序的呢???请看VCR。
2024-09-27 15:16:42
275
原创 数组快排的四种方法
如上图所示数组第一个数值为key,设立两个指针L和R从数组两边向中间移动,右边指针先移动,如果右边指针指向比key小的数值那么key继续向中间移动,直到指向的数值比key要大停止。左边指针在右边指针停止后移动,如果指向了比key数值小的那么继续向中间移动,直到指向比key要大或者与R指针指向的位置相同停下。再左边指针停下后如果L指针和R指针没有重合那么交换L和R指向位置的数据,如果L指针和R指针重合那么交换key和R或L指针指向的数据。这样在key左边的数据就比key小在key右边的数据就比key要大。
2024-09-27 14:41:02
373
原创 数组插入排序和希尔排序
从数组第一个数开始,加入数组前面的一个数,将加入的数与前面的比较如果,如果这个数比前面的数要小,这两个数的数值交换,如果比前面的数值要大那么就停止交换。将数组下一个数加入到其中继续进行比较交换。一直到数组里没有数据可以进行交换那么这个排序就完成了。
2024-09-27 12:30:41
182
原创 数组选择排序
选择排序的实现条件就是设置两个指针(次指针不是数据类型的指针而是int类型的值指向数组的下标)两个指针从最左端开始向右遍历,遍历结束一个指针指向该数组最大的值一个指针指向数组最小的值,将最大的值与与数组最右端的数据交换,将最小的值与数组最左端数据交换。当,max指向数组最左端时,我们将min指向的值与最右端的值交换,再将最右端的值与最左端的值交换,这样便修复了BUG。当出先这种情况时我们需要设立一个特殊情况时的特殊处理。一直到最右端和最左端都是同一个数组元素停止操作。将剩下的数组循环上述操作。
2024-09-26 20:21:52
190
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人