C++
文章平均质量分 91
C++语法
哎呀怎么回事^_^
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++_智能指针
智能指针类除了满⾜RAII的设计思路,还要⽅便资源的访问,所以智能指针类还会想迭代器类⼀样,重载等运算符,⽅便访问资源。原创 2025-04-10 15:03:15 · 705 阅读 · 0 评论 -
C++_异常
目录一、异常的概念以及使用1.1、异常的概念1.2、异常的抛出和捕获1.3、栈展开1.4、查找匹配的处理代码1.5、异常的重新抛出1.6、异常安全问题1.71.7、异常规范二、标准库的异常 若是b为0,那么会throw抛异常,先在当前函数域找有无匹配的catch来匹配抛出异常对象的类型,但是这个函数里面的是int,继续在函数链中找,Divide里面也不匹配,编译器直接跳到main函数,匹配,那么打印异常信息;注意,throw之后Divide里面throw后面的都不会执行;当捕获异常时,若是不匹配那么原创 2025-04-06 20:26:44 · 809 阅读 · 0 评论 -
C++11详解
lambda表达式。原创 2025-04-06 16:56:39 · 1152 阅读 · 0 评论 -
二叉树扩展-二叉树进阶算法题
val = val;T _val;原创 2025-03-26 11:26:02 · 742 阅读 · 0 评论 -
哈希扩展-位图、布隆过滤器、海量数据处理
问题:现有40亿无符号整数,需要从中查找一个指定的无符号整数是否存在,你要怎么解决?解法一:遍历这些数据(效率低O(N));解法二:先排序再二分查找(O(N*logN)+O(logN)),看似可行,实则不然:首先先要存放这些整数,一个整数4个字节,总共160亿字节,约为16G的内存,显然不行;解法三:使用位图将数据映射到bit位,这个bit位为1表示存在反之不存在;就算是40亿个不重复的无符号整数,只需要40亿个比特位来映射,也就是4G左右;###测试。原创 2025-03-03 09:29:11 · 1116 阅读 · 0 评论 -
C++ unordered_set、unordered_map哈希使用及其封装
和unordered_set与set差异相同;本身与map使用差不多;unordered_multimap/unordered_multiset跟multimap/multiset功能完全类似,⽀持Key冗余。二、哈希表实现。原创 2025-02-28 19:10:10 · 944 阅读 · 0 评论 -
C++红黑树封装map和set
set里面的key就是value,而map里面的value是pair<key,value>;在封装map和set时,要使用同一个红黑树的类模板去封装,也就是说,红黑树的类模板只有一份;但是两者的value不同,首先对于map来说,传key和value需要两个模板参数,为了兼容map,要求set也传两个模板参数,那么set的value也传key;此时就能保证共用一个红黑树类模板了;但是由于两者数据的不同,数据比较的逻辑也不同;原创 2025-01-08 15:15:45 · 938 阅读 · 0 评论 -
红黑树的概念以及基本模拟
若uncle存在且为黑色,那么cur一定不是新插入的红色节点,而是cur下面的节点通过变色变上来的红色节点,否则parent的左右子树黑色节点的数量就不同,违反规则;由于每条路径的黑色节点的数量的个数相同,极端情况下最短路径的长度就是全是黑色节点的数量,最长路径长度就是红色黑色相间的路径,那么恰好就是最短路径的二倍;双旋的原因:不同于单旋,当parent是grandfather的左节点但是cur是father的右节点时,单旋不能解决问题,若是单旋,只是交换了左右位置,本质上还是没有完成规则的维护;原创 2024-11-27 22:07:03 · 786 阅读 · 0 评论 -
C++map基本概念和接口
##map和set很多地方相似,最大的不同就是map中存放的不仅仅是key,还有value;使用map时,一般都是通过key去寻找value;原创 2024-11-10 20:44:43 · 1280 阅读 · 0 评论 -
C++AVL树
先看图中前两个旋转:e和f的位置最终是固定的,当插入到e时,e的父节点的平衡因子是一种情况,但是插入到f时,e的父节点的平衡因子又是另外一种情况,而这种差异的产生是因为插入的位置不同,也就是当前节点的右子树根节点的平衡因子的不同;为了解决这个问题,需要提前记录当前节点的的右子树节点的平衡因子(单旋会改变这个节点的平衡因子,不记录最后判断有误),旋转完之后,通过判断这个平衡因子的不同来手动给这三个关键节点的平衡因子置值,其他的节点的平衡因子没有变化;之后让5这个节点的父节点指针和10这个节点的父节点链接。原创 2024-11-17 16:47:28 · 765 阅读 · 0 评论 -
二叉搜索树
这里的性能指的是在树里面找指定值的节点;根据左子树节点值小于根节点,右子树值大于根节点值,每次判断指定的值大于还是小于根节点的值,来实现往左子树走还是右子树走并且向下遍历了;这里介绍的是key带着一个value的情况,key不能被修改,找到key就找到value;value是和key相关的;相比于普通的二分查找,平衡二叉树具有的优势就是不会被限制于下标的固定形式去查找;实现的代码:只需要将节点的成员变量加上一个value;上面的平衡二叉树是Key的搜索场景,找的是key;原创 2024-11-06 20:32:48 · 961 阅读 · 0 评论 -
C++-set的基本概念和接口
set是存储数据的容器,它的存储数据的规则按照红黑树的规则;左子树的节点数据都小于根节点的数据,右子树的节点数据都大于根节点的数据大小;class set;T是set底层的关键字类型;set默认支持的是小于的比较,less,可以传greater;set底层存储的数据的内存是从空间适配器中申请的,可以自己实现内存池,那么就传给第三个参数;一般来说,我们不需要传后面的两个参数底层是红黑树,增删查的时间复杂度是O(logN);原创 2024-11-08 20:17:48 · 1081 阅读 · 0 评论 -
C++ 多态原理
用一个题目引入:现有代码:32位平台上输出的是12,按照我们之前学习的内容可知,类的大小实际上按照对齐规则计算类中成员变量的大小,那么这里应该是8;输出12的原因:类含有虚函数,那么会类中会有一个指针(_vfptr),这个指针是一个指向函数指针数组的指针,也叫虚函数表指针或者虚表指针;指针的大小是4,指针指向一个数组,数组里面存放的是虚函数的地址,这个数组至少存放一个虚函数的地址;这个指针不一定放在成员变量前面,这个根据平台而定;在满足多态条件之后,程序运行到指向的对象的虚表中找到对应函数的地址进行调原创 2024-10-30 16:44:15 · 485 阅读 · 0 评论 -
C++ 多态使用详解
必须是成员函数。原创 2024-10-30 12:16:01 · 987 阅读 · 0 评论 -
C++-继承
可以把基类当作派生类中的一个自定义类型的属性,这个属性和string类似要调用自己的默认成员函数。原创 2024-10-27 19:12:53 · 2506 阅读 · 0 评论 -
C++模板进阶
之前学到的模板是类型模板,也就是模板参数都是代表的类型,但是非类型模板参数可以是具体的值,并且非类型模板参数的值是在编译阶段就要确认;非类型模板参数值得注意的几点:非类型模板参数的不能是类类型、字符串、浮点型(浮点型只有C++20版本之后支持)非类型模板参数可以给缺省值;当模板参数有缺省值,可以不传参,并且也确实没有传参时,要在实例化对象后面加上<>,这样适应各种版本的写法(不加<>只有C++###代码示例:非类型模板参数不能是浮点型,除非是C++20版本的;非类型模板参数不能是类类型;原创 2024-10-20 20:49:44 · 1102 阅读 · 0 评论 -
C++容器适配器1-基本使用(stack、queue)
##适配器意思是可以将一种不能用于某种场景的东西经过特殊转换,包装成一个新东西,这个新定西可以用于这个场景,并且还具有之前旧东西的功能作用;stack、queue就是C++里面的容器适配器,这两个适配器堆vector和list两个容器进行了包装,具有vector和list的特性;deque相当于一个缝合怪,具有list和vector的特性,所以在标准库中,stack和queue都是将deque作为包装的缺省类型,至于怎么包装的,后续介绍,现在只用记得deque具有vector和list的各有的特性。原创 2024-10-14 22:46:00 · 451 阅读 · 0 评论 -
C++容器适配器的模拟实现-stack、queue、priority_queue
##容器适配器是将容器转换到其他容器自身不方便使用的地方,但是就容器适配器其本身还是包装的容器,所以这个类模板中各个接口的实现都是调用的容器的接口,因为容器适配器可能适配多个容器,所以这个类模板的模板参数中有一个参数是代表容器类型的,方便传参过来能及时改变;原创 2024-10-16 11:09:02 · 820 阅读 · 0 评论 -
C++-list模拟实现
##模拟实现list需要先看源码,了解基本的结构和设计思路###list底层是双向链表,每一个节点包含数据域和两个指针(一个指向后一个节点,一个指向前一个节点),并且list带有一个哨兵位;###链表的结构的实现并不困难,这里阻碍实现的是迭代器;像string和vector底层结构是连续的,可以直接++、--、+几、-几来实现随机访问每一个数据,它们的迭代器的实现(迭代器的基本操作)也容易,但是list底层双向指针不能++、--来访问到下一个数据,这个时候要单独封装一个迭代器类模板实现需要的迭代器;原创 2024-10-13 19:13:12 · 1109 阅读 · 0 评论 -
C++-vector模拟实现
##vector底层相当于是数组,查看源码可以发现,这个类的私有成员变量是三个迭代器;在实现时迭代器就可以当作是vector里面的元素的指针类型;###vector是一个类模板,实现时也应当按照这样的写法用一个模板去实现,类模板vector中数据类型是T;_start指向vector的开始地址,_finish指向vector的有效元素的结束地址,_end_of_storage指向vector最大存储数据的地址;原创 2024-10-03 16:23:13 · 888 阅读 · 0 评论 -
C++-list使用学习
emplace_back也是尾插数据,但是可以直接传值去尾插,这样省去来拷贝构造的步骤,有一点优化;而push_back不能直接传值去初始化;list<A> l1;list<A> l2;//可以直接给值。原创 2024-09-27 09:29:04 · 1290 阅读 · 0 评论 -
C++ vector的使用
##vector介绍:vector是C++中引入的类模板,这个模板相当于顺序表,里面可以存放不同类型的数据,同时实现了多个接口去完成对vector对象的各种操作;基本使用方式:#include<vector>//包含头文件//展开头文件中的命名空间int main()//定义一个vector对象,这个对象存放的是int类型的数据;原创 2024-09-16 13:01:07 · 2087 阅读 · 0 评论 -
C++string模拟实现
C++中的string相当于是一个类模板,包含在头文件string中,具体实现在这个头文件中名为std的namespace中,所以一般在直接使用string时,展开std;那么模拟实现string时,首先要将实现的内容放在一个自己定义的命名空间里面,在这个命名空间里面再定义自己的string类;这里实现string吗,模板的主要接口功能。原创 2024-09-14 17:29:40 · 1605 阅读 · 0 评论 -
C++ string类—容量、元素获取
这些成员函数是获取string类里面的元素的;原创 2024-09-01 20:55:50 · 841 阅读 · 0 评论 -
C++ string类—构造、遍历、迭代器
## string是C++中的一种类,在标准库中的;可以直接对字符串进行一系列操作。原创 2024-08-27 19:24:06 · 1257 阅读 · 0 评论 -
C++内存管理
int main()//动态申请一个A类型的空间//动态开辟一个A类型的空间并且传参初始化//释放空间delete p1;delete p2;return 0;对于内置类型,使用new(delete)或者malloc(free)都是一样的;原创 2024-08-21 20:43:20 · 1022 阅读 · 0 评论 -
C++模板初阶
##引言:写一个交换的函数Swap,形参的类型会因为传入的实参的不同而需要改变,这样在频繁使用交换函数并且传入的实参的类型不同时会很麻烦,要写很多重载函数。而重载函数较多时会出现代码复用率较低和可维护性较低的问题;在C++里面引入了模板的概念,模板可以用来实例化函数,让函数的形参类型根据实参的不同来生成,这样,利用一个函数模板就可以频繁操作不同类型的实参了。模板是泛型编程的基础(泛型编程是与类型无关的通用代码,是代码复用的一种手段)原创 2024-08-24 17:49:30 · 873 阅读 · 0 评论 -
C++ string类—string修饰符、操作、非成员函数
这个成员函数给一个string类类型的对象进行追加,在现有的string后面追加string类、字符串或者字符;原创 2024-09-01 16:50:50 · 1103 阅读 · 0 评论 -
C++类和对象(3)
/初始化列表//1、初始化了,正常初始化//2、没有初始化//a、调用缺省值去初始化//b、没有缺省值:// x、对于内置类型,初始化的值随机// y、对于没有默认构造的自定义类型,编译出错//3、没有默认构造的自定义类型、const修饰的类型、引用类型必须在初始化列表初始化若是初始化列表里面成员变量后面的括号里面就是一个具体的值,那么就用这个值;若是初始化列表里面写这个成员变量,那么就调用成员变量声明处的缺省值;原创 2024-08-16 07:32:50 · 600 阅读 · 0 评论 -
C++类和对象(2)——const 成员函数、 取地址运算符重载
const放在成员函数参数列表后面进行修饰,那么这个成员函数就是const成员函数;const实际修饰的是成员函数形参中包含的this指针的形参,表明在这个成员函数内部不能对成员进行修改。例如日期类里面的Print成员函数,它的形参是Date* const this,用来接收实参&d,那么在这个Print函数参数列表后面加上const,Print函数隐含参数就成了 const Date* const this,那么就不能通过这个this指针来改变指向的对象的数据成员了。原创 2024-08-13 21:29:41 · 1065 阅读 · 0 评论 -
C++类和对象(2)——拷贝构造函数、运算符重载
当运算符作用于类类型时,C++允许我们对运算符进行重载,对其赋予新的意义;当我们直接使用运算符去操作类类型时,编译器会报错,这个时候要使用运算符重载;运算符重载是一个函数,它具有特殊的名称,它的名称是由operator加上普通的运算符构成的,和其他函数一样,这个函数具有类型和返回值以及参数;但是运算符重载这个函数规定必须有一个参数是类类型的参数;运算符重载的运算规则和普通的运算符一样,在运算符被重载之后,它的优先级和结合性和内置类型的运算符保持一致;原创 2024-08-10 21:38:24 · 929 阅读 · 0 评论 -
C++类和对象(2)——构造函数和析构函数
##前言:此文主要介绍C++中的六种默认成员函数;默认的意思就是我们不写编译器会自动生成;这些函数在类里面自动生成;但是我们也可以自己写;学习这几种默认成员函数从两个方面入手:(1)编译器自动生成时,这些函数会做什么?有哪些行为?这些行为是否满足我们的需求?(2)我们自己写时,要怎么写才能满足我们的需求?原创 2024-08-08 19:48:53 · 782 阅读 · 0 评论 -
C++类和对象(1)
类的关键字是class,后面接上我们自己取的一个名称,然后接上{};{}里面是类的主体,花括号后面必须要有分号;类的主体里面为类的成员;类里面的变量称为类的属性或者成员变量,类里面的函数称为方法或者成员函数;C++中的类和C中的结构体定义方式差不多;在C++里面,struct升级成了类,class和struct都可以定义类;同时,C++中的struct和C中的struct有不同的地方:(1)C++中的struct中可以定义函数,C中不行;原创 2024-08-07 20:42:58 · 918 阅读 · 0 评论 -
C++入门基本语法(2)
引用不是新定义一个变量,而是给已存在的变量起一个别名,编译器不会为引用变量开辟内存空间,它和它所引用的变量公用同一块内存空间;引用的写法:变量类型& 引用别名 =变量;别名b和a公用一块内存地址,改变a,b也改变;改变b,a也改变;原创 2024-08-04 19:19:26 · 791 阅读 · 0 评论 -
C++入门基本语法(1)
(1)namespace是一种关键字,后面跟上命名空间的名称,这个名称是我们自己命名的,然后接上{},{}里面是空间的成员,成员可以是变量、函数、或者自定义类型(如:结构体),{}后面不用像结构体那样接上分号 ';(2) namespace本质上是一个域,这个域定义在全局域里面,这个域相当于一堵墙,把域里面的成员包起来,不同的域里面可以起相同名称的不同变量,成员名称如何起不受外面的影响,避免了冲突;(3)namespace只能定义在全局,可以嵌套定义;原创 2024-08-03 19:03:22 · 1051 阅读 · 0 评论
分享