- 博客(56)
- 收藏
- 关注
原创 Hash 专题
根据 key 计算 key 在表中的位置的数据结构;是 key 和其所在 存储地址的映射关系;注意:散列表的节点中 kv 是存储在一起的;
2024-09-13 14:21:06
1096
原创 红黑树(RBTree)插入元素旋转详解
首先我们在不考虑颜色的情况下进行旋转演示:左旋转:步骤:把Y的左子树取下,把X右子树取下,让X的右子树等于Y的左子树,Y的左子树等于X,并且让Y成为X父节点的子树,X的父节点为Y。右旋转原理相同:步骤:把X的右子树取下来,把Y的左子树取下来,Y的左子树等于X的右子树,X的右子树等于Y,最后连接父节点,X的父节点等于Y的父节点,Y的父节点等于X。
2024-09-12 16:22:25
466
原创 B-树底层原理
B-树(B-Tree)是一种自平衡的树形数据结构,广泛应用于数据库和操作系统中。它的设计目标是减少搜索、顺序访问、插入和删除操作中比较次数和移动次数,特别适合于磁盘中数据的存储和检索。
2024-09-11 22:25:13
583
原创 redis 基本数据类型—string类型
Redis 中的字符串,直接就是按照二进制数据的方式存储的,不会做任何的编码转换。Redis对于 string 类型,限制了大小最大是512M。
2024-09-10 21:34:45
1384
原创 Redis 常用命令
因为Redis 是按照键值对存储数据的。如图为set的最简单的用法。key和value都是字符串而且不需要加双引号,如果加也可以redis命令中不区分大小写。
2024-08-30 22:50:20
711
原创 浅谈分布式系统
系统中的多个模块被部署于不同服务器之上,即可以将该系统称为分布式系统。如 Web 服务器与数据库分别工作在不同的服务器上,或者多台 Web 服务器被分别部署在不同服务器上。生活例子类比:为了更好的满足现实需要,一个在同⼀个办公场地的工作小组被分散到多个城市的不同工作场地中进行远程配合工作完成目标。跨主机之间的模块之间的通信基本要借助网络支撑完成。
2024-08-22 09:31:53
481
原创 字符串专题——字符串相乘
使用模拟的方法:模拟小学的列竖式运算细节1:高位相乘的时候要补上“0”细节2:处理前导“0”细节3:注意计算结果的顺序。
2024-08-19 16:04:21
278
原创 二分查找专题(总)
通过不断更新左右左右边界,找到目标值。细节问题:1、每次更新都更新到 mid+1 或 mid-1位置。2、循环结束条件为 left < right。3、循环结束需要额外判断。4、防止数组求取mid时值溢出可选用 left + (right - left)/2;
2024-08-16 19:51:33
447
原创 C++ 基础小节4
1.类内操作符重载:将操作符重载为函数;单目运算符: a++;++a;不要参数,操作this,双目运算符: a = b;左操作数 = 右操作数;只要一个参数:this作左操作数,参数作右操作数;返回值要根据要重载的运算符;
2024-08-15 14:57:28
233
原创 二分查找专题——基础二分查找
找到数组的中心值与target比较,如果中心值大于target则证明target有可能在数组的左边(还有一种情况是不存在),反之在数组的右边。重新设置左右边界,折半数组的长度,如此反复,直到中心值恰好为target或者数组长度缩短为1。为1时比较中心值与target(有可能不存在)。
2024-08-14 23:17:37
179
原创 C++ 小节3
1.析构函数:函数名与类名相同,前面有~,没有返回值,不能写void,没有参数;只能有一个,不能重载2.析构函数的作用:主要在对象销毁时释放申请的堆内存,关闭文件,关闭网络连接,关闭数据库连接等;3.析构函数的执行:(不显式调用,自动执行)1) 作用域到了时自动执行析构函数 2) delete,delete[]时自动执行析构函数。
2024-08-13 19:32:31
927
原创 C++ string类详解
1.C++的字符串string,本质是:typedef basic_string string;2.C++中的字符串string与C中的字符串const char *的区别:1) C中的字符串const char *是指针,C++中的字符串string是类.本质是:typedef basic_string string;2) C中的字符串必须有结束符'\0',C++的字符串没有结束符'\0',可以通过string类的size访问字符串的所有内容。
2024-08-12 20:14:36
417
原创 C++ 原子类型(atomic)
原子类型是多线程编程中重要的工具,能够有效地避免数据竞争问题,提高程序的安全性和性能。通过合理使用原子类型和理解内存序,可以编写出高效的并发代码。
2024-08-10 21:33:28
935
原创 C++ 基础小节2
1.常对象: const 类类型 对象名;2.常对象的特性: 1) 常对象的数据成员不能修改 2)常对象不能调用一般函数,只能调用常函数;3)常函数返回的引用必须是常引用3.常函数: 类的成员函数形参列表右边写上const,常函数特性: 常函数不能修改数据成员的值;4.C++的两种特殊重载: 1)常函数重载, 2)操作符重载;5.声明成员函数时尽量将不会修改数据成员的函数设置为常函数,常函数更通用: 因为常函数可以被常对象调用,也可以被一般对象调用;
2024-08-09 19:31:25
509
原创 C++ 基础小节
主要是新增的:asm:用于在C、C++程序中嵌入汇编程序bool wchar_t是C++新增的基本数据类型(10个基本类型)try{}catch(异常类型){} 被动捕获异常class 声明类,在模板中说明类型const:常引用,常对象,常函数const_cast(常类型转换),reinterpret_cast(重定义类型转换),static_cast(静态类型转换),dynamic_cast(动态类型转换):标准类型转换。
2024-08-08 19:53:32
706
原创 滑动窗口专题——将X减到0的最小操作数
题目如图,通过解析题目可知,如果直接进行移除操作难度很大,因为我们不确定是减左边还是减右边,所以我们需要转换一下思维,正难则反,我们可以反着思考一下,本题是从左右两边找到最小的操作次数,那么就相当于我们需要在数组的中间找到最长的子数组,满足这个子数组的和等于数组的总大小减去X的值,如此以来难度就会小很多。
2024-08-01 12:00:00
292
原创 虚函数表和虚函数表指针的创建时机
如果类没有构造函数,编译器会生成一个默认的构造函数,从而为类的vptr初始化。1、调用基类的构造函数,先将基类的虚函数表地址赋值给vptr。对象构造时,在构造函数中将虚函数表指针赋值给对象vptr(对象的起始地址)2、调用子类的构造函数,将子类的虚函数表地址赋值给vptr。编译器发现类中包含virtual关键字修饰的函数就会创建虚函数表。虚函数表的内容在编译器编译的时候已经生成。虚函数表存在于全局数据区的只读数据段中。虚函数表是存放虚函数的地址的数组。
2024-07-26 19:47:22
213
原创 C++ final关键字和override关键字
修饰类:当 final 用于修饰类时,表示该类是一个最终类,不能被其他类继承,这在某些情况下非常有用,比如当你想确保一个类的行为不会被修改时。2. 帮助编译器进行更严格的检查,如果声明为 override 的函数与基类中的虚函数签名不匹配,编译器会报错,从而避免一些潜在的错误。- 修饰虚函数:当 final 用于修饰虚函数时,表示该函数在派生类中不能被重写,这可以防止子类意外或故意地改变父类的行为。在 C++中, override 关键字主要用于明确表示派生类中的函数是对基类中虚函数的重写。
2024-06-19 23:16:28
158
原创 C++ 多态性及其原理
简而言之,多态就是多种形态,对同一件事,不同的对象的处理动作有多种形态。C++ 的多态性有两种,一种是静态多态,一种是动态多态。
2024-06-17 22:09:38
192
原创 C++ 菱形继承问题
通过虚继承的方式来解决菱形继承的问题,虚继承会为基类与派生类之间创建虚基表,编译器通过虚基表指针的偏移找到对应的变量地址,达到访问同一块空间的目的。菱形继承造成的后果有两个:1.造成二义性,二义性就是C的父类有相同的成员,通过C去访问名字相同的成员造成编译器不知道我们具体访问的是B1中的变量还是B2中的变量。菱形继承是因为C++有多继承的特性,如一个类C继承于B1、B2,而B1、B2继承于同一个类A,那么这时A、B1、B2、C之间会产生一种形似菱形的关系结构,这种关系结构称为菱形继承。2.菱形继承的后果?
2024-06-14 19:37:53
245
原创 C++ 设计模式——代理模式
代理模式指代理控制对其他对象的访问,也就是代理对象控制对原对象的引⽤。代理模式的结构包括⼀个是真正的你要访问的对象(⽬标类)、⼀个是代理对象。⽬标对象与代理对象实 现同⼀个接⼝,先访问代理类再通过代理类访问⽬标对象。• 静态代理指的是,在编译时就已经确定好了代理类和被代理类的关系。也就是说,在编译时就已经 确定了代理类要代理的是哪个被代理类。• 动态代理指的是,在运⾏时才动态⽣成代理类,并将其与被代理类绑定。这意味着,在运⾏时才能 确定代理类要代理的是哪个被代理类。
2024-03-05 19:32:43
589
原创 C++ 设计模式——建造者模式
建造者模式是⼀种创建型设计模式,使⽤多个简单的对象⼀步⼀步构建成⼀个复杂的对象,能够将⼀个复杂的对象的构建与它的表⽰分离,提供⼀种创建对象的最佳⽅式。主要⽤于解决对象的构建过于复杂的问题。• 指挥者Director类:统⼀组建过程,提供给调⽤者使⽤,通过指挥者来构造产品。• 抽象Builder类:创建⼀个产品对象所需的各个部件的抽象接。• 具体产品的Builder类:实现抽象接⼝,构建各个部件。• 具体产品类:⼀个具体的产品对象类。
2024-03-05 19:29:48
405
1
原创 C++ 设计模式——工厂模式
抽象⼯⼚模式:⼯⼚⽅法模式通过引⼊⼯⼚等级结构,解决了简单⼯⼚模式中⼯⼚类职责太重的问 题,但由于⼯⼚⽅法模式中的每个⼯⼚只⽣产⼀类产品,可能会导致系统中存在⼤量的⼯⼚类,势 必会增加系统的开销。假设有 A、B两种产品,则开两个⼯⼚,⼯⼚A负责⽣产产品A,⼯⼚B负责⽣产产品B,⽤⼾只知道产品 的⼯⼚名,⽽不知道具体的产品信息,⼯⼚不需要再接收客⼾的产品类别,⽽只负责⽣产产品。⼯⼚⽅法模式每次增加⼀个产品时,都需要增加⼀个具体产品类和⼯⼚类,这会使得系统中类的个数成倍增加,在⼀定程度上增加了系统的耦合度。
2024-03-05 19:13:20
444
1
原创 C++ 设计模式——单例模式
⼀个类只能创建⼀个对象,即单例模式,该设计模式可以保证系统中该类只有⼀个实例,并提供⼀个 访问它的全局访问点,该实例被所有程序模块共享。⽐如在某个服务器程序中,该服务器的配置信息 存放在⼀个⽂件中,这些配置数据由⼀个单例对象统⼀读取,然后服务进程中的其他对象再通过这个 单例对象获取这些配置信息,这种⽅式简化了在复杂环境下的配置管理。单例模式有两种实现模式:饿汉模式和懒汉模式。
2024-03-05 16:45:41
439
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人