自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 位图和布隆过滤器

构造一个16位的位图,所有位都初始化为0。构造一个16位的位图,根据所给值初始化位图的前n位。构造一个16位的位图,根据字符串中的0/1序列初始化位图的前n位。

2024-06-23 19:36:37 666

原创 用哈希表同时封装出unordered_map和unordered_set

/每个哈希桶中存储数据的结构//构造函数:_kv(kv){}//哈希表//哈希结点类型public://获取本次增容后哈希表的大小//素数序列for (i = 0;i++)//插入函数//1、查看哈希表中是否存在该键值的键值对if (ret) //哈希表中已经存在该键值的键值对(不允许数据冗余)//插入失败//2、判断是否需要调整哈希表的大小。

2024-06-21 21:47:07 605

原创 带你认识哈希

顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。搜索的效率取决于搜索过程中元素的比较次数,因此顺序结构中查找的时间复杂度为O(N),平衡树中查找的时间复杂度为树的高度O(logN)。而最理想的搜索方法是,可以不经过任何比较,一次直接从表中得到要搜索的元素,即查找的时间复杂度为O(1)。如果构造一种存储结构,该结构能够通过某种函数使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时就能通过该函数很快找到该元素。

2024-06-19 22:12:48 1015

原创 用红黑树实现set和map的封装

注意,反向迭代器只接收了一个模板参数,即正向迭代器的类型,也就是说,反向迭代器不知道结点的引用类型和结点的指针类型,因此我们需要在正向迭代器当中对这两个类型进行typedef,这样反向迭代器才能通过正向迭代器获取结点的引用类型和结点的指针类型。实际上,上述所实现的迭代器是有缺陷的,因为理论上我们对end()位置的正向迭代器进行--操作后,应该得到最后一个结点的正向迭代器,但我们实现end()时,是直接返回由nullptr构造得到的正向迭代器的,因此上述实现的代码无法完成此操作。

2024-06-13 21:30:53 763 4

原创 红黑树的实现

我们这里直接实现KV模型的红黑树,为了方便后序的旋转操作,将红黑树的结点定义为三叉链结构,除此之外还新加入了一个成员变量,用于表示结点的颜色。//三叉链//存储的键值对//结点的颜色int _col;//红/黑//构造函数, _kv(kv){}在这里我们可以使用枚举来定义结点的颜色,这样可以增加代码的可读性和可维护性,并且便于后序的调试操作。//枚举定义结点的颜色RED,BLACK为什么构造结点时,默认将结点的颜色设置为红色?

2024-06-11 20:14:07 634 4

原创 高度平衡二叉搜索(AVL)树

这里直接实现KV模型的AVL树,将AVL树中的结点定义为三叉链结构,并在每个结点当中引入平衡因子(右子树高度-左子树高度)。除此之外,还需编写一个构造新结点的构造函数,由于新构造结点的左右子树均为空树,于是将新构造结点的平衡因子初始设置为0即可。//三叉链//存储的键值对//平衡因子(balance factor)int _bf;//右子树高度-左子树高度//构造函数, _kv(kv), _bf(0){}

2024-06-09 01:30:54 963 2

原创 STL-set、map、multiset、multimap的介绍及使用

1.set是按照一定次序存储元素的容器,使用set的迭代器遍历set中的元素,可以得到有序序列。2.set当中存储元素的value都是唯一的,不可以重复,因此可以使用set进行去重。3.与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只放value,但在底层实际存放的是由<value, value>构成的键值对,因此在set容器中插入元素时,只需要插入value即可,不需要构造键值对。

2024-06-05 15:17:52 810 2

原创 二叉搜索树的实现

二叉搜索树又称为二叉排序树或者二叉查找树,它可以是一棵空树,或者是具有以下性质的二叉树:1.若它的左子树不为空,则左子树上所有结点的值都小于根结点的值。2.若它的右子树不为空,则右子树上所有结点的值都大于根结点的值。3.它的左右子树也分别是二叉搜索树。例如,这样的一棵二叉树就是二叉搜索树。​在二叉搜索树中,每个结点左子树上所有结点的值都小于该结点的值,右子树上所有结点的值都大于该结点的值,因此对二叉搜索树进行中序遍历(左子树->根->右子树)后,得到的就是升序序列。

