自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

C/C++、数据结构、Linux....

坚持,坚持,再坚持!!!

  • 博客(39)
  • 收藏
  • 关注

原创 文件系统 && 软硬连接

首先要确定在哪一个组里面,操作系统由文件系统自动来进行确定, 遍历GDT去找,根据要新增文件的基本信息【新增文件的大小、文件名称、...】找到了对应的一个组,其中就要分配inode号,首先查位图,找到一个局部性的值【偏移量】,把inode Bitmap、Block Bitmap。

2025-04-17 22:00:00 677

原创 [刷题总结] 二分查找 && 前缀和

目录一、二分查找1.题目:704. 二分查找 - 力扣(LeetCode) 2.题目:34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)3.题目:35. 搜索插入位置 - 力扣(LeetCode)4.题目:69. x 的平方根 - 力扣(LeetCode)5.题目:153. 寻找旋转排序数组中的最小值 - 力扣(LeetCode)6.题目:LCR 173. 点名 - 力扣(LeetCode)二、前缀和1.题目:【模板】前缀和_牛客题霸_牛客网2.题目:【模板】二维前缀和_牛客题

2025-04-11 00:58:52 643

原创 [刷题总结] 双指针 && 滑动窗口

使得[0 , left]的这个区间全部都是非零的区间;这种类型的题,⼀般就是使⽤「双指针」来解决。常用:慢的指针向后移动⼀位,⽽快的指针往后移动两位,实现⼀快⼀慢。• 使用两个移动速度不同的指针在数组或链表等序列结构上移动。先根据“异地”操作,然后优化成双指针下的“就地”操作。<1> 先找到最后一个“复写”的数(模拟一遍往后)• 决定 dest 向后移动一步或者两步。• 先判断 cur 位置的值。• 终止条件:两个指针相遇或错开。(1)异地求解(新开数组)• 从两端向中间移动。(2)双指针(原地)

2025-04-06 21:14:52 828

原创 数据结构 && 常见的排序算法

直接插入排序。

2025-03-06 20:23:40 294

原创 【Linux】文件 && 文件描述符fd

一、C文件接口一、C文件接口🌟写文件🌠小贴士:• 文件 = 内容 +属性• 访问文件之前,都必须先打开它!【把文件加载到内存当中】文件没有被打开的时候,是在磁盘上的,我们在访问文件的时候,是谁在访问?写完的代码只是一个文本,并没有打开,代码编译成可执行程序【二进制】,也不是打开文件,当程序运行时,执行到fopen,并执行成功,才算是文件被打开。fopen属于运行时操作,当程序跑起来的时候,执行完fopen,对应的文件才会被打开。即访问一个文件,实则是进程在访问!• 文件必须加载到内存中!

2025-01-10 11:12:40 992

原创 【Linux】编写简易shell && 深度理解命令行解释器 && 环境变量 && 内建命令

1、在命令行中,一个命令是如何执行的?对于普通命令来讲,就是解析命令行,然后通过exec*系列的函数接口,进行fork()程序替换。2、命令行参数是从命令行依次获取的,被shell自己解析自己维护。3、环境变量表是从系统的配置文件读取出来的,由shell自己维护,维护好就是一个全局的指针数组,通过 execvpe() 接口函数来调用,这个系统的调用接口把环境变量传递给所有的子进程。4、echo命令,是内建命令。

2024-12-26 21:32:41 998

原创 【Linux】进程控制 && 程序替换

🌻返回值:当正常返回的时候waitpid返回收集到的子进程的进程ID;如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;🌻参数:pid• pid > 0:等待成功,目标为子进程的pid;• pid == 0:等待成功,但是子进程没有退出;• pid = -1:等待失败,等待任一个子进程。与wait等效。🌻status:•WIFEXITED

2024-12-21 20:43:09 804

原创 【Linux】环境变量 && 程序地址空间

