自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(76)
  • 收藏
  • 关注

原创 【优选算法】---前缀和

【代码】【优选算法】---前缀和。

2024-09-08 15:58:56 567

原创 【C++】---STL之用哈希桶模拟实现:unordered_set和unordered_map

将__HTIterator中的_node更改为HashTable指针类型之后,由于在特定的平台上,指针所占的空间是一定的(在Win32平台上是4字节,在64位平台上是8字节),这样可以通过编译。如果我们要用哈希桶对unordered_set和unordered_map进行封装的话,我们面临一个问题那就是 unordered_set传给哈希桶的是K,而unordered_map传给哈希桶的是pair,同样我们之前也遇到过set和map的封装,是用的红黑树。迭代器最重要的部分呢~

2024-09-03 16:00:29 1155

原创 【C++】---哈希算法

简单的说,就是运用->哈希思想,而形成的数据结构!就是找出各个数据对应的储存位置的转换公式!按照这种方法查找不用拿key多次比较,不用像链表2叉树等等那些数据结构进行多次比较才会查找到结果。因此查找的速度比较快。哈希冲突:就是说,不同的数据,通过哈希函数,来计算出它所对应的映射位置的时候,位置相同,就是哈希冲突!比如说这里的10001和11,%10之后,他们所得的值都是1,都应该放在下标为1的位置,这就是哈希冲突!引起哈希冲突的原因:哈希函数设计不合理。

2024-08-27 11:09:59 971

原创 【C++】--- set和map的封装

把红黑树节点定义 由类模板// 这里的 T就是上层set/map第2个形参 传来的类型T _data;由于红黑树不知道上层传的是K还是pair,这是由上层传递的模板参数T决定的,上层是封装我的map和set。private:红黑树的迭代器的本质是对节点指针进行封装,所以迭代器中只有封装红黑树节点指针这一个成员变量。//成员变量。

2024-08-19 18:08:36 924

原创 【C++】---红黑树详解

为什么我们看似亲近,却貌合神离?

2024-08-14 14:00:10 985

原创 【C++】---AVL树详解

由于要实现AVL树的增删改查,所以定义AVL树的节点,就需要定义parent,否则插入节点时,不知道要链接到树里面哪个节点下面。// 结点int _bf;// 平衡因子// 构造函数,_kv(kv),_bf(0)public://构造函数AVLTree(){}return;

2024-08-10 19:01:23 943

原创 【C++】--- STL之 set 和 map

multimap容器与map容器的底层实现一样,也都是平衡搜索树(红黑树),其次,multimap容器和map容器所提供的成员函数的接口都是基本一致的,这里也就不再列举了,multimap容器和map容器的区别与multiset容器和set容器的区别一样,multimap允许键值冗余,即。比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该应该单词,在词典中就可以找到与其对应的中文含义。是最常用的,也是最简洁的!

2024-05-30 23:03:59 1075 20

原创 【C++】---二叉搜索树

二叉搜索树又叫二叉排序数,它或者是空树,或者是具有以下性质的二叉树:比如说:这个数组都可以将它化为二叉搜索树总结:在左子树值比根小,右子树值比根大。 当树走中序遍历时,序列都是有序的。二叉搜索树 的 结构定义:二、二叉搜索树操作(非递归)1.二叉搜索树的查找 (非递归)利用二分查找的方法,借助我们去二叉搜索树中查找节点。查找的时间复杂度:最坏的情况,就是查找高度(h=logN)次,就可以判断一个值在不在节点里面。查找的思路:(2)中序遍历由于根节点_root是私有成员变量,如果在main函数

2024-05-29 22:42:02 1783 39

原创 【C++】---多态

1. 子类必须对父类的虚函数进行重写(重写,包括三同:返回值相同,函数名相同,参数列表相同。协变除外)2. 必须是父类的指针或者引用去调用虚函数,而且被调用的函数必须是虚函数。注意:如果不把析构函数都定义为虚函数的话,可能会发生内存泄漏!1、自己好好想为什么建议把析构函数定义虚函数,防止发生内存泄漏?因为如果所有的析构函数都定义为虚函数之后,它们所有的析构函数就会形成多态的关系,形成多态之后,就会达到我们的期望:delete的时候,子类对象调用子类的析构函数,父类对象要用父类的析构函数。

2024-05-22 22:58:10 1001 38

原创 【C++】---继承

继承机制是面向对象程序设计当中使代码复用的重要手段,它允许程序员,在保持原有类特性的基础上,进行拓展,增加功能,产生新的类,这个新的类就叫做:派生类。继承的出现,呈现出面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们所接触到的复用都是函数的复用,而继承的出现则是体现了:类设计层次的复用。// 基类public:protected:// 派生类:stuprotected:int stu_ID;// 派生类:teaprotected:int job_ID;