2024-06-04 22:15:16 1072

原创 C++多态

多态是指不同继承关系的类对象,去调用同一函数,产生了不同的行为。在继承中要想构成多态需要满足两个条件:1.必须通过基类的指针或者引用调用虚函数。2.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。子类虚函数即使不加virtual依旧构成重写,重写的协变返回值可以不相同,但必须是父子关系的指针或引用。

2024-06-02 16:26:57 800 2

原创 C++继承

在继承当中,父类也称为基类,子类是由基类派生而来的,所以子类又称为派生类。1.很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。2.多继承可以认为是C++的缺陷之一,很多后来的语言都没有多继承,如Java。3.继承和组合※ public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。※ 组合是一种has-a的关系。

2024-06-01 22:18:52 875

原创 STL-priority_queue的使用及其模拟实现

优先级队列(priority_queue)默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中的元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。注意: 默认情况下priority_queue是大堆。

2024-05-29 15:48:39 706

原创 STL-queue的使用及其模拟实现

在C++中,队列(queue)是一种容器适配器,它以先进先出的方式组织数据,其中从容器一端插入元素,另一端取出元素。

2024-05-29 14:50:35 517

原创 STL-stack的使用及其模拟实现

在C++中,stack是一种容器适配器,它以后进先出的方式组织数据,其删除只能从容器的栈顶进行元素的插入与取出操作。

2024-05-29 14:35:47 1205

原创 STL-list的使用及其模拟实现

在C++中,list是一个容器,用于存储一系列元素。与vector和deque等容器不同,list使用带头双向循环链表的数据结构来组织元素,因此list插入删除的效率非常高。

2024-04-21 22:03:42 1207

原创 STL-vector的使用及其模拟实现

在C++中,vector是(STL)中的一种动态数组容器,它可以存储任意类型的元素,并且能够自动调整大小。vector提供了许多方便的成员函数,使得对数组的操作更加简单和高效。

2024-04-20 21:14:36 713

原创 STL-string类的使用及其模拟实现

string 类是 C++提供的用于处理字符串的类,它相比 C 语言中的字符串处理函数更为高级、灵活和安全。string 类提供了丰富的成员函数和操作符,用于处理字符串的拼接、查找、替换、截取、插入等操作。string 类自动处理字符串的内存分配和释放,不会像 C 语言中的字符数组那样容易出现缓冲区溢出等安全问题。使用 string 类能够有效避免许多与字符数组相关的安全漏洞。

2024-04-20 19:57:17 830

原创 Linux下代码的运行

在Windows环境下,我们代码都是在集成开发环境下运行,也就是说代码的编辑、编译、调试、运行都在一个软件上,而在Linux环境下这些都是分开执行的。

2024-02-09 01:20:19 1730 1

原创 Linux环境下的基本指令

最便捷Linux环境就是用云服务器,下载一个远程终端软件进行操作即可。远程终端软件这里我比较推荐XShell软件,下载官网https://www.netsarang.com/products/xsh_overview.html 下载安装的时候选择 "home/school" 则为免费版本。

2024-02-05 18:51:05 634 2

原创 C++泛型编程(模板)

C++中模板又被称为泛型编程,模板分为函数模板和类模板。

2024-02-01 21:12:17 357 1

原创 C/C++内存管理

C/C++程序内存区域划分为五个区/段:1. 栈区又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口 创建共享共享内存,做进程间通信。3. 堆区用于程序运行时动态内存分配,堆是可以上增长的。4. 静态区(数据段)--存储全局数据和静态数据。5. 常量区(代码段)--可执行的代码/只读常量。free(ptr1);free(ptr3);

2024-02-01 19:48:15 1002 1

原创 C++类和对象

大家都知道C语言是面向过程的,那如果想要更加安全地封装我们的代码只对外暴露一个接口,这时就需要通过C++来实现。C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选 择性的将其接口提供给外部的用户使用。C++中类有两种:class(私有类)和struct(公有类)。class的默认访问权限为private,struct为public(因为struct要兼容C)。比如C语言中的结构体定义://struct ListNode是类型int val;

2024-01-29 23:03:48 825 1

原创 十大经典排序算法(超详细)