🌻🌠命令行参数:我们使用的所有指令是用C语言或者是其他语言写的,指令中的选项是通过命令行参数来实现的,命令行参数列表使得同一个程序,可以根据命令行参数,根据选项的不同,表现出不同的功能。比如:指令中选项的实现!• main 函数的参数是谁传递的?这个字符串首先是被命令行解释器(shell)【进程】拿到的,shell 拿到之后,首先把上面的命令按照空格打散,形成一张表(argv)和元素个数(argc)。命令行启动的程序,父进程都是shell,所以命令和shell命令行是父子关系。

2024-12-15 21:30:00 797

原创 【Linux】进程

进程 = 内核数据结构(task_struct)+ 程序的代码和数据运行起来的程序,进程会被根据task_struct属性 被OS调度器调度,运行为什么要有PCB(task_struct)? OS要管理进程,先描述,再组织。task_struct 是Linux内核的一种数据结构,它会被操作系统在内存中进行创建,里面包含着进程相关的管理信息。

2024-12-06 21:30:19 731

原创 【Linux】gdb / cgdb 调试 + 进度条

所以为什么上面程序为什么会多出一个 “0” ,也就能理解了,以为从 10 开始我们输出的是 “1” “0” ,紧接着要输出 “9” 时,光标回车到了最开始,只覆盖住了 “1” ,“0” 一直都在,所以我们需要修改输出的格式 printf("%-2d\n",countt);我们思考一下,我们给显示器输出的是一个整数1234,还是打印了一个1 2 3 4 字符,让我们以为打印的是一个整数,我们需要知道的是,在平时我们都会以为这两个使用是一样的,其实不然,新起一行的本质:先回车,再换行。

2024-12-01 21:30:18 1098

原创 【Linux】vim

vim常见模式:•正常/普通/命令模式(Normal mode)控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode•插入模式(Insert mode)只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。•末行模式(last line mode)文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即

2024-11-25 21:30:00 2343

原创 【Linux】权限

用户1 新建了一个文件,但是不想让 other 进行读/写,为此 用户1 把这些权限给关掉了,其他用户就不能对 用户1 建的文件进行读/写,但是其他用户可以对 用户1 建的文件进行删除!(文件的拥有者是当前用户)更改文件的读写执行权限,只会更改该文件本身,但要修改文件的拥有者、所属组时,普通用户以拥有者为例,本质是你要把这个文件给别人,给别人要经过别人的允许,若非要给,需用。一个文件被新建/删除/更改,并不取决于这个文件本身的读写执行权限,而是取决于这个文件所在的目录的权限;新建一个普通文件是664?

2024-11-22 21:09:36 901

原创 【Linux】基本指令

语法: ls [选项] [目录或文件]功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。常用选项:-a 列出目录下的所有文件,包括以 . 开头的隐含文件-d 将目录象文件一样显示,而不是显示其下的文件。 如:ls –d 指定目录-i 输出文件的 i 节点的索引信息。 如 ls –ai 指定文件-k 以 k 字节的形式表示文件的大小。ls –alk 指定文件-l 列出文件的详细信息-r 对目录反向排序-t 以时间排序-s 在l文件名后输出该文件

2024-11-21 22:00:00 1010

原创 智能指针(内存泄漏问题)

借此,我们实际上把管理一份资源的责任托管给了一个对象。这种方法有两大好处:• 不需要显式的释放资源;• 采用这种方式,对象所需的资源在其生命期内始终保持有效。

2024-11-01 22:00:00 1050

原创 C++11特性

C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用列表初始化时,可添加等号(=),也可不添加:创建对象也可以使用列表初始化方式调用构造函数初始化

2024-10-26 22:00:00 643

原创 unordered_map 和 unordered_set 的模拟实现

🌻本篇文章,重点是:和模拟实现是如何进行封装的,封装的细节需要注意哪些,注意看仔细哦~

2024-10-25 21:26:57 931

原创 哈希表【闭散列/开散列】

1. unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与 其对应的value。2. 在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此 键关联。键和映射值的类型可能不同。3. 在内部,unordered_map没有对按照任何特定的顺序排序, 为了能在常数范围内 找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。4. unordered_map容器通过key访问单个元素要比map快,

2024-10-24 21:55:00 965

原创 红黑树的实现

为了后续实现关联式容器简单,红黑树的实现中增加一个头结点,因为根节点必须为黑色,为了 与根节点进行区分,将头结点给成黑色,并且让头结点的 pParent 域指向红黑树的根节点,pLeft 域指向红黑树中最小的节点,_pRight域指向红黑树中最大的节点。,红黑树不追求绝对平衡,其只需保证最长路径不超过最短路径的2倍,相对而言,降低了插入和旋转的次数,所以红黑树在经常进行增删的结构中性能比AVL树更优,而且红黑树实现比较简单,所以实际运用红黑树更多。注:此处看到的树,有可能是一颗完整的树,也可能是一颗子树。

2024-10-07 20:19:06 691 1

原创 AVL树的实现

从上面的左单旋、右单旋,我们可以知道,插入的节点都是偏向同一边的(left->left、right->right),如果我们插入的节点不在同一侧呢?这里的平衡因子,并不是实现AVL树的,唯一方式,有一些会直接去看高度差来进行控制,但是我们这里采用的是平衡因子。• 进行旋转完后,最重要的是维护好平衡因子,情况一和情况二的区别就是旋转后平衡因子的变化不一样。• 进行旋转完后,最重要的是维护好平衡因子,情况一和情况二的区别就是旋转后平衡因子的变化不一样。• parent所在的子树高度都会变化,需要继续往上更新;

2024-10-06 22:30:00 857

原创 【C++】树形结构的关联式容器:set、map、multiset、multimap的使用

set的介绍1. set是按照一定次序存储元素的容器2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。

2024-10-02 22:00:00 1230

原创 二叉搜索树的实现 K模型 和 KV模型

• 对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。搜索二叉树的节点不仅要存该节点的值,还要存左右节点的指针,因此把节点封装成一个节点类,以便对节点插入、删除、查找等进行操作。KV模型:每一个关键码key,都有与之对应的值value,即的键值对。• 找到位置,创建节点,并判断节点是插入在前一个节点的左边还是右边。• 在插入时,树为空,新建的节点要存value;

2024-09-28 21:56:41 812

原创 【C++】多态and多态原理

🌟多态的构成条件多态是在不同关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。在继承中构成多态的两个条件(指向谁调用谁)1、必须通过基类的指针或者引用调用虚函数;2、被调用的函数必须是虚函数(对象都不行),且派生类必须对基类的虚函数进行重写;🌟虚函数即 被virtual修饰的类成员函数称为虚函数。class Apublic:🌟虚函数的重写。

2024-09-15 22:30:00 1121 1

原创 【C++】继承

🌟继承的概念继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。之前我们接触的复用都是函数复用,继承是类设计层次的复用。//学号protected:int _jobid;//工号Student s;Teacher t;s.Print();

2024-09-06 22:30:00 971

原创 【C++】模板特化

2. 模板定义的位置显式实例化。四、模板总结。

2024-09-04 22:30:00 2065

原创 【C++】stack、queue、priority_queue的模拟实现

2、队长被实现为容器适配器,这些类使用特定容器类的封装对象作为其底层容器,提供一组特定的成员函数来访问其元素。2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供。3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue。3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。底层是一个堆,在堆后中插入数据,数据就乱了,因此要向上调整堆的数据。

2024-09-02 17:20:36 1120 1

原创 【C++】list的使用和list的模拟实现和迭代器失效问题

1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。

2024-08-28 22:00:00 909

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

• erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代 器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是 没有元素的,那么pos就失效了。• 出错原因:以上操作,都有可能会导致vector扩容,也就是说vector底层原理旧空间被释放掉,而在打印时,it还使用的是释放之间的旧空间,在对it迭代器操作时,实际操作的是一块已经被释放的空间,而引起代码运行时崩溃。