2024-05-08 22:04:56 1349 16

原创 【C++】---模板进阶

【优点】1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性【缺陷】1. 模板会导致代码膨胀问题,也会导致编译时间变长3. 出现模板编译错误时,错误信息非常凌乱,不易定位错误好了,今天的分享就到这里了我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!

2024-05-01 15:54:09 1042 10

原创 【LeetCode】---150. 逆波兰表达式求值

(3)代码给定的入参是vector不是string,因为不知道一个操作数有几个项,得用特殊符号比如空格去分割,而示例每项都是一个字符串,vector的类型是string就更方便获取表达式的每一个元素。(2)但是中缀转后缀表达式和中缀表达式不同的就是调整运算符的优先级。

2024-05-01 15:53:34 86

原创 【LeetCode】---剑指Offer 31.栈的弹出压入序列

【代码】【LeetCode】---剑指Offer 31.栈的弹出压入序列。

2024-04-30 21:20:02 271 2

原创 【LeetCode】---15.最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。void push(int val) 将元素val推入堆栈。int getMin() 获取堆栈中的最小元素。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。MinStack() 初始化堆栈对象。

2024-04-30 21:19:22 212

原创 【C++】---STL容器适配器之priority_queue

(1)priority_queen是一种:优先级队列,是一种常见的容器适配器,默认情况下把最大的元素放在第1位。(2)它的底层是用堆实现的,默认情况下是大堆。可以随时插入元素,快速查找到队列中最大的元素。(3)优先级队列从特定容器的尾部弹出,称为优先级队列的顶部。(4) priority_queue的底层容器可以是任何标准容器的类模板,也可以是其他特定设计的容器类。empty( ):检测容器是否为空size( ):返回容器中有效元素个数front( ):返回容器中第一个元素的引用。

2024-04-28 22:17:50 1463 22

原创 【C++】---STL容器适配器之底层deque浅析

stack是一种后进先出的特殊线性数据结构,因此只要具有push_back()和pop_back()操作的线性结构,都可 以作为stack的底层容器,比如vector和list都可以;queue是先进先出的特殊线性数据结构,只要具有 push_back和pop_front操作的线性结构,都可以作为queue的底层容器,比如list。因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,不适合大量的头部和中间插入删除,也不适合大量的随机访问。1、什么是deque?

2024-04-28 22:17:02 1012 7

原创 【C++】---STL容器适配器之queue

(3)底层容器可以是标准容器类模板之一,如可用vector、list可以作为底层容器类,也可以是其他专门设计的容器类,。(1)队列是一种容器适配器,容器适配器说白了,它的底层就是用一个标准的容器来封装实现的。专门用于在FIFO:先进先出,从容器的一端插入,一端删除。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque。(2)队列作为容器适配器实现,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。关注我,让我们一起学习,一起成长吧!

2024-04-27 20:53:51 569 27

原创 【C++】---STL容器适配器之stack

(1)适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个 类的接口 转换成客户希望的另外一个接口。(2)举个例子:比如对于笔记本来说,电源额定电压是220V,而美国电压是110V,为了能在美国使用,必须要用变压器转换电压以匹配美国电压,那么这个变压器就是个适配器。为什么stack和queue不是容器?而叫做容器适配器???(3)虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,

2024-04-27 19:58:43 1160 9

原创 【C++】---STL之list的模拟实现

的重载的时候,我们一定要想清楚到底是对它里面节点的值来判断相不相等,还是说来判断指向这个结点的迭代器指针相不相等。但是链表不一样,物理空间连续所以说我要把这个迭代器进行一个类的封装,然后在里面对他运算符重载(例如:++)我们就可以掌控这个迭代器的行为!对于T&,类模板实例化出两个类,一个是T&类,一个是const T&类,同理,T*也一样。下面这里就是构造了一个迭代器,因为它的返回类型是迭代器,你只要有节点的指针我就可以构造一个迭代器,(2)迭代器有两种,一种是普通迭代器,一种是const的迭代器。

2024-04-25 22:16:32 1043 13

原创 【C++】---STL之list详解

erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代 器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是 没有元素的,那么pos就失效了。因此删除list中任意位置上元素时,vs就认为该位置迭代器失效 了。我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!2、优点:可以在任意位置进行插入删除,插入删除的效率比较高。好了,今天的分享就到这里了。

2024-04-24 15:47:49 855 29

原创 【LeetCode】---118.杨辉三角