排序是我们数据结构中不可或缺的算法,也是面试官HR最爱问的问题之一,所以要清楚排序就要明白排序的核心思想是什么,什么样的排序时间和空间复杂度更低,什么情况下用什么样的排序会更优。最常见的就是十大经典排序:冒泡排序、选择排序、堆排序、插入排序、希尔排序、快速排序、归并排序、基数排序、计数排序和桶排序。

2024-01-26 23:45:20 811 1

原创 理解堆和二叉树

理解二叉树之前我们先来了解一下堆,了解堆有助于我们理解二叉树的结构。

2024-01-23 23:00:18 886 5

原创 理解栈和队列

栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。栈分两种:数组栈和链式栈(因为尾删不方便,所以这里我们采用数组栈)我们定义一个结构体:int top;}ST;

2024-01-20 17:25:56 798 3

原创 深刻理解顺序表和链表

顺序表和链表是我们学习数据结构中不可或缺的部分,他们都属于线性表之一。大家在C语言中都学过数组:⼀组相同类型元素的集合而且在内存中存储是连续的。数组也属于顺序表的一种,顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构。顺序表的出现就是为了方便实现增删查改等等操作,大家都用C语言写过简单的通讯录吧,其中用到的就是顺序表。

2024-01-18 23:04:59 912 3

原创 文件读写操作

我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。我们⼀般谈的文件有两种:程序文件、数据文件(从⽂件功能的⻆度来分类 的)。程序文件包括源程序文件(后缀为.c),吗,目标文件(windows环境后缀为.obj),可执行程序(windows 环境后缀为.exe)。根据数据的组织形式,数据文件被称为文本文件或者⼆进制文件。

2024-01-12 13:00:55 941 1

原创 程序的编译链接

_FILE__ //进行编译的源文件__LINE__ //文件当前的行号__DATE__ //文件被编译的日期__TIME__ //文件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义比如://输出的就是路径的源文件语法: #define name stuff就是将源文件中name替换为stuff,需要注意的是#define 定义标识符后面不要加分号,不然也会将分号替换进源代码里面造成错误。

2024-01-12 02:39:45 831 1

原创 C语言结构体

结构体是⼀些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。

2024-01-07 19:10:35 725 3

原创 整数和浮点数在内存中的存储

以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保 存24位有效数字。整数的2进制表示方法有三种,即 原码、反码和补码 三种表示方法均有符号位和数值位两部分,符号位都是⽤0表示“正”,⽤1表示“负”,而数值位最高位的⼀位是被当做符号位,剩余的都是数值位。对于64位(double)的浮点数,最高的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。对于32位(float)的浮点数,最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。

2024-01-07 01:02:12 818 1

原创 C语言库函数的使用

字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包 含 '\0' ),注意函数的返回值为size_t,是⽆符号的。memset函数是用来设置内存的,将内存中的值以字节为单位设置成想要的内容。

2024-01-06 15:49:12 732 1

原创 认识C语言指针

指针是一个地址,一个变量的地址称为该变量的指针,而指针变量是存放地址的变量,指针变量就是地址变量,用来存放地址,指针变量的值就是地址(指针类型名 *指针变量名例如:int a = 10;这⾥pa左边写的是 int* , * 是在说明pa是指针变量,⽽前⾯的 int 是在说明pa指向的是整型(int) 类型的对象。

2024-01-04 19:19:28 910 1

原创 C语言从0开始做扫雷小游戏

game()函数中需要我们去//创建棋盘//初始化棋盘//打印棋盘//设置雷//排查雷。扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,而且扫雷是在一个正方形的棋盘里面进行的,所以我们需要用二维数组(行和列)来存储这些信息。我们需要在9*9的棋盘上布置雷的信息和排查雷,我们⾸先想到的就是创建⼀个9*9的数组来存放 信息。但是如果是9*9的棋盘上布置雷的话后面排查就会造成数组越界的问题,所以我们就在它旁边再加上一圈变成11*11的棋盘来帮助我们进行排雷操作。

2023-12-30 20:49:17 964

原创 C语言分支循环语句

大家好,今天我要说的是C语言中的分支循环语句,c语言结构分三种,顺序,选择和循环。

2023-12-29 17:46:17 349 1

空空如也

空空如也

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

TA关注的人

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