
玩转C++
文章平均质量分 94
进入C++的世界
酒鬼猿
这个年纪,怎么能睡的着觉啊~
展开
-
C++进阶(八)--C+11
在2003年C++标准委员会提交了一份技术勘误表(简称TC1),使得C++03这个名字取代了C++98成为C++11之前的最新C++标准名称。但由于C++03主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把这两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准姗姗来迟。原创 2025-03-06 18:33:15 · 928 阅读 · 0 评论 -
C++进阶(七)--STL--bitset(位图)的介绍与基本功能模拟实现
实际在这个问题当中,我们只需要判断一个数在或是不在,即只有两种状态,那么我们可以用一个比特位来表示数据是否存在,如果比特位为1则表示存在,比特位为0则表示不存在。无符号整数总共有232个,因此记录这些数字就需要232个比特位,也就是512M的内存空间,内存消耗大大减少。方式一: 构造一个16位的位图,所有位都初始化为0。方式二: 构造一个16位的位图,根据所给值初始化位图的前n位。方式三: 构造一个16位的位图,根据字符串中的0/1序列初始化位图的前n位。位图的优缺点:优点:增删查改快,节省空间。原创 2025-03-05 16:13:44 · 732 阅读 · 0 评论 -
unordered_map和unordered_set的模拟实现
模拟实现进行编译时极有可能会出现大范围的模板报错,这时及其正常的,调整好心态,寻找bug,模拟实现unordered_map和unordered_ser的思想并不难,但写出来可能会有一堆报错,刚开始运用模板编程的途中会出现一些极小的Bug,我也找了好久,可能只是一个const的权限放的或者缩小,或者是迭代器的返回参数不匹配,模板不匹配,这些都是常有的,需要在运用中解决错误,提高大家模板编程的能力,接下来,我会附加全部代码,当下代码是可以运行的,可能也有一些小问题,欢迎大家评论区指出,一起学习。原创 2025-02-19 17:43:49 · 730 阅读 · 0 评论 -
哈希表实现(C++实现)
为了避免出现这种极端情况,当桶当中的元素个数超过一定长度,有些地方就会选择将该桶中的单链表结构换成红黑树结构,比如在JAVA中比较新一点的版本中,当桶当中的数据个数超过8时,就会将该桶当中的单链表结构换成红黑树结构,而当该桶当中的数据个数减少到8或8以下时,又会将该桶当中的红黑树结构换回单链表结构。与闭散列的哈希表不同的是,在实现开散列的哈希表时,我们不用为哈希表中的每个位置设置一个状态字段,因为在开散列的哈希表中,我们将哈希地址相同的元素都放到了同一个哈希桶中,并不需要经过探测寻找所谓的“下一个位置”。原创 2025-02-11 19:38:47 · 731 阅读 · 4 评论 -
C++(进阶六)--STL--unordered_map和unordered_set
1. unordered_set 是以不特定顺序存储唯一元素的容器,并允许根据其值快速检索单个元素。2. 在unordered_set中,元素的值同时是其键,它唯一地标识它。键是不可变的,因此,unordered_set中的元素不能在容器中修改一次,但是,它们可以插入和删除。3. 在内部,unordered_set中的元素不按任何特定顺序排序,而是根据其哈希值组织到桶中,以便直接通过其值快速访问各个元素(平均平均时间复杂度恒定)。原创 2025-02-09 13:40:15 · 711 阅读 · 1 评论 -
C++(进阶五)--STL--用一颗红黑树封装map和set
需要注意的是,反向迭代器只接收了一个模板参数,即正向迭代器的类型,也就是说,反向迭代器不知道结点的引用类型和结点的指针类型,因此我们需要在正向迭代器当中对这两个类型进行typedef,这样反向迭代器才能通过正向迭代器获取结点的引用类型和结点的指针类型。实际上,上述所实现的迭代器是有缺陷的,因为理论上我们对end()位置的正向迭代器进行--操作后,应该得到最后一个结点的正向迭代器,但我们实现end()时,是直接返回由nullptr构造得到的正向迭代器的,因此上述实现的代码无法完成此操作。原创 2025-02-07 12:46:27 · 1017 阅读 · 0 评论 -
红黑树(C++实现)
我们这里直接实现KV模型的红黑树,为了方便后序的旋转操作,将红黑树的结点定义为三叉链结构,除此之外还新加入了一个成员变量,用于表示结点的颜色。//三叉链//存储的键值对//结点的颜色int _col;//红/黑//构造函数, _kv(kv){}在这里我们可以使用枚举来定义结点的颜色,这样可以增加代码的可读性和可维护性,并且便于后序的调试操作。//枚举定义结点的颜色RED,BLACK为什么构造结点时,默认将结点的颜色设置为红色?原创 2025-02-05 13:57:11 · 818 阅读 · 1 评论 -
AVL树(C++实现)
我们这里直接实现KV模型的AVL树,为了方便后续的操作,这里将AVL树中的结点定义为三叉链结构,并在每个结点当中引入平衡因子(右子树高度-左子树高度)。除此之外,还需编写一个构造新结点的构造函数,由于新构造结点的左右子树均为空树,于是将新构造结点的平衡因子初始设置为0即可。//三叉链//存储的键值对//平衡因子(balancefactor)int_bf;//右子树高度-左子树高度//构造函数,_kv(kv),_bf(0){}原创 2025-01-19 17:13:41 · 1096 阅读 · 3 评论 -
C++进阶(四)--set和map的介绍与使用
set类的模板参数• T就是set底层关键字的类型• set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模版参数• set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参 数。• ⼀般情况下,我们都不需要传后两个模版参数。1.存储特性:set是按照一定次序存储元素的容器,它会自动对元素进行排序。例如,对于存储整数的set,元素会按照升序排列;对于存储自定义对象的set,需要定义相应的比较函数(仿函数)。原创 2025-01-15 15:13:04 · 834 阅读 · 3 评论 -
二叉搜索树
找N左⼦树的值最⼤结点R(最右结点)或者N右⼦树的值最⼩结点R(最左结点)替代N,因为这两个结点中任意⼀个,放到N的位置,都满⾜⼆叉搜索树的规则。替代N的意思就是N和R的两个结点的值交换,转⽽变成删除R结 点,R结点符合情况2或情况3,可以直接删除。为了在实现其他接口的过程中方便随时检查,最好实现一个二叉搜索树的中序遍历接口,当我们对二叉搜索树进行一次操作后,可以调用中序遍历接口对二叉搜索树进行遍历,若二叉搜索树进行操作后的遍历结果仍为升序,则可以初步判断所实现的接口是正确。原创 2025-01-11 21:36:27 · 1015 阅读 · 1 评论 -
C++进阶(三)--多态
通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态),这⾥我们重点讲运⾏时多态,编译时多态(静态多态)和运⾏时多态(动态多态编译时 多态(静态多态)主要就是我们前⾯讲的函数重载和函数模板,他们传不同类型的参数就可以调⽤不同的 函数,通过参数不同达到多种形态,之所以叫编译时多态,是因为他们实参传给形参的参数匹配是在 编译时完成的,我们把编译时⼀般归为静态,运⾏时归为动态。public:// 调用 int add(int, int)原创 2024-12-30 13:33:15 · 670 阅读 · 1 评论 -
C++进阶(二)--继承
继承(inheritance)机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段,它允许我们在保持原有 类特性的基础上进⾏扩展,增加⽅法(成员函数)和属性(成员变量),这样产⽣新的类,称派⽣类。继承呈现了⾯向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的 复⽤,继承是类设计层次的复⽤。原创 2024-12-24 22:55:29 · 880 阅读 · 0 评论 -
C++进阶(一)--模板进阶
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有 目标文件链接起来形成单一的可执行文件的过程称为分离编译模式模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。增强了代码的灵活性。模板会导致代码膨胀问题,也会导致编译时间变长。出现模板编译错误时,错误信息非常凌乱,不易定位错误。本篇博客到此结束,欢迎评论区留言~原创 2024-12-03 23:08:22 · 706 阅读 · 0 评论 -
C++初阶(十九)--STL--priority_queue的使用及模拟实现
priority_queue的介绍优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中的元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。注意: 默认情况下priority_queue是大堆。使用vector作为底层容器,内部构造大堆结构。使用vector作为底层容器,内部构造小堆结构。不指定底层容器和内部需要构造的堆结构。在C++中,仿函数是一种使用对象来模拟函数的技术。原创 2024-12-03 10:31:39 · 922 阅读 · 0 评论 -
C++初阶(十八)--STL--stack和queue的模拟实现
容器适配器(Container Adapter)是一种设计模式,在 C++ 的标准模板库(STL)中,它是一种特殊的容器。容器适配器本质上是对已有容器进行包装,提供了一种受限的、特定用途的接口,以适应特定的编程需求。STL中的栈和队列适配器通常是基于deque实现的,deque是一个双端队列,它的底层实现较为巧妙,感兴趣的可以自己去看一下,这里就不做讲解了。在stack的类模板声明中我们可以看到有两个参数,第一个是stack中所存储的元素类型,第二个是指定使用的容器类型,默认情况下是deque。原创 2024-12-02 18:00:55 · 438 阅读 · 0 评论 -
C++初阶(十七)--STL--stack和queue详解及使用
在 STL 中,stack是一个容器适配器,它默认使用deque作为底层容器来实现。当然,我们也可以指定使用vector或listint main()//使用默认的适配器// 使用 vector 作为底层容器的 stack// 使用 list 作为底层容器的 stackreturn 0;在 STL 中,queue是一个容器适配器,它默认使用deque作为底层容器来实现。当然,我们也可以指定使用vector或list//默认容器//特定适配器。原创 2024-12-01 21:31:51 · 351 阅读 · 0 评论 -
C++初阶(十六)--STL--list的模拟实现
本篇博客会使用较多的模板编程,模拟实现迭代器,加深对模板编程的理解,这里只实现常用接口的模拟,部分不是很常用的接口用到时在翻阅手册即可,大多接口的使用在中均已提到。所以本篇博客的重点在迭代器的模拟,因为已经在C语言中的数据结构讲解过了。本次我们需要实现三个类,我们经常说list在底层实现时就是一个链表,更准确来说,list实际上是一个带头双向循环链表。因此我们要实现一个list肯定要实现一个结点类,这个结点里面存放着的信息有数据,前一个结点的地址和后一个结点的地址。原创 2024-11-28 16:12:40 · 879 阅读 · 0 评论 -
C++初阶(十五)--STL--list 的深度解析与全面应用
C++ 的标准模板库(STL)中的list是一个功能强大且灵活的双向链表容器,它提供了众多接口函数来满足各种编程需求。在本篇博客中,我们将深入探讨list的所有成员函数,包括一些相对不太常用但在特定场景下非常有用的函数,我们这里只探讨基本的使用,不探讨底层原理,下一篇博客,我们将会模拟实现list。原创 2024-11-24 17:08:00 · 933 阅读 · 0 评论 -
C++初阶(一)--C++入门(上)
初学C++原创 2022-10-10 13:28:31 · 701 阅读 · 1 评论 -
C++初阶(二)--C++入门(引用篇)
引用是C++中对某一变量(目标变量)的别名。通过引用,我们可以直接访问和操作原始变量,而无需通过指针的间接访问方式。在C++中,使用符号来声明引用。其基本语法为:类型标识符& 引用名 = 已存在的变量名;//ra 就是 a 的别名int& x = a;int& y = x;原创 2024-10-06 23:47:14 · 978 阅读 · 0 评论 -
C++初阶(三)---C++入门(下)
内联函数是C++语言中的一种特性,它允许程序员请求编译器将函数的定义(实现)直接插入到所有调用该函数的地方,而不是创建一个新的函数调用栈帧。这意味着当函数被调用时,它的代码会直接嵌入到调用处,而不是跳转到函数定义处执行。以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调 用建立栈帧的开销,内联函数提升程序运行的效率。正常函数调用内联函数调用从这里可以看到内联函数并没有建立栈帧,减少建立栈帧的开销从而提高程序的效率。auto。原创 2024-10-09 18:54:25 · 1028 阅读 · 0 评论 -
C++初阶(四)--类和对象(1)
/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。// 定义一个简单的类class Dogpublic:// 属性int age;// 方法(函数)Woof!int main()// 创建类的对象Dog myDog;// 设置对象的属性// 调用对象的方法。原创 2024-10-11 21:47:30 · 1163 阅读 · 0 评论 -
C++初阶(五)--类和对象(2)--默认成员函数
拷贝构造函数是一种特殊的构造函数,它接受一个同类型的对象作为参数,并用于初始化新创建的对象。类名(const 类名& 形参);这里,ClassName是类的名称,other是传递给拷贝构造函数的参数,它是一个常量引用,以避免不必要的对象复制。原创 2024-10-15 15:09:44 · 1171 阅读 · 0 评论 -
C++初阶(六)--类和对象(3)--运算符重载
在 C++ 中,运算符重载是一项强大的功能,它允许我们为自定义类型重新定义运算符的行为。这使得我们可以像使用内置类型一样使用自定义类型进行各种运算操作,极大地提高了代码的可读性和灵活性。原创 2024-10-24 18:53:45 · 687 阅读 · 0 评论 -
C++初阶(七)--类和对象(4)
友元函数,简单来说,就是在一个类中被声明为 “友元” 的非成员函数。虽然它本身不是类的成员函数,但却可以访问类中的私有成员和保护成员,就好像它是类内部的一员一样。这打破了 C++ 中通常严格的封装原则,为某些特殊的编程需求提供了一种灵活的访问机制。在编程中,当我们使用类型名直接跟上括号并传入实参(如果需要的话)的方式来创建一个对象时,这样创建出来的对象就叫做匿名对象。MyClass(5);例如,在 C++ 中,如果有一个类MyClass。原创 2024-10-29 22:40:04 · 1123 阅读 · 0 评论 -
C++初阶(八)--内存管理
int main()// 动态申请单个类的空间// 动态申请一个A类的空间并初始化为10// 动态申请10个A类的空间,创建 10 个对象//动态申请10个A类的空间并初始化0到9//申请 + 赋值//销毁给一个malloc版本int main()// 动态申请单个类的空间// 动态申请一个 A 类的空间并初始化为 10// 动态申请 10 个 A 类的空间。原创 2024-10-30 22:11:14 · 817 阅读 · 0 评论 -
C++初阶(九)--初识模板
想象你是一个超级厉害的玩具制造商,你有一个神奇的模具。这个模具本身不是一个具体的玩具,但只要你往里面注入不同的材料(比如塑料、橡胶等),它就能生产出各种各样具体的玩具,比如小汽车、小玩偶等。在编程世界里,模板就像是这个神奇的模具。它不是一个实实在在能直接运行的程序部分,但它定义了一种通用的 “形状” 或者说 “框架”,当你给它提供具体的类型(就如同往模具里注入不同材料),它就能生成针对该类型的具体代码,就像生产出不同的玩具一样。原创 2024-11-01 11:50:30 · 850 阅读 · 0 评论 -
C++初阶(十)--初识STL
STL 是 C++ 标准库的一部分,它提供了一系列通用的模板类和函数模板,这些模板都是经过精心设计和优化的,可以用来处理各种常见的编程任务,比如数据存储(像数组、链表、树这些结构相关的事儿)、数据处理(排序、查找等操作)以及算法实现等。简单说呢,就是别人已经帮咱们把很多常用的、好用的代码模板都准备好了,咱们只要知道怎么用就行了。原创 2024-11-05 14:45:43 · 632 阅读 · 0 评论 -
C++初阶(十一)--STL--string类
在 C++ 中,string类是用于处理字符串的标准类。它提供了一种方便、灵活且功能强大的方式来操作字符序列,相较于传统的 C 风格字符数组,string类隐藏了许多底层的内存管理细节,让程序员能够更专注于字符串本身的处理逻辑。string类string();//构造一个空字符串//复制s所指的字符序列//复制s所指字符序列的前n个字符//生成n个c字符的字符串//生成str的复制品//复制str中从字符位置pos开始并跨越len个字符的部分string s1;//构造空字符串。原创 2024-11-07 17:44:38 · 677 阅读 · 0 评论 -
C++初阶(十二)--STL--string类模拟实现
在上一篇中我们了解了string类的各类接口的使用,但是我们作为程序员不仅仅只是会用,还得,因此接下来的内容将一步步的讲解如何模拟实现。原创 2024-11-11 17:56:47 · 943 阅读 · 0 评论 -
C++初阶(十三)--STL--vector的使用
1、vector是表示可变大小数组的序列容器。2、vector就像数组一样,也采用的连续空间来存储元素,这也意味着可以采用下标对vector的元素进行访问。3、vector与普通数组不同的是,vector的大小是可以动态改变的。4、当vector需要重新分配大小时,其做法是,分配一个新的数组,然后将全部元素移到这个数组当中,并释放原来的数组空间。5、vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因此存储空间比实际需要的存储空间一般更大。原创 2024-11-20 18:11:42 · 1029 阅读 · 0 评论 -
C++初阶(十四)--STL--vector的模拟实现
reserve函数的实现思路也是很简单的,先判断所给n是否大于当前容器的最大容量(否则无需进行任何操作),操作时直接开辟一块可以容纳n个数据的空间,然后将原容器当中的有效数据拷贝到该空间,之后将原容器存储数据的空间释放,并将新开辟的空间交给该容器维护,最好更新容器当中各个成员变量的值即可。其次,vector还支持使用一段迭代器区间进行对象的构造。对容器进行析构时,首先判断该容器是否为空容器,若为空容器,则无需进行析构操作,若不为空,则先释放容器存储数据的空间,然后将容器的各个成员变量设置为空指针即可。原创 2024-11-23 17:54:05 · 976 阅读 · 0 评论