C++
文章平均质量分 96
南猿北者
热爱生活,热爱编程
展开
-
C++智能指针
什么是智能指针?原创 2023-07-13 21:24:27 · 534 阅读 · 3 评论 -
C++特殊类设计
一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理.原创 2023-07-14 23:06:30 · 244 阅读 · 5 评论 -
C++异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。原创 2023-07-05 00:15:39 · 197 阅读 · 8 评论 -
C++11
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。原创 2023-06-05 13:50:41 · 619 阅读 · 6 评论 -
位图和布隆过滤器
可是要是我们借用一下哈希函数的思想,利用一个哈希函数将我们的自定义类型转换成整数,然后再根据哈希函数转换出来的整数来与位图建立间接映射呢?是不是自定义类型就能使用位图结构了?理论上是可以的,但是既然我们都用哈希函数了,那么必然会存在哈希冲突啊,也就是说一定会有多个自定义类型对应同一个哈希地址,我们该如何减哈希冲突?1、设计一个极其强悍的哈希函数,使其产生哈希冲突的概率极小;但是这往往都需要数学造诣颇高的大佬;2、给一个自定义类型用多组哈希函数进行映射,那么一个自定义类型就会得到多组哈希地址!原创 2023-05-28 22:00:50 · 1016 阅读 · 6 评论 -
手撕哈希表
如果我们真的这样做的话,效率极低不说,我们原本的元素本来就在自己合法的位置,可是经过我们这么一挪动,Key值与哈希地址的关系就全被破坏掉了,比如上面的98,当我们想要查找98时,根据哈希函数计算出来的哈希地址就是8,那么我们从该哈希地址处开始查找,可是都找到空了我们都没有找到98,这次查找就会失败,但是实际上98是存在于哈希表中的!可是我们真的需要进行尾差吗?因为,我们解决哈希冲突的手段就是不断的去抢别人的位置,可是当正主来了的时候,发现自己的位置被别人占着,它有会去占别人的位置,如此恶性循环……原创 2023-05-18 13:13:37 · 741 阅读 · 8 评论 -
手撕红黑树
节点有了,我们再来把红黑树这个结构也定义一下吧:insert为了表述方便,我们就用parent表示父节点;cur表示插入节点;grandfather:表示爷爷节点;uncle:表示叔叔节点;综上所述,也就这三种大情况,同时通过上面的讨论为我们可以知道,对于uncle不存在/uncle存在且为黑这两种情况来说处理方法是完全一样的,我们可以合并为一起处理,这样的话,最终的情况也就变为了2种,下面是代码实现,可能有点略有不同(博主主要是跟着STL的新式保持一致,看不懂的地方可以去查手册,但是大体逻原创 2023-05-12 15:29:25 · 1239 阅读 · 14 评论 -
手撕AVL树
在插入节点过后parent节点的_bf变为了-2或2,那么说明在插入节点之前,parent节点的平衡因子一定是-1或1(证明方法与前面无异),那是不是说明,在插入节点前后,parent这课树右子树-左子树的高度由-1或1变成了-2或2,我们在深入挖掘一下,这个插入的节点是不是一定是插在左右子树中高的一颗子树中的!因此,现在我们向一颗AVL树中插入节点,那么势必会导致AVL树中的某些节点的平衡因子发生改变,为了保证插入节点过后,这课树依旧是一颗AVL树,我们需要对相关节点的平衡因子,进行调整;原创 2023-05-01 20:36:19 · 837 阅读 · 45 评论 -
C++多态
就是类的成员函数前面加个virtual关键字修饰,那么这个成员函数就是虚函数!函数名相同、参数类型、个数、顺序不同,同时两个函数需要在同一作用域;函数名相同、函数参数类型、个数、顺序、返回值类型也要相同,两个函数要分别在父类和子类的作用域,两个函数必须是虚函数;函数名相同、函数参数类型、个数、顺序可以不同,两个函数必须分别在父类和子类的作用域;我们可以认为重写是一种特殊的重定义!原创 2023-04-05 18:52:14 · 410 阅读 · 6 评论 -
C++继承
主要是因为编译器帮我们做了隐式类型转换,由于a是double类型的数据,作为int类型的引用b是不能直接引用a的,但是为了完成我们的需求,编译器会自己创建一个int类型的临时变量,然后用a类型的数据来构造这个临时变量,最后在让b引用这个临时变量;在B类的初始化列表,显示的调用父类的构造函数,然后在初始化子类自身的成员变量;因此,我们在利用B类实例化对时,会调用B的默认构造函数,在初始化列表,先初始化父类,于是就去调用父类的默认构造函数,最后在来初始化B类本身的成员变量,因此对于上述代码B b;原创 2023-03-30 14:07:11 · 1161 阅读 · 1 评论 -
C++模板进阶
【优点】模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生增强了代码的灵活性【缺陷】模板会导致代码膨胀问题,也会导致编译时间变长出现模板编译错误时,错误信息非常凌乱,不易定位错误。原创 2023-03-28 13:40:49 · 299 阅读 · 1 评论 -
栈、队列、优先级队列的模拟实现
但是deque有一个致命的缺点:不适合遍历,因为deque迭代器在遍历的时候,会频繁的检测这次遍历是否移动到下一个小段数组中去,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,同时deque特别不适合中间来插入和删除数据,在中间删除和插入数据都需要大量的挪动数据,代价非常大!为了降低调整成本,优先级队列的删除操作的步骤一般都是,交换堆顶元素与堆底元素,然后堆的大小减1,然后再从对顶开始执行向下调整算法调整堆;原创 2023-03-21 17:50:24 · 433 阅读 · 6 评论 -
list模拟实现
迭代器主要有两种形式1、迭代器要么就是原生指针;2、迭代器要么就是自定义类型对原生指针的封装,模拟指针的行为;原创 2023-03-11 20:25:09 · 485 阅读 · 21 评论 -
vector的理解以及模拟实现
vector文档vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是。原创 2023-03-07 23:17:21 · 246 阅读 · 10 评论 -
string类的理解以及模拟实现
因为如果每次都老老实实的完成拷贝和赋值的话(也就是向VS环境下的string)是需要代价的,我们需要完成从另一个空间将数据拷贝到其他空间,这是一个不小的时间消耗,但是g++向这样设计的话,就不需要进行数据的拷贝,只需要完成string内部指针的赋值即可,更加高效!size与length在底层实现上是一样的,早期的string是不在容器之内的,求字符长度是用的length,多出来一个size主要是为了与后面string加入容器队伍过后名称的统一!//重载运算符[]//这是利用assert的方式来检查越界。原创 2023-02-27 14:33:18 · 630 阅读 · 11 评论 -
C++模板初阶
class 类模板名//类成员定义;T * _a;int _top;类模板中的成员函数全是模板函数然后注意此时的Stack不是具体的类,而是编译器根据被实例化的类型生成具体类的模具;同时类模板的成员函数也可以实现在类内声明,类外定义;原创 2023-02-12 20:31:22 · 645 阅读 · 4 评论 -
C/C++内存管理
上面是对于内置类型的内存管理,那么对于自定义类型呢?//向堆区开辟一块空间 A * p = new A;//向堆区开辟一块连续的空间 A * parr = new A [ 5 ];delete p;运行结果:我们可以发现,自定义类型在利用new向堆区申请空间时,会自动调用构造函数来初始化空间,在利用delete释放空间的时候,会自动调用析构函数!原创 2023-02-11 23:53:08 · 793 阅读 · 6 评论 -
类和对象(下)
类和对象(下)原创 2023-02-09 18:48:49 · 541 阅读 · 8 评论 -
类和对象(中)
(不是说返回值类型为void的意思,而是真的没有返回值,连void也不需要)这就是Stack类的构造函数;构造函数是一个。原创 2023-02-08 10:56:36 · 534 阅读 · 8 评论 -
类和对象(上)
/类体:由成员变量和成员函数组成!//注意一定不要忘了";class:定义类的关键字;className: 类的名字,可以随便取!类中的变量被称为类的属性或成员变量;类中的函数被称为类的方法或成员函数;在类中,成员变量可以在任意位置声明!不必按照原来C语言的习惯将成员变量声明在最前面,成员函数在其下面实现!;eg:当我们我们成员函数使用到成员变量时,编译器会去这个类域里面寻找对应的成员变量!而不是从上往下顺序检查,所以不用担心会出现语法错误的问题!1、成员函数在类中定义!原创 2023-02-03 23:09:37 · 640 阅读 · 13 评论 -
C++入门
简单介绍一下C++的入门语法;祖师爷敬上!!!return 0;首先我们先猜一猜这段代码又没有问题?我们可以发现代码出现了错误,很明显最显眼的错误是重定义!,为什么会出现重定义呢?主要是因为在stdlib.h这个文件中包含了rand()这个函数,而我们定义的rand全局变量刚好和这个函数重名了,编译不知道你到底想用这个rand表示什么东西,这个rand符号出现了歧义,编译器不知道怎么处理,为此给我们报出了错误!原创 2023-02-02 21:42:54 · 647 阅读 · 21 评论