自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【C++】布隆过滤器的概念与特点解析

为了方便用户之间的搜索,某应用不允许用户的id重复,现在用布隆过滤器存储着所有用户id的存储情况,用户注册时如果预输入id已存在,则要求更换id(可能预输入id并不存在,但是发生假阳性误判),由于假阴性误判的杜绝,用户的id一定不会相同(已存在的id肯定不会被误判为不存在,而被新用户注册)A与B有一个哈希值7相同,B的删除会使7的bool值置0,这就会导致A被误判为不存在,即假阴性误判,为了避免这种情况发生,布隆过滤器不允许删除元素。频繁的扩容必然导致内存的浪费,那么面对字符串的存储问题,该怎么解决呢?

2024-11-02 15:12:11 1171 24

原创 【C++】位图详解(一文彻底搞懂位图的使用方法与底层原理)

位图只存储数据的状态(即是否存在),而不存储数据本身的值,但是我们仍可以根据位图的位索引位置间接查询到数据本身。比如要记录整数。

2024-11-01 19:01:43 2173 40

原创 【C++】红黑树的Iterator改造以及map&set的模拟实现与封装

前面的博客我们介绍了红黑树的底层原理并手撕了一个自己的红黑树,但是这与库里的红黑树还是差了些意思(博客跳转链接要想实现一个完整的红黑树,我们还得实现迭代器的功能,使其可以访问红黑树的每个节点,方便遍历、修改等操作。实现iterator时,begin和end的定义方式决定了如何遍历树中的元素,那么问题来了,begin和end分别该如何定义呢?我们知道,红黑树是一棵二叉搜索树,它中序遍历的结果是一个有序数列,那么我们可以通过begin获取红黑树中最小的元素,end。

2024-10-31 19:07:31 1654 23

原创 【C++】有关哈希的面试题自测

关于哈希结构的介绍可以看这两篇博客:哈希结构的介绍,哈希冲突的解决办法

2024-10-28 15:34:46 1498 4

原创 【C++】哈希冲突的解决办法:闭散列 与 开散列

上一篇博客提到了,哈希函数的优化可以减小哈希冲突发生的可能性,但无法完全避免。本文就来探讨一下解决哈希冲突的两种常见方法:闭散列和开散列

2024-10-28 14:48:20 1821 3

原创 【C++】unordered关联式容器 与 哈希结构(哈希函数的设计)

在C++98中,STL提供了底层为红黑树结构的一系列关联式容器(set、map、multiset、multimap)在查询时效率可到到 O(logN) ,每次查找都需要比较节点的左右子树,当要查找的数据刚好位于叶子节点处时,就要比较树的高度次,当树的高度较大时,查找效率也不理想。理想的查找效率是:1次就可以将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,它们虽然不能保证每次都能1次找到数据,但是它们需要进行的比较次数比红黑树少的多。

2024-10-27 19:41:14 1464

原创 【C++】红黑树万字详解(一文彻底搞懂红黑树的底层逻辑)

红黑树的底层结构在代码实现中使用节点结构体和数来表示。节点结构体 保存每个节点的数据、指向左右子节点、父节点的指针、以及平衡因子;树类管理插入、删除等操作。// 节点的颜色// 红黑树节点的定义{}// 节点的左孩子// 节点的右孩子// 节点的双亲T _data;// 节点的值域// 节点的颜色在节点的定义中,我们将节点默认颜色给成红色,这是因为如果定义成黑色的话,根据性质4,每一次插入节点都需要重新调整树,而定义成红色,就只需要在父节点也为红色时进行调整,一定程度上保证了插入的效率。

2024-10-24 17:52:52 1644 1

原创 【C++】AVL树(二叉平衡搜索树,超级详细图解底层原理,一遍就会)

AVL树的底层结构在代码实现中使用节点结构体和数来表示。节点结构体 保存每个节点的数据、指向左右子节点、父节点的指针、以及平衡因子;树类管理插入、删除等操作。

2024-10-14 21:36:31 1765

原创 【C++】map详解(键值对的概念,与multimap的不同)

set是一个集合容器,存储的是唯一的元素,元素本身就是它的值,且元素按照某种顺序进行存储。set不允许存储重复元素,常用于去重场景。map是一种键值对容器,存储的是成对的数据(key-value pairs),其中键(key)是唯一的,值(value)可以重复。map主要用于通过键快速访问对应的值。键值对的概念(Key-Value Pair)是指一种数据结构,其中每个数据项都由两个部分组成:键(key)和值(value)。键是唯一的,通过键可以快速找到对应的值。

2024-10-10 18:13:24 1706

原创 【C++】set详解(关联式容器、键值对,与multiset的区别)

关联式容器在之前的文章中,我们介绍过STL中的部分容器,比如:vector、list、deque等等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。也是用于存储数据的,但与序列式容器不同的是,其里面存储的是结构的,在数据检索时比序列式容器效率更高。键值对键值对是一种数据结构,用于存储和表示关联数据。SGI-STL中,键值对通常由std::pair来表示,其中first代表键second。树形结构的关联式容器与。

2024-10-09 20:41:01 1718

原创 【C++数据结构】二叉搜索树(超详细图解操作过程,超详细讲解代码实现)

有一种查找方法,具有极高的查找效率,时间复杂度仅为 O(log⁡n)。在每一步查找过程中都会将搜索范围减半,这就是二分查找。但是在实际应用中,我们并不经常使用二分查找。这是因为它只能在有序数组或有序数据结构上工作,如果数据是无序的,则需要先进行排序;而且它只适用于数组或连续存储的数据结构中。在实际运用中,我们更常用的是二叉搜索树(Binary Search Tree, BST),其查找时间复杂度也是 O(log⁡n),并且拥有高效的插入和删除操作。

2024-07-17 21:15:05 2031

原创 【C++】继承与多态相关11道面试题整理

继承与多态的相关知识点在面试中频繁出现,这里整理了一些常见的面试题,供大家学习参考

2024-07-15 17:38:49 1502

原创 【C++】多态相关(多态的概念、定义及原理,虚函数与虚函数表)

多态是面向对象编程中的一个核心概念,它允许不同类的对象通过相同的接口调用来执行不同的行为。通俗点来讲,就是多种形态,去完成某个行为,当不同的对象去完成时会产生出不同的状态。

2024-07-12 16:40:16 1573

原创 【C++】菱形继承、菱形虚拟继承、继承与组合

不过继承也有用武之地的,有 些关系就适合继承那就用继承,另外要实现多态,也必须要继承。类之间的关系可以用 继承,可以用组合,就用组合。,如上面的继承关系,在student和teacher的继承person时使用虚拟继承,即可解决问题。此时就不存在了对_name访问不明确的问题,因为虚拟继承保证在整个继承层次中只存在一份基类的实例。继承是一种“is-a”关系,表示一个类是另一个类的特殊化。

2024-05-21 16:28:21 879

原创 【C++】继承相关(基类与派生类的继承关系以及细节整理)

如图:我们可以看到,student是子类,也叫派生类,他继承的是父类people,也叫基类,而public是继承方式,继承方式也可以是protected、private,和访问限定符是一样的。使用不同的继承方式继承的基类成员的访问权限是不一样的,具体关系可以看下面这张表:可以看出基类的私有成员在派生类中是不可见的,而其他成员的访问方式取决于基类中成员的访问限定符和继承方式。通常情况下,使用 public继承是最常见的方式,因为它保留了基类的接口,并且派生类可以访问基类的公共和受保护成员。

2024-05-13 18:58:43 2296

原创 【C++】非类型模版参数以及模版的特化

模版参数分为类型参数与非类型参数类型形参:跟在class或typename后面的参数类型名称。非类型形参:可以是整型、指针、引用、枚举等等。模板特化的作用在一般模板无法满足特定类型或特定值的需求时,提供针对特定类型或特定值的定制化实现。

2024-05-08 20:37:33 574

原创 【C++】stack&queue系列力扣刷题日志(232.用栈实现队列、225.用队列实现栈、155.最小栈、牛客JZ31.栈的压入弹出序列、150.逆波兰表达式求值)

熟练掌握stack和queue容器适配器,对解决一些特定问题有很大帮助。以上就是我整理的一些关于栈和队列的oj题解,欢迎在评论区留言,觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~😉

2024-04-29 19:03:54 1643

原创 【C++】stack & queue的介绍使用以及模拟实现

stack的文档介绍stack 是一种容器适配器:它专门用于后进先出(LIFO)操作,例如压入和弹出元素。stack 实现了一种简化的接口,只允许在容器的一端进行元素的插入和提取操作。底层容器的封装:stack 封装了一个底层容器,该容器负责实际存储元素。stack 提供了一组特定的成员函数,用于访问其底层容器的元素,并将特定类作为其底层容器,元素在容器的尾部(栈顶)进行压入和弹出操作。底层容器的要求:stack 的底层容器可以是任何标准的容器类模板或者其他特定的容器类。

2024-04-29 15:37:54 1414

原创 【C++】手撕list(list的模拟实现)

我们在学习数据结构的时候,学过一个非常好用的结构,叫做带头双向循环链表,它不仅遍历非常地灵活方便,而且插入和删除操作的效率很高,弥补了单链表相较于数组的缺点。我们今天要讲的list模版底层就是带头双向循环链表。

2024-04-23 17:37:57 1874

原创 【C++】list的介绍及使用说明

和"std::vector"一样,“std::list”实现不同类型数据的管理也是通过模版类的机制实现的。当创建一个list对象时,可以通过模版参数来指定存储的元素类型。使用""来显式实例化指定存储的元素类型,例如“std::list”表示存储整数类型的链表,“std::list”表示存储双精度浮点型的链表…………return 0;

2024-04-18 21:07:31 1882

原创 【C++】理解vector的底层原理并模拟实现(手撕vector)

但是我们不仅要会用,还要理解它的底层原理,今天我们通过手撕一个自己的vector,来进一步加深对vector容器的理解。

2024-04-03 18:51:11 1872

原创 【C++】vector系列力扣刷题日志(136.只出现一次的数字,118.杨辉三角,26.删除有序数组中的重复项,260.只出现一次的数字 |||)

在实际运用中我们要熟悉vector的常见接口,在合适的场景中使用出来

2024-04-01 15:43:56 1149

原创 【C++】vector的介绍及使用说明(类模版的实现方式,顺序存储与动态数组,迭代器iterator的运用,vector的增删查改)

类模版"std::vector"实现不同类型数据的管理是通过类模版的机制实现的。当创建一个vector对象时,可以通过模版参数来指定存储的元素类型。使用""来显式实例化指定存储的元素类型,例如“std::vector”表示存储整数类型的向量,“std::vector”表示存储双精度浮点型的向量…………return 0;

2024-03-30 21:44:26 2276

原创 【Linux】进程状态(R运行状态、S睡眠状态、D磁盘休眠状态、T停止状态、X死亡状态)

进程的状态会随着操作系统的调度和外部事件的发生而不断地。例如,一个新创建的进程经过初始化后会进入,等待被调度执行;当调度器分配处理器资源给进程时,进程进入;如果进程发起了I/O操作,它可能会进入等待I/O完成;当I/O完成后,它重新回到等待再次执行;当进程执行完毕或被终止时,进程进入。进程状态的合理转换是操作系统正常运行的基础,也是实现多任务并发的关键。下面我们来理解进程的各个运行状态。

2024-03-27 22:07:39 3541

原创 【Linux】理解父子进程(系统调用创建进程,fork函数,写时拷贝)

父子进程是操作系统一个重要的概念,特别是在多任务处理和并发编程中,在Linux中,每个进程都有一个唯一的进程ID,并且每个进程都有可能。当一个进程创建了一个新的进程时,新创建的进程就成为了原始进程的子进程。同样用生活中的例子来理解。在一个家庭中(类比一个操作系统中),父母决定做晚饭(做饭就是一个进程),他们分配给孩子一个任务,让大儿子洗菜,小儿子烧水(洗菜和烧水就是两个子进程),父母和孩子之间相互协作,共同完成了这一顿晚饭,这就是父子进程之间和任务的特性。

2024-03-27 19:14:54 1022

原创 【Linux】进程的基本概念(进程控制块,ps命令,top命令查看进程)

程序就像是一本菜谱,描述了如何准备一道菜的步骤、所需的食材以及烹饪方法,但它本身并不会做任何事情;而进程则是根据菜谱准备食物的实际过程,它是程序在执行过程中的动态实例。就像你可以同时烹饪多道菜一样,操作系统可以同时执行多个进程,每个进程都在独立地执行它们的指令,拥有自己的资源和状态。

2024-03-25 17:57:38 1625

原创 【Linux】调试器-gdb的使用说明(调试器的配置,指令说明,调试过程说明)

在软件开发中,通常会为程序构建两种不同的版本:Debug模式和Release模式。它们之间的区别主要在于优化级别、调试信息、错误检查等方面

2024-03-21 11:47:48 2158

原创 【Linux】如何使用git命令行与远程仓库建立连接(以Gitee为例)

私有仓库是指代码仓库的访问权限受到限制,只有授权的用户才能访问其中的代码。私有仓库的所有权和访问权限由仓库的所有者控制,可以决定谁可以访问、修改和管理仓库,以确保代码的安全和保密性。添加该文件的主要目的是避免将不必要的文件提交到代码仓库中,从而保持仓库的清洁和安全。在软件开发中,设置模版指的是创建预定义的文本模版,用于规范化和简化团队成员在创建新的文档、问题等操作。开源仓库是指存放在公共平台上的代码仓库,其代码是公开可见的,任何人都可以查看复制修改仓库中的代码,也可以向仓库提交贡献。此时直接输入":q!

2024-03-20 17:29:06 2048 1

原创 【Linux】项目自动化构建工具-makefile/make

是一个特殊的目标名称,表示后续声明的目标都是伪目标,而不是实际文件。main是目标文件,就是使用make指令所生成的文件,main.o,utils.o是依赖文件,目标文件的形成依赖于这两个文件,通过指定的命令实现构建。text.c是我们想编译运行的源文件,我们在Makefile中已经定义好了构建规则和依赖关系,此时输入。此外,在Makefile中,可以使用‘$@’来表示目标文件,使用‘$^’来表示依赖文件。这里执行指令后,指令是会显示在终端的,如果想隐藏指令,可以在前面加上‘@’

2024-03-19 20:11:57 1304

原创 【Linux】编译器-gcc/g++的使用(预处理、编译、汇编、连接)

gcc [选项] 要编译的文件 [选项] [目标文件]

2024-03-19 19:10:24 1414

原创 【Linux】文本编辑器Vim(Vim的操作方法、命令集,Vim插件安装配置)

Vim(Vi IMproved)是一款强大的文本编辑器,是Unix系统中经典的Vi编辑器的增强版本。它在功能和灵活性方面超越了传统的Vi,并成为了许多开发者和系统管理员首选的编辑器。:Vim具有不同的工作模式,包括Normal模式、Insert模式、Visual模式等。每个模式下,按键的功能和行为都不相同。这种设计使得编辑过程更高效。:Vim可以通过编辑配置文件(.vimrc)来定制各种行为和快捷键。用户可以根据自己的喜好和需求进行个性化设置,以满足自己的工作习惯。

2024-03-09 17:29:18 2346

原创 【Linux】软件包管理器yum(命令行工具rz,sz)

我们手机电脑上的各种软件应用其实就是一个个的可执行程序(及其相关文件和资源的集合),打开应用的过程其实就是执行程序的过程,在执行程序之前,肯定要先对程序进行编译,但是如果每次打开应用都需要进行编译太麻烦了,所以就有了软件包。:rz 是用于接收文件(receive)的命令,当在终端上输入 rz 命令后,会弹出一个文件选择对话框,用于从本地计算机选择要传输的文件。最后一列, base 表示的是 "软件源" 的名称, 类似于 "小米应用商店", "华为应用商店" 这样的概念.整理。

2024-03-09 15:29:08 2552 1

原创 【Linux】权限管理(文件的访问者、类型和访问权限,chmod、chown、chgrp、umask,粘滞位)

在生活中,所有的个人财产都有它们各自的所有权人,非所有权人想要使用其个人财产需要征得所有权人的同意,就好比小时候我们借同桌的一块橡皮,需要征得他的同意才行,不然可能就会产生矛盾[doge]。linux下面的一切文件也是如此,所有文件都有各自的权限,其权限由访问者和访问权限构成。root 就是文件的访问者,访问者有不同类型,所以这里显示了两类访问者。-rw-r--r-- 就是文件的访问权限,下面会解释。目录的可执行权限 (x) 决定了用户是否可以在该目录下执行命令或者进入该目录。

2024-03-07 21:15:49 2064

原创 【Linux】常见指令2(more指令、less指令、head指令、tail指令、date指令、cal指令、find指令、grep指令、zip/unzip指令、tar指令、bc指令、uname -r)

more是一个用于逐页显示文本文件内容的命令行工具。它允许用户逐页浏览大型文本文件,以便更容易地查看和阅读文件内容。

2024-03-07 10:59:26 1885

原创 【Linux】常见指令1(ls指令、pwd指令、cd指令、touch指令、mkdir指令、rmdir指令、man指令、cp指令、mv指令、cat指令)

说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录, 则它会把前面指定的所有文件或目录复制到此目录中。mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命 令,经常用来备份文件或者目录。2. 当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它 将所给的源文件或目录重命名为给定的目标文件名。:递归处理,将指定目录下的文件与子目录一并处理。

2024-03-05 19:44:01 1462

原创 【C++】揭开运算符重载的神秘面纱

通过运算符重载,用户可以为自己创建的类或结构体定义与标准运算符相对应的操作,使得这些类型的对象可以使用像内置类型一样的简洁语法来执行操作。例如,对于自定义类Complexpublic:private:在上述例子中,通过重载运算符,我们使得Complex类的对象可以使用运算符执行相应的复数加法,使得代码更加直观和易读。运算符重载是一种强大的编程技术,允许用户定义的类型通过标准运算符执行自定义的操作。通过运算符重载,代码变得更加直观,可读性提高,使得类和对象的使用更加自然。

2023-12-22 16:39:43 875

原创 【C++】谈谈深拷贝与浅拷贝

深拷贝是指在对象赋值时,为对象的每一个指针成员分配新的内存,新的内存内存放源对象的副本。两个对象相互独立,对一个对象的修改不会影响到另一个对象。总的来说,深拷贝是一种更安全的拷贝方式,尤其在涉及到动态内存分配时,可以避免悬空指针和内存泄漏的问题。不过,具体选择深拷贝还是浅拷贝取决于具体的需求和对象的结构,有的情况下选择浅拷贝会更合适。

2023-12-20 21:37:18 440 1

原创 【C++】理解string类的核心理念(实现一个自己的string类)

实现自己的string类是学习 C++ 语言和面向对象编程的一个好方法。通过编写一个简单的字符串类,可以深入理解等核心理念。理解了string类的底层逻辑之后会发现,一些在上层看似复杂的操作在底层其实很简单。下面就让我们来实现一个自己的string类吧!

2023-12-20 16:43:56 1633

原创 【C++】标准库中的string类

以上只是对string类的初步认识,想要继续深入了解它还需要经过大量的练习以及string类的自我实现,理解了它的底层原理才能更好地运用它,后续我也会继续推出有关string类的自我实现的博客,请期待一波~~

2023-12-18 22:34:13 1629

原创 【C++】有关string类对象与迭代器的几道OJ题详解

为什么这里reverse内的参数是begin和x+1-k呢,原因是reverse内部第二个迭代器参数其实指向的是字符串最后一个元素的后一位,而x此时指向的是2k个元素中的第2k个元素,所以需要+1再-k,才能实现对前k个元素的翻转。根据题目要求,首先需要遍历字符串,我们用一个迭代器来实现遍历,还需要记录遍历的个数,用flag表示当遍历了2k个字符时,对前k个进行翻转,翻转的操作我们可以通过库函数。它的作用是创建一个指向字符串最后一个字符的反向迭代器,我们创建一个 it 变量用于接受迭代器的内容。

2023-12-18 18:41:30 1612

空空如也

空空如也

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

TA关注的人

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