【代码】【LeetCode】---118.杨辉三角。

2024-04-23 22:19:04 560 11

原创 【C++】---STL之vector的模拟实现

当我们不写vector的拷贝构造函数,编译器会自动生成一份,但编译器生成的只能完成数据的浅拷贝,然而vector的三个成员变量都是迭代器,也就是指针T*,如果T是内置类型,那么就不会出现问题,2、然后再判断是否需要扩容,如果进行了扩容,那么就需要先保存要插入的pos位置到start之间的相对位置。2、然后再要删除位置的下一个位置定义一个指针,然后从这个指针到结尾的位置的数据依次往前挪动覆盖数据。(2)当resize的大小比原来大,说明空间不够,同时也说明容量可能不够,要判断是否需要申请容量。

2024-04-23 21:38:01 770 10

原创 【C++】---STL之vector详解

vector定义:表示可以动态改变大小的数组序列容器!( vector实际上就是一个顺序表vector的特点:(1)vector像数组一样拥有连续的储存空间来储存元素,因此可以通过下标访问来访问储存的元素。然而还有一点,它不像数组,那就是它可以动态改变其自身的大小,而数组是静态的,它改变其自身大小是容器对容量自动处理的。(2)vector的空间比实际上所需要储存的空间更大一点, vector的尾插尾删的效率更高一点,而在其他位置的插入删除效率相对较低一点,因为每次的插入删除都会挪动后面的数据。

2024-04-22 22:41:56 680 2

原创 【C++】---string的模拟

char要加&,如果不加,那么return就是传值返回,返回的是_str[i]的拷贝,即临时对象,而临时对象具有常性,不能被修改,只能读;string类里面有成员函数:(1)_ str:字符串内容(2)_ size:字符串大小(3)_ capacity:字符串容量、①_size < n <_capacity,无需增容,直接将_size到n位置置为val。,_size最大为申请字节数-1,_capacity最大也为申请字节数-1。②n >_capacity,需增容,并将_size到n位置置为val。

2024-03-21 21:27:48 1193 14

原创 【C++】---string的OJ题

这里要特别回顾一下getline()函数!第1个参数就是:cin第2个参数就是:cin输入内容的变量!直接利用库里面的refind()函数!

2024-03-11 22:27:38 1169 23

原创 【C++】---STL之string详解

什么是STL?STL(standard template libaray-标准模板库):是C++标准模版库C语言中,字符串是以’\0’结尾的一些字符的集合。string是表示字符串的字符串类该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string;不能操作多字节或者变长字符的序列。

2024-03-11 20:18:23 1534 1

原创 【Linux】Shell命令运行原理和权限详解

因此,当一个目录被设置为"粘滞位"(chmod +t),则该目录下的文件只能由(1)超级管理员删除(2)该目录的所有者删除(3)该文件的所有者删除好了,今天的分享就到这里了我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!

2024-03-05 09:31:46 1384 9

原创 【C++】---内存管理new和delete详解

(1)malloc/free是函数,new/delete是操作符(2)malloc申请的空间不会初始化,new可以初始化(3)malloc申请的空间需要手动计算并传递过去,而new只需要在后面跟上空间类型即可。(4)new不需要强转,而malloc需要(5)malloc申请空间之后需要判断是否申请失败,new不需要,但是new需要捕获异常(6)申请自定义类型对象时,malloc/free只会开辟空间,而。

2024-02-26 21:43:01 1407 23

原创 【C++】---static成员(附OJ题)

那么如何对它countA进行定义初始化呢?如果在类内初始化的话,那么会导致每个对象都包含该静态成员静态成员变量 必须在类外定义和初始化的原因:(1)声明不分配内存,只有定义才会分配内存,如果在类内定义静态成员变量的话,那么每个对象进行初始化时都要为静态变量分配一块空间,这样会导致重复定义。(2)静态成员和类处于同一级别普通成员和对象处于同一级别。类级别的成员,应先于类对象的存在而存在,且静态成员变量应被所有类对象共享,所以静态成员变量不能放在类内当对象初始化时才初始化。

2024-02-20 13:59:11 1217 25

原创 【C++】---类和对象(下)初始化列表、explicit、匿名对象、友元

class Apublic:// 构造一次,打印一次~A()// 析构函数int main()A a1(10);A();// 匿名函数 生命周期只在这一行!A a2;A(100);// 匿名函数 生命周期只在这一行!return 0;A无论是类还是全局函数,只要A被定义为B的友元,A就可以访问B的非公有成员。好了,今天的分享就到这里了我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!

2024-02-20 13:58:23 988 3

原创 【C++】实现Date类的各种运算符重载

上一篇文章只实现了operator==操作符重载,由于运算符较多,该篇文章单独实现剩余所有的运算符重载。

2024-02-16 11:31:03 704 20

原创 【C++】---类和对象(中)默认成员函数 和 操作符重载

对于日期类对象,我们可能会忘记调用Init函数进行初始化,C++为了解决这个问题,引入构造函数进行初始化。int _month;int _day;d1.Print();return 0;

2024-02-16 11:20:52 851 8

原创 【C++】---类和对象(上)入门

什么是类的实例化?用 类 创建 对象 的过程!注意:对变量定义成功的标志:该变量在内存中开了空间class Date//private:public:int _year;//这里对变量只是声明!!!声明不开辟空间!int _month;//注意:对变量定义成功的标志:该变量在内存中开了空间int _day;//此处对类进行了定义!D1._year;//为啥不能访问?因为:_year没有定义。

2024-02-16 09:55:41 633 3

原创 【数据结构】排序---C语言版

元素集合越接近有序,直接插入排序算法的时间效率越高时间复杂度:O(N^2)空间复杂度:O(1),它是一种稳定的排序算法稳定性:稳定希尔排序是对直接插入排序的优化。当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。

2024-02-04 18:29:47 1961 42

原创 【C++】---命名空间,缺省参数,函数重载,内联函数等

在C/C++中,变量,函数以及后面C++要学的:类都是大量存在的,这些变量函数和类都存在于全局作用域中,这样可能会导致很多冲突,也就是命名冲突。使用命名空间的目的就是对这些标志符也就是变量函数等名称进行本地化,以此来避免命名冲突或名字污染。于是namespace关键字就应运而生来针对解决这种问题。在定义一个新的命名空间的时候,使用关键字namespace加后面命名空间的名称,然后再接一对{}就可以了,{}里面就是命名空间的成员。缺省参数是声明或定义函数时为函数的参数指定一个缺省值。

2024-02-04 18:25:24 883 9

原创 【数据结构】二叉树---C语言版

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树,是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。有一个特殊的结点,称为根结点,根节点没有前驱结点除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i<= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继因此,树是递归定义的。注意:树形结构中,子树之间不能有交集,否则就不是树形结构节点的度:一

2023-12-02 17:47:12 4271 35

原创 【LeetCode】链式二叉树OJ题---C语言版

3.如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。继续遍历root的左,右子树。首先我们先判断刚开始的root和subroot的根相不相等?如果相等,然后再判断是否是相同的树。关注我,让我们一起学习,一起成长吧!2.如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。1.如果两个二叉树都为空,则两个二叉树相同。

2023-12-02 17:15:35 1215 2

原创 【LeetCode】栈和队列OJ题---C语言版

此题可以用两个栈实现,一个栈进行入队操作,另一个栈进行出队操作出队操作: 当出队的栈不为空是,直接进行出栈操作,如果为空,需要把入队的栈元素全部导入到出队的栈,然后再进行出栈操作。出栈操作相当于非空队列的队尾元素出队,此时需要把非空队列除最后一个元素之外的其余元素入队到空队列,然后出队最后一个队尾元素。我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!此题可以用两个队列去实现一个栈,每次始终保持一个队列为空,入栈操作相当于给非空队列进行入队操作。好了,今天的分享就到这里了。

2023-11-30 10:01:21 760 12

原创 【数据结构】栈和队列---C语言版

(1)将栈的实现可以直接copy进去(返回栈顶元素需要做小小的改动:如果栈为空,不能直接assert断言终止,而要返回’\0’),后面只需要实现括号的匹配即可。如果是左括号,那么入栈,如果是右括号就判断栈顶元素该右括号是否能够匹配,如果可以就从栈里弹出一个左括号,如果不匹配就直接返回false。队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。:栈的删除操作叫做出栈。

2023-11-29 16:24:18 516 6

原创 【数据结构】单链表---C语言版

如何判断链表是否有环:使用快慢指针,慢指针一次走1步,快指针一次走2步,如果链表带环,那么快慢同时从链表起始位置开始向后走,一定会在环内相遇,此时快慢指针都有可能在环内打圈,直到相遇;如果快指针一次走两步,当slow从直线中间移动到直线末尾时,fast又走了slow的2倍,因此当slow进环时,fast可能在环的任意位置,具体要看直线有多长,环有多大。fast一次走3步:假设slow进环的时候,fast跟slow相差N步,环的长度为C,追击时,slow走1步,fast走3步,每走1次,差距就缩小。

2023-11-29 15:08:12 1313 4

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除