从0开始学习c++
文章平均质量分 83
从0开始学习c++
c++逐梦人
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
红⿊树实现
的根,这样⼦树⿊⾊结点的数量不变,没有连续的红⾊结点了,且不需要往上更新,因为p的⽗亲是⿊⾊还是红⾊或者空都不违反规则。c为红,p为红,g为⿊,u不存在或者u存在且为⿊,u不存在,则c⼀定是新增结点,u存在且为⿊,则。c⼀定不是新增,c之前是⿊⾊的,是在c的⼦树中插⼊,符合情况1,变⾊将c从⿊⾊变成红⾊,更新上。的根,这样⼦树⿊⾊结点的数量不变,没有连续的红⾊结点了,且不需要往上更新,因为p的⽗亲是⿊。分析:p必须变⿊,才能解决,连续红⾊结点的问题,u不存在或者是⿊⾊的,这⾥单纯的变⾊⽆法解。原创 2025-10-03 10:47:35 · 709 阅读 · 0 评论 -
AVL(二叉平衡搜索树)
AVL树是一种高度平衡的二叉搜索树,通过平衡因子(右子树高度减左子树高度)控制在[-1,1]范围内。核心操作包括插入时的平衡因子更新和四种旋转(左单旋、右单旋、左右双旋、右左双旋)。插入时从新节点向上更新平衡因子,若出现失衡(±2)则通过旋转恢复平衡,同时保持搜索树性质。旋转操作会调整节点位置并重置平衡因子,确保树高始终为O(logn),从而保证增删查改的效率为O(logn)。AVL树通过这种自平衡机制,相比普通二叉搜索树具有更稳定的性能。原创 2025-09-18 21:00:03 · 624 阅读 · 0 评论 -
⼆叉搜索树的实现
本文介绍了二叉搜索树的基本概念、性能分析和核心操作。二叉搜索树是一种有序二叉树结构,具有左子树值小于等于根节点、右子树值大于等于根节点的特性。其查找性能在最优情况下为O(logN),最差情况下退化为O(N)。文章详细讲解了二叉搜索树的插入、查找和删除操作,其中删除操作根据节点子节点情况分为四种处理方式,特别是对左右子树均非空的节点采用替换法删除。最后提供了C++实现代码,包含节点结构定义和插入、查找、删除等核心操作的实现逻辑。原创 2025-09-13 14:10:46 · 523 阅读 · 0 评论 -
多态详解(c++)
本文主要介绍了C++多态的概念、实现原理及相关特性。多态分为编译时多态(函数重载和模板)和运行时多态(虚函数机制)。运行时多态需要满足两个条件:基类指针/引用调用虚函数,且该虚函数在派生类中被重写。文章详细讲解了虚函数的重写规则、协变、析构函数重写的必要性,以及override和final关键字的使用。此外,还介绍了纯虚函数和抽象类的概念,以及多态底层实现的虚函数表机制。通过虚函数表指针,对象在运行时能正确调用对应的虚函数,实现多态行为。多态是面向对象编程中的重要特性,能提高代码的灵活性和可扩展性。原创 2025-09-10 20:45:36 · 1215 阅读 · 0 评论 -
模板进阶(c++)
本文主要介绍了C++模板编程中的关键概念和技术。首先讲解了非类型模板参数的使用限制和注意事项。然后重点阐述了模板特化的两种形式:函数模板特化和类模板特化(包括全特化和偏特化),并通过代码示例说明了如何处理特殊类型的情况。接着分析了模板分离编译的问题及两种解决方案。最后总结了模板编程的优点(代码复用、灵活性)和缺点(代码膨胀、编译错误信息不易定位)。文章内容涵盖了模板编程的核心知识点,为理解和应用C++模板提供了系统指导。原创 2025-08-31 11:54:38 · 646 阅读 · 0 评论 -
priority_queue和仿函数
优先队列是一种容器适配器,其第一个元素总是最大的(类似堆结构)。它基于特定容器(如vector/deque)实现,通过随机访问迭代器维护堆结构,自动调用make_heap等算法。底层实现包含仿函数(如Less/Greater)用于元素比较,提供push/pop/top等操作,并通过adjust_up/down维护堆性质。仿函数通过重载operator()实现类似函数的调用行为,相比函数指针更适合模板参数传递,能灵活控制比较逻辑。这种设计既保持了堆的特性,又提供了标准容器的接口。原创 2025-08-23 22:01:30 · 374 阅读 · 0 评论 -
继承详解(c++)
本文介绍了面向对象编程中继承的概念及实现方式。文章首先阐述了继承的定义,指出继承是代码复用的重要手段,可通过派生类扩展基类特性。在C++中,继承方式分为public、protected和private三种,其中public继承最为常用。接着讨论了基类和派生类间的转换规则,强调派生类可赋值给基类指针或引用(切片),反之则不行。文章还详细分析了继承中的作用域问题,特别是同名成员的隐藏规则。最后,重点讲解了派生类中默认成员函数(构造、拷贝构造、赋值运算符和析构函数)的实现要点,强调派生类必须正确调用基类对应函数来原创 2025-09-06 16:09:09 · 1016 阅读 · 0 评论 -
stack,queue以及deque的介绍
本文主要介绍了C++中栈和队列的底层实现。栈和队列作为容器适配器,默认使用deque作为底层容器,因其结合了vector和list的优点:支持高效头尾插入删除和随机访问。文章分析了deque的底层结构,通过中控数组管理多个小数组实现动态扩容,同时详细解读了deque的迭代器设计、插入删除操作原理以及随机访问的实现机制。源码分析展示了deque如何通过计算小数组位置实现高效访问,并解释了初始数据存储在中控数组中间的设计考量,这使得deque成为适配器默认容器的理想选择。原创 2025-08-23 19:46:58 · 525 阅读 · 0 评论 -
list的迭代器
STL中vector和list的迭代器实现方式不同。vector的迭代器可直接用指针模拟,而list需要自定义迭代器类。在list的实现中,通过模板类__list_iterator封装节点指针,重载operator*和operator->来访问数据。list类还定义了两个迭代器类型:普通迭代器和const迭代器,通过模板参数区分。这种设计体现了不同容器底层结构对迭代器实现的影响。原创 2025-08-17 15:34:50 · 216 阅读 · 0 评论 -
vector的实现
主要谈一下reserve,insert与ersert中的问题。原创 2025-08-10 15:15:06 · 205 阅读 · 0 评论 -
string的实现
和拷贝构造的思路一致,只是赋值重载用于修改一个已经存在的对象,需要释放其原本的内存delete[] _str;_str是用来储存字符的数组,_size是数组中字符的个数,_capacity是数组的容量,buff数组后面会介绍。4. 剩余字符处理 :退出循环后,若 buff 中仍有未处理的字符( i > 0 ),则将其追加到 s。先计算要构造的字符串的长度并赋值,再开一个新的空间将其赋值给_str。这是比较麻烦的写法,先开一个和拷贝对象一样大小的空间,再依次赋值。但仍需开新的空间所以二者的效率是一样的。原创 2025-08-11 14:02:40 · 371 阅读 · 0 评论 -
C/C++内存管理
在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[],注意:匹配起来使用。new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是。new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申。就继续申请,否则就抛异常。原创 2025-07-13 11:46:06 · 612 阅读 · 0 评论 -
类和对象(下)
⽆论是否显⽰写初始化列表,每个构造函数都有初始化列表;⽆论是否在初始化列表显⽰初始化成员变量,每个成员变量都要⾛初始化列表初始化;原创 2025-07-06 13:29:10 · 580 阅读 · 0 评论 -
类和对象(中)赋值运算符与取地址运算符重载
除⾮⼀些很特殊的场景,⽐如我们不想让别⼈取到当前类对象的地址,就可以⾃⼰实现⼀份,胡乱返回⼀个地址。运算符函数是成员函数,则它的第⼀个运算对象默认传给隐式的this指针,因此运算符重载作为成员函数时,参数⽐。运算符有两个参数,⼆元运算符的左侧运算对象传给第⼀个参数,右侧运算对象传给第⼆个参数。8.重载<<和>>时,需要重载为全局函数,因为重载为成员函数,this指针默认抢占了第⼀个形参位。注意以上5个运算符不能重载。C++规定,后置++重载时,增加⼀个int形参,跟前置++构成函数重载,⽅便区分。原创 2025-07-01 15:55:48 · 680 阅读 · 0 评论 -
类和对象(中)默认成员函数(构造,析构,拷贝)
但是有资源申请时,⼀定要⾃⼰写析构,否则会造成资源泄漏(默认生成析构函数无法自动释放内置类型成员申请的资源(如动态内存),因此当类涉及资源管理时,必须显式定义析构函数,手动释放资源,避免泄漏。7.如果我们不写,用系统默认的,在类的变量是内置类型并且对初始化无要求(无逻辑要求)时是可以满足的,初始化看编译器。但如果是自定义类型的成员函数会,要求调⽤这个成员变量的默认构造函数初始化,如果这个成员变量,没有默认构造函数那么就会报错。默认成员函数是用户没有显示实现,编译器自动生成的成员函数称为默认成员函数。原创 2025-07-01 12:28:16 · 1187 阅读 · 0 评论 -
类和对象(上)
1.1类定义格式• class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。• C++中struct也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是struct中可以定义函数,⼀般情况下我们还是推荐⽤class定义类。• 定义在类⾯的成员函数默认为inline。public://成员函数。原创 2025-06-29 10:38:50 · 465 阅读 · 0 评论 -
c++入门
3的和结果保存在⼀个临时对象中, int& rd = d 也是类似,在类型转换中会产⽣临时对象存储中间值,也就是时,rb和rd引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥就触发了权限放⼤,必须要⽤常引⽤才可以。(1)inline对于编译器来说只是一个建议,不同的编译器有不同的标准,一般是长度较短的函数才展开,一但函数为递归或长度较长石,展开反而会使运行的代码过长。定义,在使⽤空值的指针时,都不可避免的会遇到⼀些⿇烦,本想通过f(NULL)调⽤指针版本的。原创 2025-06-26 18:56:48 · 292 阅读 · 0 评论 -
详细讲解C++中的引用
但我留了一把钥匙可以访问这个房间,而func()结束后,如果没有再次调用新函数,那我之前住过的房间还是我上次住的原样,x=0,但后来调用了fxxx(),虽然名字不同但基本逻辑相同,又在上次相同的空间,相当于住进了我上次住进的房间,所以x的值会随之改变。比如你身份证上的名字与你的小名。C++中为了避免引⼊太多的运算符,会复⽤C语⾔的⼀些符号,⽐如前⾯的<<和>>,这⾥引⽤也和取地址使⽤了同⼀个符号&。• 引用的实践主要是引用传参,引用作返回值时减少拷贝传参,提高传参效率,改变引用对象同时改变被引用对象的值。原创 2025-05-14 17:05:21 · 1009 阅读 · 0 评论 -
从0开始c++入门
定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。c++中有局部域,全局域,命名空间域,类域。局部域和全局域除了会影响编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。原创 2025-05-12 19:05:18 · 544 阅读 · 0 评论
分享