![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 76
xxjkkjjkj
这个作者很懒,什么都没留下…
展开
-
lambda
在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。[ ]:捕捉列表里面可以传值捕捉,引用捕捉,捕捉上下文中的变量放进lambda函数中使用。mutable:lambda函数里变量默认是const,次关键字取消常性,不用就不写。->returntype返回值类型:函数返回值类型,一般可以由编译器推导,可以不写。lambda的类型是一个唯一的随机值,class之类的。,可调用对象分为三种,函数指针,仿函数,lambda。():参数列表也就是普通函数的参数,不需要可以省略。原创 2024-04-29 17:03:06 · 132 阅读 · 0 评论 -
智慧指针底层实现及其使用注意
为什么要有智慧指针?当抛出异常时,程序会立即跳转到匹配的 catch 块,跳过 try 块中剩余的代码。因此,在 try 块中分配的资源(如动态内存、文件句柄等)可能不会被正确释放。为了避免这种情况,可以使用智能指针(如 std::unique_ptr 和 std::shared_ptr)和 RAII(Resource Acquisition Is Initialization)技术来确保资源在异常发生时得到正确清理。智能指针 说白了 就是 指针管理那他是怎么管理的呢?原创 2024-04-28 16:39:46 · 162 阅读 · 0 评论 -
多态2........
那要是两个套在一起呢?那也是各是各的,你解决你的数据冗余二义性,我解决我的多态问题。多态和虚继承都在内存中产生了额外的东西,但是他们两个没有一点关系!虚函数的virtual和虚继承腰部的virtual没有一点关系!原创 2023-10-23 15:06:07 · 127 阅读 · 0 评论 -
C++11 -
这是list模拟实现迭代器的==和!=重载时,while( it!= lt.end() ) 时 lt.end()传值返回产生了临时空间。3、无论是强制类型转换还是隐式类型转换,都会开辟临时空间,因为不能修改原本变量的值,所以形参要加上const,因为临时空间具有常性。把aa拷贝给临时空间,如果是很大的对象并且进行深拷贝,消耗会很大。临时空间具有常性,什么时候会产生临时空间呢?eax和xmm0到底算不算临时空间呢?2、表达式的返回值是一个临时变量。原创 2023-09-24 19:58:03 · 75 阅读 · 0 评论 -
RBTree-红黑树
最长路径 只能往黑的里面塞红的,塞黑的就会与性质4冲突,则最长路径就是一黑一红相间的路径,还只能塞一个红,两个红会违反性质3.控制住这几条性质,我们就控制住了红黑树最长路径不超过最短路径的2倍,达到近似平衡。按这颗树来举例估算AVL树和红黑树之间的性能差距,为什么说红黑树反而更优呢?但你要控制高度超2/3很难去控制,红黑树通过颜色控制而不是高度差。红黑树认为AVL树太严格控制平衡了,旋转的过程是要付出代价的。红黑树能做到最长路径不超过最短路径的2倍,达到近似平衡。11条路径,根到空节点算一条路径。原创 2023-09-15 11:31:49 · 53 阅读 · 0 评论 -
AVLTree-平衡二叉树
AVL树是解决二叉搜索树极端情况下的单支树问题,具有以下性质即可做到增删改查都是log(N).AVL树首先得是一颗二叉搜索树:1.它的左右子树都是AVL树2.左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)平衡因子 = 右子树的高度–左子树的高度。原创 2023-09-15 11:28:53 · 41 阅读 · 0 评论 -
Stack-queue
stack和queue使用了container适配器,因为它觉得我不需要自己实现一个容器来实现而直接用现成的stack和queue并没有迭代器,因为本来就是后进先出,先进先出,怎么可能让迭代器随便访问呢?适配器讲的全一点是容器适配器,对容器进行封装改造控制适配出栈和队列并且stl中的栈采用这种适配器,可以做到链式栈和数组栈秒切换,那这么神奇怎么做到的?模板!原创 2023-09-04 19:47:47 · 66 阅读 · 0 评论 -
map-set使用
map和set一样不允许修改key,但是需要修改value,所以不敢像set一样全用const迭代器,他是利用pair里面的const key修饰。你一开始得用查找find看在不在map里,如果不在那就插入第一个水果,如果在,那就要让计数++。现在有方括号,你就可以利用Insert的查找,它的V()就是0,第一次插入不就对0++变成1了。2、key不在树里面,返回pair插入需要插入的是一个pair , pair 是什么?那我该如何创建一个pair?原创 2023-08-10 15:09:56 · 44 阅读 · 0 评论 -
模板进阶-coming soon
/原创 2023-08-09 23:07:44 · 94 阅读 · 0 评论 -
二叉搜索树
我们可以搞一个getRoot()函数来返回_root,但是这里采用了更好的方式,就是利用类内一个函数套子函数的方式便可以直接访问_root。根据二叉搜索树的规则,cur走到空,并且需要和prev比大小确定cur插入到Parent的左 or 右。二叉搜索树不允许相同的值插入,如果插入的值相同就返回假,插入成功就返回真。在中序遍历时,调用时无法获取BSTree中私有的Node* _root。二叉树不设下限,面对这种情况,查找的时间复杂度时O(N)这个技巧在二叉搜索树中会大量使用。原创 2023-08-08 17:03:01 · 115 阅读 · 0 评论 -
继承-菱形继承
因为private和protected在类和对线阶段他们没什么区别,都是类内可以访问,类外不可访问,但是到了继承这里,private成员的不可见,导致proteced的出现。例如如果是public继承,那么基类中protected成员继承到子类中访问限定符就是protected(类外不可访问,类内可以访问)2.根据继承方式和成员在基类的访问限定符小的那个来决定了子类访问基类成员的访问方式。1.根据表中我们可以看到 基类的私有成员在子类不可见,但还是被继承了下来。继承是类设计层次的复用。原创 2023-07-25 22:29:58 · 401 阅读 · 0 评论 -
多态及其原理
如果析构函数不构成多态,那么p->destructor() 是普通调用,只看当前者p的类型,永远只调用~person。// 1、派生类的重写虚函数可以不加virtual – (建议大家都加上)形参类型一样,函数名一样,析构又没有返回值,那么就需加上virtual即可。// 2、协变,返回的值可以不同,但是要求返回值必须是父子关系指针和引用。// 重写的条件本来是虚函数+三同(即派生类虚函数与基类虚函数的。//// 普通对象(普通调用(不构成多态)),看当前者类型。//// 多态调用看的指向的对象。原创 2023-07-25 20:00:08 · 164 阅读 · 0 评论 -
priority_queue - coming soon
仿函数是另一维度的泛型,存储的是比较的类型,我也不知道你传入的是什么比较,这里可以实现的比较,控制大堆小堆。库里把这个类加上了类模板使得能比较的类型范围扩大,支持更多类型的比较,只要T类型支持比较重载。如果类型的比较不符合 我们的意愿,可以按照我们自己的意愿控制比较规则。为什么用这个仿函数呢?利用仿函数就不再是写死的,而通过仿函数对象com可以实现大小堆。仿函数 的作用和 函数指针本质是一样的,只不过函数指针更加复杂。仿函数的意义(本质)是:这个类的对象可以像函数一样使用。sort排序 升序降序。原创 2023-07-23 21:08:21 · 49 阅读 · 0 评论 -
list-
erase后it指向的结点不存在了,就存在失效问题,和vector一样erase设计了返回值返回删除的下一个结点迭代器。但是list里面的sort提供的不多余,因为算法里面的sort是快排需要随机迭代器,而list不支持,所以单独提供。随机 ++ / - - / + / - vector / string / deque。双向 ++ / - - 双向循环带头链表(list) / map / set。随机是特殊的双向,因此vector 的迭代器可以使用reverse。Random 期望随机迭代器。原创 2023-07-23 18:03:55 · 75 阅读 · 0 评论 -
vector
原先的pos指向旧空间,如果发生扩容开辟了新空间,我们就要找到新空间中pos相对的位置,不然就会发生迭代器失效问题,程序会崩溃或者随机值,并且这种情况是偶发性的错误(如果不扩容那没什么问题)这里指针start不会是0号地址,0号地址是无效地址,所以while(pos>=start)条件会停下来,这是start.finsih,eof带给我们的优势。情况二,即使push_back不复用insert,在insert时如果发生扩容,就会产生问题插入一个随机值。原创 2023-07-23 18:03:12 · 62 阅读 · 0 评论 -
string模拟实现
strcmp能比较不同长度的字符串吗?可以,并且其中字符串提前结束后最后一位\0参与了对比,这和string里面的原创 2023-07-08 21:32:33 · 242 阅读 · 0 评论 -
C++ 模板
这里为什么要对形参x,y加上const?因为1,2.3是常量,常量加上引用不加const会权限放大预备知识:普通类,类名和类型是一样类模板,类名和类型不一样类名: Stack类型: Stack构造函数的函数名 = 类名stack是类型,指定类域用类型声明和定义分离首先要加上template,不然它怎么认识T是谁public :// 其他方法... ~ stack() {_size = 0;T * _array;int _size;原创 2023-05-19 19:48:34 · 42 阅读 · 0 评论 -
C++ 动态内存管理
operator new 是给new使用的,如果operator new失败抛出bad_alloc异常,就是mallco失败。operator new 和 operator delete 为了应对C++ 出现错误 要抛出异样。至于delete时是先析构后释放空间,因为构造时有可能也申请空间,先释放空间会导致内存泄漏。operator new 和 operator delete 是全局函数。如果成功给new使用调用构造函数。原创 2023-05-18 20:29:01 · 45 阅读 · 0 评论 -
C++ 类和对象下 [补充]
答:返回对象时内置类型时,一般都是通过寄存器来带回返回值的,返回对象如果时较大的对象时,一般会在主调函数的栈帧中开辟一块空间,然后把这块空间的地址,隐式传递给被调函数,在被调函数中通过地址找到主调函数中预留的空间,将返回值直接保存到主调函数的。因为B在A的内部,其实他们之间没什么关系,只不过是B这个类型定义在A的类域里,没有B的实例化对象不占空间,类是图纸,如果A的成员变量里面 有个 B的实例化对象,那就占空间了。友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。原创 2023-05-18 13:13:13 · 549 阅读 · 0 评论 -
C++ 类和对象下
类内重载导致操作数顺序颠倒问题:所以定义在类外,但又要访问私有成员变量,就利用友元突破访问限制类外定义利用cout这个对象的别名,输出对象的成员变量,并且需要返回这个cout的别名,因为对于连续输出需要从左到右返回cout的顺序问题 cout原创 2023-05-09 09:26:58 · 305 阅读 · 0 评论 -
运算符重载----赋值运算符重载
本质是函数调用,内置类型编译器直接比,自定义就去找对应类内重载的函数如果定义在类外,需要访问私有的成员函数,只能将成员函数权限变为Public或者友元(非必须不用),所以一般重载函数都写在类内定义函数名字为:关键字operator后面接需要重载的运算符符号。函数原型:返回值类型 operator操作符(参数列表)注意:不能通过连接其他符号来创建新的操作符:比如operator@重载操作符必须有一个类类型参数用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义作为类成员原创 2023-04-28 18:51:31 · 962 阅读 · 0 评论 -
类的默认成员函数
默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。先看看拷贝构造会在什么时候发生1.自定义类型对象以值传递的方式实参传递给形参C++规定了,必须要调用拷贝构造去完成2.对象通过另一个初始化好的对象进行初始化红框也会调用1次拷贝构造并且红框上面,为什么这里拷贝函数只调用一次,不是应该2次吗,自定义类型赋值一次,函数传值返回的临时空间拷贝一次答:连贯的构造和拷贝构造 会被优化成一次3.对象以值传递的方式从函数返回。原创 2023-04-27 14:22:00 · 491 阅读 · 0 评论 -
c++ namespace
更多的域类域命名空间域局部域全局域局部域优先全局域。原创 2023-04-16 12:24:39 · 58 阅读 · 0 评论 -
C++ 引用
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。(语法层面来讲)但在底层实际上引用是开辟空间的,类似于指针1、基本任何场景都可以用引用传参。2、谨慎用引用做返回值。出了函数作用域,对象不在了,就不能用引用返回,还在就可以用引用返回。原创 2023-04-19 12:57:20 · 422 阅读 · 0 评论 -
内联函数-取决于编译器
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。因为inline被展开,就没有函数地址了,链接就会找不到。内联函数完美解决了宏函数上述所以缺点,但是不是所有函数都要搞成内联函数,因为会造成下面的问题。inline对于编译器仅仅只是一个建议,最终是否成为inline,编译器自己决定。如果函数内部代码很长,又需要频繁调用,此时把它变成内联函数会造成代码膨胀。适用于短小的频繁调用的函数。正确用法:直接定义在.h。原创 2023-04-20 11:02:00 · 201 阅读 · 0 评论 -
缺省参数-函数重载
缺省参数-函数重载原创 2023-04-18 15:25:57 · 187 阅读 · 0 评论 -
类对象的大小---this指针
对比C和C++this指针隐含的帮助我们完成了对象的取地址操作,更为方便。原创 2023-04-26 13:39:54 · 511 阅读 · 0 评论