2024-07-29 15:40:05 1041

原创 【C++】vector的使用

Vector是表示大小可以改变的数组的序列容器。与数组一样,vector对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组中的效率一样高。但与数组不同,它们的大小可以动态变化,其存储由容器自动处理。在内部,vector使用动态分配的数组来存储它们的元素。当插入新元素时,可能需要重新分配此数组以增加大小,这意味着分配一个新数组并将所有元素移动到其中。就处理时间而言,这是一项相对昂贵的任务,因此,vector不会在每次将元素添加到容器时重新分配。

2024-07-28 13:38:22 770

原创 【C++】 string类的模拟实现

这里我们给字符数组分配一个空间大小来储存\0,同时设置类的_size和_capacity成员变量的初始值。一些细节:以上涉及到相关的接口实现往接着下看😊用常量字符串:_str(new char[strlen(str) + 1])//+1给末尾存储\0//用字符串函数将常量字符串拷贝到对象的数组中我们可以对代码进行优化,可以将上述两个函数通过缺省值合并为一个函数。// +1是给末尾存储\0//用字符串函数将常量字符串拷贝到对象的数值中。

2024-07-20 13:31:51 960

原创 【C++】 string类的常用接口类型的使用

在使用string类时,必须包含#include头文件以及using namespace std;string 是表示字符串的字符串类;该类的接口与常规容器的接口基本相同,再添加一些专门用来操作string的常规操作;string在底层实际是:basic_string模板类的别名,不能操作多字节或者变长字符的序列。

2024-07-15 12:55:13 1110

原创 【C++】初识模板 (函数模板和类模板)

class 类模板名//类内成员定义// 动态顺序表// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具public :, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表if(_pData)

2024-05-28 21:39:26 560

原创 【C/C++】内存管理

int main()自定义类型,new才会调用构造初始化,malloc不再适用开空间/释放空间,还会调用构造和析构delete p2;delete p3;return 0;在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc 和 free不会。

2024-05-17 21:50:41 1811 1

原创 【C++】类和对象(下)构造函数、static成员、友元、内部类、匿名类)

3。

2024-05-13 21:55:21 2047 8

原创 【C++】类与对象(中)赋值运算符重载、const成员、取地址操作符重载

返回对象是一个局部对象或者临时对象,出了当前func()函数作用域,就析构销毁了,那么不能引用返回,用引用返回是存在风险的,因为引用对象在func()函数栈帧已经销毁了,这两运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如。运算符有显式调用和直接调用,当写成显式调用时,就牺牲了代码的可读性,此时与函数的调用类似。虽然返回引用可以减少一次拷贝,但是出了函数作用域,返回对象还在,才能引用返回。,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明。

2024-05-08 21:38:36 758 5

原创 【C++】类与对象(中)(构造函数、析构函数、拷贝构造函数)

则C++编译器。

2024-05-01 14:13:42 1774

原创 【C++】类与对象(上)

/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号类的两种定义方式:1.声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。public:public://成员变量声明char* _sex;int _age;成员函数名前需要加类名::一般情况下,声明和定义要分离,方便操作。小贴士:成员变量命名规则:_ 、m :区分成员变量和外面的普通变量,一般都是加个前缀或者后缀标识符区分,具体看个人习惯。

2024-04-22 20:18:48 757

原创 【C++】入门(下)

在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,这是为什么呢?auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。return 10;auto b = a;//typeid():查看数据类型//auto e;无法通过编译,使用auto定义变量时必须对其进行初始化return 0;

2024-04-20 00:50:15 668

原创 【C++】入门(中)

int a = 1;int& ra;//编译出错。

2024-04-16 21:24:13 451

原创 【C++】 入门 (上)

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量、函数、类型。//命名空间定义//命名空间中可以定义变量、函数、类型struct xlfint val;

2024-03-28 15:25:08 865 1

空空如也

空空如也

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

TA关注的人

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