C++
文章平均质量分 87
内容只要是C++的基本语法等,还有C++的模板的见到介绍,主要是C++中的 STL ,C++11中的新增内容
Naxx Crazy
这个作者很懒,什么都没留下…
展开
-
位图的实现与应用
在设置之前,我们还需要计算出对应的比特位的位置吗,由于我们使用的是 int 所以我们想知道到第几个比特位,我们就可以对该值进行除32 就是在对应的数组位置,然后我们知道了对应的数组位置,我们还需要知道该比特位在该数组位置的第几个比特位,所以我们还可以用该值对 32 进行取模操作,我们就知道对应的比特位了。怎么探测是否存在呢?其实我们想知道一个比特位在位图中是否为1或者是0,我们可以对该比特位与1,如果结果是1,则说明该比特位表示的值是存在的,如果为0,表示该比特位表示的值并不存在。原创 2023-09-23 18:25:43 · 94 阅读 · 0 评论 -
C++11常见语法
目录C++11(初始化列表与右值引用)列表初始化initilaizer_listautodecltypenullptr智能指针stl新增容器右值引用左值:右值:右值引用与左值引用的比较左值引用的作用右值引用的作用万能引用完美转发完美转发的价值C++11 是C++跟新了很多有用内容的一个版本,其中包括了列表初始化,initialiazer_list,右值引用等等。下面一起看一下C++11跟新的内容。在C语言中,数组、结构体都可以用花括号来初始化,也就是这个{}。但是C++的类却不支持那样初始化,C++的类只能原创 2023-09-26 16:46:17 · 127 阅读 · 0 评论 -
C++11常见语法
那么它就是利用了模板的可变参数,如果 args 是一个插入的对象的参数,那么就该函数就调用 new 对应的节点构造函数,或者是拷贝构造,如果直接是对象的话,那么就是拷贝构造(但是如果写了移动构造,就有可能是移动构造),如果是参数的话,那么就是构造函数。对于移动构造来说,如果没有显示的写移动构造和移动赋值,并且还没有写拷贝构造、复制重载、析构函数,那么就会默认生成一个,默认生成的移动构造,会对内置成员变量进行浅拷贝,对于自定义类型会调用其移动构造,如果自定义类型没有移动构造,那么就会调用其拷贝构造。原创 2023-10-08 10:03:05 · 909 阅读 · 0 评论 -
RBTree(红黑树)模拟实现(插入)
旋转规则上面以及说过了,下面说一下变色:1. 单旋情况下,将 grandparent 变为红色, parent 变为黑色2. 双旋情况下,将 grandparent 变为红色, cur 变为黑色。原创 2023-09-11 09:26:29 · 479 阅读 · 0 评论 -
AVL树 模拟实现(插入)
如果 parent 的平衡因子为 2 ,cur 的平衡因子为 1,那么使用的是左单旋,将 parent 和 cur 的平衡因子都跟新为 0.如果 parent 的平衡因子为 -2 ,cur 的平衡因子为 -1,那么使用的是右单,将 parent 和 cur 的平衡因子都跟新为 0.。原创 2023-09-10 11:06:58 · 362 阅读 · 0 评论 -
面向对象之_多态_1
多态多态的调用需要父类的引用或者是指针调用调用的函数必须是虚函数进行重写虚函数重写的条件是三同(函数名相同,返回值,参数)在多态这里子类是可以不加 virtual 的,只要父类加了,那么子类与父类的函数又是三同,就构成多态协变,协变就是返回值可以不同,但是返回值必须是父类返回父类的指针或者是引用,子类必须返回子类的指针或者是引用,而且返回的父子类只要是父子类既可以,不一定是自己的父子类。原创 2023-07-26 13:00:37 · 149 阅读 · 0 评论 -
面向对象之继承
在 C++ 中,继承是一种面向对象编程的重要特性,它允许一个类(称为派生类或子类)从另一个类(称为基类或父类)继承属性和行为。通过继承,子类可以重用基类的成员,并且可以添加自己的新成员或修改继承的成员。覆盖就是我们的父类与子类中有同名成员,那么我们的子类中的同名成员就是会覆盖我们的父类中的同名成员,导致我们访问的时候如果不指定的话只能访问到子类里面的,如果想要访问父类的话,那么我们就是需要指定的访问。public:protected:string _id = "张三";原创 2023-07-24 21:18:28 · 1686 阅读 · 0 评论 -
template_进阶_特化
我们可能取到的一个 static 的变量,我们还可能取到的是一个我们的类内的一个类,所以我既然可以取到是 static 的变量那么我们的语法就是错误的,由于编译器它也并不知道我们到底能取到什么,所以就直接报错了,那么我们怎么解决呢?这个就是我们的非类型模板参数,实际上我们的非类型模板参数就是解决类型的问题的,而且我们的非类型模板参数的限制比较多,我们下面可以看一下。这次我们先看一下函数模板的特化,然后我们看类模板的特化,主要是一些我们之前不怎么使用的语法,下面我们来看一下。我们看一下其它的特化。原创 2023-07-21 21:37:16 · 127 阅读 · 0 评论 -
reverse_iteartor 反向迭代器
反向迭代器(reverse iterator)是一个用于逆向遍历容器的迭代器。与正向迭代器不同的是,反向迭代器从容器的末尾开始向前移动,逐个访问元素直到到达容器的起始位置。反向迭代器常用于需要逆向遍历容器的情况,例如倒序打印容器中的元素,逆序访问文本字符串等。STL中的各种容器都支持反向迭代器,可以通过调用rbegin()和rend()成员函数来获得反向迭代器的起始位置和结束位置。反向迭代器与正向迭代器类似,可以使用*操作符来获取当前元素的值,也可以使用++操作符来向前移动迭代器。原创 2023-07-20 22:30:01 · 201 阅读 · 0 评论 -
STL源码刨析_priority_queue
priority_queue(优先队列)是一种容器适配器,它提供了一种自动排序的数据结构,其中插入的元素按照优先级进行排序。总体上,priority_queue是一种功能强大的容器适配器,可用于实现自动排序的数据结构。通过提供插入、访问队首元素等操作,priority_queue提供了一种方便且高效的方式来管理带有优先级的数据。这里的 priority_queue 也是一个适配器,但是它并不像 queue 和 stack 一样只是简单的封装,他还是加了一些底层的东西,来达到它自己的功能。原创 2023-07-20 21:39:06 · 63 阅读 · 0 评论 -
STL源码刨析_stack & _queue
queue(队列)是一种容器适配器,它提供了一种先进先出(FIFO)的数据结构。特点:queue是一种具有特定功能的容器,它在队尾进行元素的插入操作,而在队头进行元素的删除操作。插入操作称为入队(push),删除操作称为出队(pop)。队列中的元素按照先进先出的顺序进行处理。使用容器:queue的实现通过在内部使用其他容器来存储元素。默认情况下,STL中的queue使用deque(双端队列)作为底层容器。也可以通过指定其他容器类型来创建自定义底层容器的queue。原创 2023-07-19 15:24:24 · 490 阅读 · 1 评论 -
STL源码刨析_list
在C++的STL(Standard Template Library)中,list是一种双向链表容器,可用于存储和操作元素的集合。双向链表:list底层使用双向链表来实现,每个节点都包含一个指向前一个节点和后一个节点的指针。这使得在list中插入、删除元素的操作效率较高,而不需要像数组或向量那样移动其他元素。无需连续内存:list中的元素不要求在内存中连续存储,因此它可以动态地分配和释放内存空间。这为存储大量元素或在运行时频繁插入和删除元素的场景提供了灵活性。原创 2023-07-17 21:29:56 · 277 阅读 · 0 评论 -
STL源码刨析_vector
STL(Standard Template Library)中的vector是一种常用的动态数组容器。它在内存中按顺序存储元素,并可根据需要自动调整容量。动态数组:vector容器可以根据需要动态增长或减少其大小。它能够在运行时自动调整内部数组的大小,使其能够容纳任意数量的元素。随机访问:通过索引可以快速随机访问vector中的元素。vector以连续的内存块存储元素,因此可以使用索引来访问、修改或删除元素,时间复杂度为O(1)。原创 2023-07-15 20:46:48 · 224 阅读 · 0 评论 -
STL源码刨析 string实现
C++ 的 string 类是标准库中的一个重要类,它提供了一种方便和灵活的字符串处理方式。使用 string 类,可以方便地创建、操作和管理字符串,而无需手动管理底层的内存。以下是 string 类的一些主要特点和功能:1. 字符串的存储和管理:string 类提供了存储任意长度字符串的能力,它会自动管理内存,自动调整容量,并提供了对字符串的访问和修改方法。原创 2023-07-07 16:28:08 · 415 阅读 · 0 评论 -
C++模板template
我们现在有几个变量,我们向要实现他们的交换,所以我们现在写了一个swap函数我们现在可以实现对这两个变量之间的交换, 那么我们有有两个变量需要交换呢??我们刚才的Swap函数的参数是int类型的,我们现在的两个变量是double类型的,那么我们想要交换double类型的函数可以吗?不可以但是由于我们的是C++可以实现函数重载,所以我们还可以写一个和刚才的swap函数逻辑完全相同的一个参数为double的函数。原创 2023-05-18 14:36:54 · 369 阅读 · 0 评论 -
C++内存管理
1.new/delete是操作符,而malloc/free是函数2.new后得到的值不需要类型强转,而malloc会返回void*的指针,需要强转3.new/delete操作比较简单,而malloc/free稍微较复杂4.new和delete出错了会抛异常,而malloc和free是返回错误码5.new可以初始化,而malloc不行6.new和delete对自定义类型会分别调用对应的构造函数和析构函数,而malloc和free只能开辟空间和释放空间如果上面有不完善的欢迎各位指出!原创 2023-05-16 23:18:31 · 274 阅读 · 0 评论 -
C++类与对象Plus
我们之前讲的都是类与对象的基础,以及类中的几个默认函数等,今天我们就讲一下类与对象的其他东西。原创 2023-05-10 23:27:19 · 414 阅读 · 0 评论 -
C++运算符重载
上一次我们说了其他的运算符,像 "+" "+=" "=" 等运算符的重载,但是在C++中,我们还有一些运算符,<</>>就是流插入和流提取,以及我们上次说了其他的四个默认函数,剩余的两个默认函数我们今天来讲。原创 2023-05-10 22:47:16 · 705 阅读 · 0 评论 -
C++默认成员函数 & 日期类运算符重载
不过这一次,如果我们-=天数后,如果天数<0那么说明本月已经结束了,我们得看是否满足上一个月的天数所以,我们就不是判断是否是满足本月的天数了,而是上一个月,所以如果我们的_day<0我们就直接先天正月分,让_month--<然后我们在判断月份是否满足,调整年份,然后我们就继续对_day+=本月的天数。我们还是可以像+=一样,我们先对原来的天数-=想要-=的天数,然后我们判断天数和对应的月份是否合法,如果不合法,我们就需要对月份进行-=1了,如果_month<1那么我们还需要调整年,下面我们来看一下。原创 2023-04-28 15:03:01 · 829 阅读 · 2 评论 -
C++的默认成员函数
上一次我们说到了C++的类,我们还知道在C++的类中可以写函数,而且这个函数也属于这个类,我们可以直接使用这个类的对象去调用这个函数。今天我们来看一下C++的六个默认成员函数(这里说是6个,但是重要的只有4个)原创 2023-04-26 11:16:38 · 683 阅读 · 3 评论 -
C++中的类与对象
我们在C++中struct升级为了类,而在C++中,我们的obj就是对象名,但是我们也可以前面加struct,因为这是为了兼容C语言的语法,不过如果想在C语言中也直接使用obj也是可以的,需要在前面加typedef这个就不演示了。我们看到是不可以访问的,并且我们看到显示stack里面的a是private的,这里说明我们的class没有给访问限定符,但是默认访问限定符是private的,而我们的struct默认访问限定符是public的。我们在C语言中的结构体是struct,而在我们的C++中升级成了类。原创 2023-04-22 16:58:38 · 934 阅读 · 0 评论 -
C++ 内联函数(inline)
我们可以想一下,内联函数是在调用的地方展开,可以减少建立栈帧的开销,并且代码量不能太大,所以根据这个条件我们就可以想到,内联函数适应于,代码短小,并且频繁被调用的函数。我们可以想到的是,如果代码量太大,并且有很多地方调用了这个函数,那么在编译连接之后五一会增加代码量,会让编译好的汇编代码膨胀,导致可执行文件变大,这样就得不偿失了。我们可以看到,我们调用这个函数的时候是直接展开了,而并不是去call这个函数。我们可以想一下,内联函数是在调用的地方展开,如果代码量太大展开了会怎么样?可是内联函数有什么作用呢?原创 2023-04-22 14:13:44 · 363 阅读 · 0 评论 -
C++中的引用
我们可以想一下,由于我们的a是const的,那么如果我们的b直接引用的话,我们的b不是const的没所以此时想要修改我们的a就可以修改,但是我们的a是const的,不允许被修改,这样就不合逻辑,所以我们的b是不可以直接引用的,如果直接引用的话就是权限的放大,所以这里只可以进行权限的平移,不能进行权限的放大,所以这里是错误的。我们看到,我们现在是想对一个a和i的运算进行引用,那么这里a和i的运算下来的值进行引用,但是a+i的返回值也是一个临时变量,所以这样直接引用也是不可以的,也是需要加const。原创 2023-04-17 22:59:11 · 340 阅读 · 0 评论 -
C++ 缺省参数 && 函数重载 && 引用
这里我们都对a 进行了修改,我们看到如果我们向修改 a 的话,我们可以直接对引用进行修改,而我们想要用指针修改的话,我们时需要先解引用,在修改的,所以我们就可以把 b 直接理解为是 a而引用也就是“取别名”。这里的fun函数我们给了一个缺省值 0 ,所以我们调用这个函数的时候,如果我们给它传了值,这里输出的值就是我们传入的值,如果我们没有传入值的话,就是默认的缺省值。我们看到,我们调用了名字相同的函数,得到的参数却不同,这既是函数重载,因为我们传入的参数不同,所哟调用到了不同的函数。原创 2023-04-15 19:14:45 · 499 阅读 · 0 评论 -
C++的命名空间
很好这里输出的是1,这里C语言里面也说过,如果有两个名字相同的变量,并且一个是局部的另一个是全局的,那么这里就是局部优先原则这里先访问局部的变量。我们就可以展开命名空间,但是这里我们看到出现错误了,因为我们展开了命名空间,所以这里的a和全局的冲突了,所以我们很多时候不需要展开。C++和C语言是有一些相似的地方的,而且C++就是C语言的改进版本,所以学习C++也得学习C语言,但是他们又是有很多不同的地方。那么如果我们分别想访问这三个变量,我们应该怎么访问呢?那么如果我们不想指定的访问tmp里面的a变量呢?原创 2023-04-13 23:36:07 · 390 阅读 · 0 评论