
c++
文章平均质量分 93
被AI抢饭碗的人
这个作者很懒,什么都没留下…
展开
-
c++:智能指针
两个被智能指针托管的对象中,存在成员变量也是会导致引用计数++类型的智能指针,且这两个智能指针互相指向另一个空间。此时就会导致循环引用。原创 2025-04-17 23:33:56 · 1223 阅读 · 0 评论 -
c++:c++的输入输出(一)
返回值是整形(ascll码值),无需传参我们在输入框中输入字符a,然后打印c值(a的ascll码值为97)的结果是97,然后强制类型转换为char之后输出就是a了我们输入了空格,然后输出空格的ascll码值32,最后又输出了一个空格,然后换行。这里我们用bbb来显示出我们输出的是空格输入换行字符也就是‘\n’,然后打印\n的ascll码值10,换行后输出\n。虽然这里我们在cahr()a之后没有加endl,却完成换行,这说明我们输出的就是换行符。原创 2025-04-16 09:17:51 · 599 阅读 · 0 评论 -
c++:异常
出现错误情况的时候通过返回错误码,然后在接受该函数返回值的地方利用if语句进行捕获,并在if语句进行处理。这里我们就是使用了c语言的错误处理方式1.通过返回错误码的方式逐层接收2.需要手动释放资源3.需要根据错误码查找错误信息优势:性能开销极低劣势:只能逐层接收,调用链极深的情况查找错误源头很麻烦,且需要手动释放资源1.抛出异常并从当前层开始依次与浅层的调用链中catch的对象匹配,匹配成功就处理,都不可匹配就终止程序2.无需手动释放资源3.抛出异常的时候就会打印错误信息。原创 2025-04-15 11:47:12 · 1117 阅读 · 0 评论 -
c++11新内容补充
lambda和范围for很像,他们实际上都是封装出来的,lambda底层就是一个仿函数的类实际上就是生产在仿函数中的成员变量operator()中的传参operator()的返回值operator()的函数体。原创 2025-04-10 23:24:03 · 1186 阅读 · 0 评论 -
c++:封装哈希表实现unordered_map与unordered_set
这里我们修改了构造函数的参数,将HT*变为const属性,这是因为后续支持cosnt_iterator的时候会传递的对象是const属性,如果这里参数不是const属性会导致权限被放大。这里我们传给哈希表的参数不再是key和value,而是单独的k和容器存储的数据类型(set中是key,map中是pair<K,V>),这样可以兼容set和map进哈希表。首先我们要在unordered_set中写一个SetOfT,返回值类型为K,不过需要注意的是返回的是const类型的,否则会导致权限放大。原创 2025-04-02 23:00:16 · 1272 阅读 · 0 评论 -
c++:哈希表
哈希表又叫散列表,他是非顺序存储,存储的位置被交换并没有影响,将key和存储位置通过哈希函数进行映射,包含无序set和无序map。他的查找主要依靠哈希函数计算出key所处的位置,从而实现常数级别的查找。原创 2025-04-01 19:57:29 · 1098 阅读 · 0 评论 -
c++:封装红黑树实现map与set
我们前面实现的迭代器只能支持普通引用和普通地址返回,而不能控制他为const属性,且如果我们迭代器返回的指针或引用不再是普通的指针/引用,而是智能指针、右值引用时,也无法兼容。由于我们的map和set是红黑树为底层实现的,所以指针无法直接充当迭代器,我们还需要将迭代器单独封装进一个类,然后重载运算符实现迭代器除了访问外的功能。然后考虑右树为空的情况,在父节点存在的情况下寻找到子节点为父节点的左节点的那个父节点,并让迭代器中的_node指向该父节点。然后返回_node。然后进入while循环,原创 2025-03-26 20:40:44 · 1203 阅读 · 0 评论 -
c++:红黑树
1.当uncle为红,变色2.当uncle不为红,变色+旋转(1)若parent为左孩子,cur也为左孩子:左旋+变色(2)若parent为右孩子,cur也为右孩子:右旋+变色(3)若parent为左孩子,cur为右孩子:左旋加右旋+变色(4)若parent为右孩子,cur为左孩子:右旋加左旋+变色。原创 2025-03-19 19:37:17 · 1667 阅读 · 0 评论 -
c++:AVL树
3.父节点平衡因子为2/-2,说明节点失衡,进行旋转,然后不用向上更新。原创 2025-03-14 15:27:32 · 729 阅读 · 0 评论 -
c++:set与map
eg:数组,链表,栈,队列通常用于按照顺序访问和存储数据。原创 2025-03-04 15:02:04 · 927 阅读 · 0 评论 -
数据结构:二叉搜索树(排序树)
因为我们需要保持二叉搜索树的排序结构,只能从左树找一个最大数据(保证替换后根大于左树,且由于是从左树找的数据,必然也是小于右树的数据的),或者从右数找一个最小数据(和左树同理)原创 2025-02-28 15:05:57 · 866 阅读 · 0 评论 -
c++:多态
(1)必须由基类的指针或引用使用实现了多态的函数因为存在切片现象,传递基类或派生类都可以兼容,若是派生类使用则无法兼容基类(2)实现了多态的函数必须是虚函数且完成虚函数的重写。原创 2025-02-26 20:15:28 · 921 阅读 · 0 评论 -
c++:继承
继承格式:class 派生类名 : 继承限定符 基类名继承类模板。原创 2025-02-25 10:16:55 · 1442 阅读 · 0 评论 -
c++:模板进阶
优点远大于缺点1.代码兼容性更高,更灵活2.复用代码节省资源代码膨胀,编译时间变长。出现模板错误报错信息混乱,难以定位。原创 2025-02-20 16:36:29 · 1145 阅读 · 0 评论 -
c++:stack与deque
我们看到这里s1初始化的时候是空初始化,所以用empty来判断出的就是空的栈。原创 2025-02-18 20:06:21 · 758 阅读 · 0 评论 -
c++:list
自定义类型会调用对应的构造函数。原创 2025-02-03 19:58:57 · 1411 阅读 · 0 评论 -
c++:vector
常见的三种构造方式:空构造,拷贝构造,指定元素构造。原创 2025-01-29 18:19:54 · 1956 阅读 · 0 评论 -
c++ :基础概念衔接
引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间, 它和它引⽤的变量共⽤同⼀块内存空间。⽐如:孙悟空的别名叫齐天大圣格式:类型& 引⽤别名 = 引⽤对象;这里我们解释一下对引用的引用因为引用类比成别名,所以我们举个具体的例子来理解。孙悟空的别名叫齐天大圣,而取经完成后他被封为斗战胜佛,也就是齐天大圣又可以叫斗战圣佛,那么孙悟空是不是也可以叫斗战圣佛呢?所以其实我们可以把别名理解成他本身,本质上是一样的总的来说,他别名的别名也是他的别名。原创 2024-11-10 20:39:21 · 656 阅读 · 0 评论 -
c++:类和对象(一)
⼀般成员变量都会被限制为private/protected,需要给别⼈使⽤的成员函数会设置为public。因为不希望别人直接访问底层,但是又对底层信息不清楚导致报错对成员变量使用了private修饰,对接口函数使用了public修饰。private的作用域是从private修饰符开始到出现下一个修饰符(public)结束,public的作用域则是从public开始到类结束1.3类域作用域:全局域,局部域,命名空间域,类域(类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中。原创 2024-11-12 22:50:12 · 1123 阅读 · 0 评论 -
c++:类和对象(二)
默认成员函数很重要,也⽐较复杂,我们要从。构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象(我们常使⽤的局部对象是栈帧创建时,空间就开好了),⽽是对象实例化时初始化对象。析构函数的功能类⽐我们之前Stack实现的Destroy功能,⽽像Date没有Destroy,其实就是没有资源需要释放,所以严格说Date是不需要析构函数的。跟构造函数类似,我们不写编译器⾃动⽣成的析构函数对内置类型成员不做处理,⾃定类型成员会调⽤他的析构函数。原创 2024-11-13 20:47:56 · 923 阅读 · 0 评论 -
C++:类和对象(三)
补充:说开空间也不是很准确。准确来说,我们在开空间的时候是编译器预估好函数大概需要占用的空间去开辟,然后我们的对象再从已经开了的空间中占用一定的空间,如果不够我们才会接着开。(1)格式:初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式。而这种方式也叫显式实现初始化列表(2)重点:每个成员变量在初始化列表中。原创 2024-11-21 17:44:29 · 696 阅读 · 0 评论 -
c++:内存管理
这是因为支持隐式类型转换,我们只要在类中实现了对应数据类型的构造函数就可以自动调用构造函数进行类型转换,然后产生一个临时对象,再给数组内对象进行拷贝构造,这样就完成了test类型数组的初始化。一般情况下我们不需要去写捕获,因为动态开辟的空间是堆内的空间,而堆内的空间非常大,基本不会出现申请不到的情况。new在申请空间后会调用构造函数完成对象的初始化,delete。异地扩容:给的地址后面没有足够的空间开辟一个连续的空间。在申请的空间上执行构造函数,完成对象的构造。原地扩容:给的初始地址后面有足够的空间。原创 2024-11-22 21:07:06 · 839 阅读 · 0 评论 -
c++:模板初阶
我们思考一个场景:现在我要实现两个数据的数值交换,那我是不是要根据要交换的数据类型写不同的交换函数,如果我有很多种类型的数据需要交换,那就要写很多个代码很相似,只有数据类型不同的函数了。这里我们写了一个交换函数的函数模板,template 那一部分是负责制定泛型数据类型的,下面是函数主体,当泛型实例化后就会用具体类型替换泛型。我们不指定具体的实例化类型,编译器就会隐式实例化模板,根据传的参数推演出对应类型的函数。这里没有指定具体的数据类型,属于隐式实例化。,对于字符类型也是如此。原创 2024-11-22 22:31:31 · 469 阅读 · 0 评论 -
c++:STL:string
我们看到这里的c和f是不同的类型,所以我们在同一行声明他们的时候auto会识别第一个变量c的类型,也就是整形(相当于 int a = c, b = f),然而f是double类型的,所以会报错。原创 2024-12-17 10:59:30 · 1283 阅读 · 0 评论