c++
文章平均质量分 77
一个普通的小白
纸上得来终觉浅,绝知此事要躬行。
展开
-
【C++类型转换】4种类型转换:static_cast、reinterpret_cast、const_cast、dynamic_cast
4种类型转换:static_cast、reinterpret_cast、const_cast、dynamic_cast是为了规范C语言的类型转换原创 2022-12-07 08:00:00 · 769 阅读 · 1 评论 -
【C++】单例模式
一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问(GetInstance),该实例被所有程序模块共享(所以文件都可以访问)。原创 2022-12-06 08:00:00 · 468 阅读 · 3 评论 -
【C++智能指针】智能指针的发展和循环引用的原理和解决
RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源,在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。(就是把原本资源托管给一个类对象)原创 2022-12-04 14:34:40 · 1098 阅读 · 1 评论 -
【C++异常】
首先检查throw本身是否在try块内部,如果是再查找匹配的catch语句。如果有匹配的,则调到catch的地方进行处理。没有匹配的catch则退出当前函数栈,继续在调用函数的栈中进行查找匹配的catch。如果到达main函数的栈,依旧没有匹配的,则终止程序。上述这个沿着调用链查找匹配的catch子句的过程称为栈展开原创 2022-12-03 08:00:00 · 76 阅读 · 2 评论 -
【C++重点语法下】可变参数模板,STL里面的push_back和emplace_back区别 ,包装器function,bind
std::function func4 = &Plus::plusi;静态成员函数可以省略&取地址符号(推荐不省略以免搞混);因为静态成员函数可以使用:类名::静态成员函数使用std::function func5 = &Plus::plusd;普通成员函数不可以使用类名::静态成员函数名类使用;必须要有一个对象来访问,&取地址符号也不可以省略;所以多了一个参数;绑定可以解决多一个参数的问题原创 2022-12-02 08:00:00 · 704 阅读 · 3 评论 -
【C++11重点语法上】lambda表达式,初始化列表
5种捕捉:所有捕捉的变量都是被const修饰的;加mutable就取消了常性;原创 2022-11-30 15:23:39 · 1227 阅读 · 1 评论 -
【C++右值引用】移动构造和移动赋值,万能引用,右值详讲
左值引用右值-- 不能直接引用,但是const 左值引用可以引用右值右值引用左值-- 不能直接引用,但是可以右值引用可以引用move以后左值原创 2022-11-20 06:19:24 · 2069 阅读 · 4 评论 -
【C++布隆过滤器和哈希切分】
步隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结 构,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。此种方式不仅可以提升查询效率,也可以节省大量的内存空间。原创 2022-11-19 08:41:17 · 245 阅读 · 0 评论 -
【C++位图】1. 快速查找某个数据是否在一个集合中 2. 排序(全部插入,遍历一遍) 3. 求两个集合的交集、并集等
1. 快速查找某个数据是否在一个集合中 2. 排序(全部插入,遍历一遍) 3. 求两个集合的交集、并集等原创 2022-11-18 08:00:00 · 1018 阅读 · 7 评论 -
【C++哈希桶(开散列)】
开散列法又叫链地址法(开链法),首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结存储在哈希表中。原创 2022-11-17 08:00:00 · 342 阅读 · 6 评论 -
【C++哈希表】哈希碰撞,线性探测,二次探测 ,荷载因子,闭散列的实现及string需要特化
假如理想的搜索方法:可以。如果构造一种存储结构,通过某种函数()使元素的与它的之间能够建立一一的关系,那么在查找时通过该函数可以很快找到该元素。根据待插入元素的,以此函数并按此位置进行存放对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中按此位置取元素比 较,若关键码相等,则搜索成功该方式即为,哈希方法中使用的转换函数称为,构造出来的结构称为(Hash Table)(或者称)插入579 ,原创 2022-11-09 11:40:22 · 1238 阅读 · 5 评论 -
【C++红黑树】带图详细解答红黑树的插入,测试自己的红黑树是否正确的代码
2.第二种情况,没有uncle或者有uncle且为黑色,有uncle一定是第一种情况变化而来。如果有父亲且父亲为红色说明不平衡,就一直向上调整,直到cur到头节点或者parent为黑色。parent和uncle变为黑色,grandfather变红色。旋转处理:parent在grandfather的左边,这种情况单纯的变色已经做不到平衡了,怎么办?那个相同元素的map的迭代器。,因而是接近平衡的。原创 2022-11-04 09:55:45 · 657 阅读 · 7 评论 -
【C++AVL树】4种旋转详讲
如果还没有元素是一课空树,直接插入即可;如果有元素,按pair的first(key)和比较的节点比较结果为大说明为空的哪个位置在右边,和比较的节点比较的结果小说明为空的哪个位置在左边,如果相等说明已经有这个元素了,二叉搜索树不支持冗余,插入失败返回false;不知道这个已经找到的位置在父节点的左边还是右边,需要判断一下,然后插入元素;插入元素的后那么平衡因子将发生变化,为0说明这个父亲节点左右平衡不会影响其他节点,为1或者-1需要向上调整,为2或者-2说明已经不平衡需要旋转;原创 2022-11-02 08:00:00 · 1100 阅读 · 7 评论 -
【c++set-map使用篇】1insert的奇怪的返回值 2operator[]是一定是随机访问吗?
思路先把数据统计在一个map,再用另一个map把diyigemap的value当做我的key。make_pair,用函数调用构造会不会有效率上的下降?一模一样,multiset和set不同的是,multiset支持。学习map的插入必须先学习pair这个类,为什么?用来表示具有一一对应关系的一种结构,该结构中。作用:例如key为中文,value为英文翻译。, value表示与key对应的信息。优势:关联式容器相较于序列式容器。没有判断且没有这个key,的容器,那么是不是可以用来。一组数据出现的次数呢?原创 2022-10-24 02:30:52 · 1203 阅读 · 12 评论 -
前中后序遍历的非递归实现
前中后序遍历的非递归实现原创 2022-10-19 21:04:02 · 306 阅读 · 1 评论 -
【C++搜索二叉树】1.二叉搜索树概念2.二叉搜索树非递归实现
若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树(任何一个节点都满足左子树都小于头节点,右子树都大于头节点)原创 2022-10-18 20:59:52 · 417 阅读 · 14 评论 -
【c++多态】超详尽,适合新手上手 1.多态的概念2. 多态的定义及实现3.虚函数重写的三个例外4 C++11 override 和 final5. 抽象类6.多态的原理
2.1 虚函数虚函数:即被virtual修饰的类成员函数称为虚函数。2.2虚函数的重写虚函数的重写(覆盖)派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。2.3多态的构成条件必须通过基类的指针或者引用调用虚函数调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写2.4静态多态和动态多态静态多态--函数重载,动态多态--父类指针或引用调用重写虚函数2.5 重载、覆盖(重写)、隐藏(重定义)的对比。原创 2022-10-17 19:12:54 · 247 阅读 · 10 评论 -
【C++多继承】虚继承
虽然虚继承,弥补了菱形继承的坑,但是也付出了很大的代价对象模型更复杂了,学习成本更高有一定效率影响。原创 2022-10-14 11:58:56 · 369 阅读 · 0 评论 -
【C++继承】继承的概念,不可见,切片,派生类的默认成员函数
4.1派生类的构造函数基类的构造函数就是普通类的构造函数派生类继承基类的成员变量,则使用固定格式(Person(name))来调用基类的构造函数有多个成员变量,格式:Person(x1,x2)一定是先调用父类构造函数初始化继承的父类部分,再初始化自己的成员原创 2022-10-09 13:51:14 · 565 阅读 · 1 评论 -
【C++IO流】C++打印浮点数小数点后多少的方法,序列化
建议:1、C++尽量去用cin和cout,能用它就用他2、例子:C++打印浮点数小数点后多少的方法有些oj需要多组测试,要求持续输出?原创 2022-10-08 18:18:58 · 1443 阅读 · 0 评论 -
【C++模板进阶】非类型模板函数,模板的特化,为什么不支持分离编译及解决,按需实例化
必须要先有一个基础的函数模板关键字template后面接一对空的尖括号函数名后跟一对尖括号,尖括号中指定需要特化的类型函数形参表:必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。模板参数分类类型形参与非类型形参。类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。非类型形参,就是用一个常量作为类(函数)模板原创 2022-10-07 15:02:09 · 184 阅读 · 0 评论 -
【C++StackQueue】适配器,仿函数,优先级队列
目录 适配器优先级队列(priority_queue):仿函数 -- 函数对象 这个类的对象可以像函数一样去使用 priority_queue实现 适配器和仿函数 栈和队列的特性:概念:适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总 结),该种模式是将一个类的接口转换成客户希望的另外一个接口(复用);让我们先观察一下库里面queue和stack的实现:适配器:class Compare = less原创 2022-10-06 12:04:21 · 254 阅读 · 0 评论 -
【c++list】list的迭代器实现和一些特殊使用
1.带头双向循环链表的迭代器实现,链表的基础框架(初始化和尾插)2.迭代器,实现迭代器,可读可写和可读的迭代器,解决方法3.list的一些特殊使用,使用数组初始化(通用),迭代器失效原创 2022-09-30 06:13:28 · 941 阅读 · 0 评论 -
【c++vector】vector的实现和深层次的深浅拷贝
T是内置类型(int)或者是浅拷贝自定义类型(date),他们增容和拷贝构造中,使用memcpy是没有问题的;但是T是深拷贝自定义类型(string),他们增容和拷贝构造中,使用memcpy浅拷贝,指向1块相同的空间,是有问题的;STL库里面是类型萃取区分类型(了解):memcpy效率更高(内置类型,浅拷贝自定义类型),遍历+深拷贝自定义类型(string)的赋值运算符重载会,开空间+拷贝构造效率更低(深拷贝自定义类型)原创 2022-09-28 06:34:45 · 1988 阅读 · 0 评论 -
【c++vector】迭代器失效:1意义改变(1.意义改变,2越界访问)2.野指针
步骤:开辟存{1,2,3,4,5}的vector,使用find找到3这个位置pos插入一个30,想使用pos删除3;结论:迭代器失效,pos意义改变了,pos位置是在插入30之前,插入30后,不在指向3而是指向30,导致erase(pos)没有达到删除3的目的,而是删除30; 解决方法: 重新找一遍在删除 步骤:开辟一个{1,2,3,4,5}和{1,2,3,4,5,6}的vector来对照,如果为遍历时值为偶数erase删除掉;结论:理论上最后一个元素的数值为奇数可以遍历,最后一个原创 2022-09-26 22:18:56 · 428 阅读 · 0 评论 -
【c++】string的底层实现
交换函数就近原则,会先找局部的,所以使用类作用域操作符(::);为什么要把_str定义为nullptr,如果不定义那么_str内是随机值,和tmp交换后,出函数tmp生命周期结束,调析构函数清理一块没有权限的空间,不可以;原创 2022-09-23 05:42:37 · 726 阅读 · 0 评论 -
【c++string】拷贝构造和赋值运算符重载的深浅拷贝
浅拷贝会使2个对象的成员变量指向同一块空间1深拷贝解决了两个对象的成员变量指向一块空间的问题。原创 2022-09-19 13:49:48 · 799 阅读 · 0 评论 -
【c++string】string三种遍历,reserve和resize的区别
resize在改变容量时,size也会改变,(resize时改变size会填入‘\0’或者我们输入的字符,后面还是会再次增容)reserve只会改变容量原创 2022-09-19 03:30:08 · 957 阅读 · 0 评论 -
【c++】模板初阶
在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然 后产生一份专门处理double类型的代码,对于字符类型也是如此。原创 2022-09-17 16:50:02 · 78 阅读 · 0 评论 -
【c++】C/C++内存管理
注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会{public:,val(val){}{}private:int val;};int main(){//c malloc只是开空间,free释放空间free(n1);//cpp new针对自定义类型,开空间+构造函数初始化// delete针对自定义类型,析构函数+释放空间delete n2;//不匹配会崩溃return 0;}new的原理。原创 2022-09-17 15:49:07 · 132 阅读 · 0 评论 -
【c++类和对象语法补充】const成员,构造函数的补充,声明缺省值,友元
不能称作初始化,初始化定义应该是只能初始化一次,而构造函数体内可以多次赋值(就像下面代码_day先赋值5再赋值我们给的参数)引用成员变量,const成员变量,自定义类型成员(该类没有默认构造函数)Dates是Time的友元,Time不是Date的友元。,如果B是A的友元,C是B的友元,则不能说明C时A的友元。,const修饰类成员函数,实际修饰该成员函数隐含的。,表明在该成员函数中不能对类的任何成员进行修改。对于单个参数的构造函数,还具有类型转换的作用。友元函数可访问类的私有和保护成员,原创 2022-09-13 19:37:17 · 344 阅读 · 0 评论 -
六大默认函数
特性:析构函数名是在类名前加上字符~无参数无返回值一个类只有一个析构函数,若未显示定义,系统会自动生成默认的析构函数对象生命周期结束时,c++编译系统自动调用析构函数;原创 2022-09-10 11:13:31 · 463 阅读 · 1 评论 -
【c++基础语法】this
void Init(Date* this(隐含),int year, int month, int day)解答:不可以,pa为空指针不能访问成员变量,但是可以访问函数变量;所以Print失败,Show可以。this和函数变量(Init)同是存在,函数变量就是在栈上,函数结束返回给系统。2.可以在成员函数加,即this->_year(1.this指针是隐含的,是编译器在。编译阶段(把代码转换为汇编代码的阶段)加的,我们不能显示在调用和在函数定义加。3.this指针存在栈上,(原创 2022-09-06 11:36:05 · 273 阅读 · 0 评论 -
【面试题】为什么c++支持函数重载,C语言不支持呢
z+函数个数+函数名+函数参数(参考图易懂)汇编:把汇编代码转化为二进制机械代码。1.参数不同 2.参数的个数不同。原创 2022-09-01 19:36:50 · 483 阅读 · 2 评论