自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【数据结构】图的存储(邻接矩阵与邻接表)

因为图中既有节点,又有边(节点与节点之间的关系),因此,在图的存储中,只需要保存:节点和边关系即可。节点保存比较简单,只需要一段连续空间即可,那边关系该怎么保存呢?

2025-05-31 21:26:34 915 1

原创 【C++】位图

当我们设置一个数字进入位图里面,也就是我们要把相应的位图设置为1,同时又不能改变其他的位置标识。要表示8个数,我们就只需要8个Bit(1字节),首先我们开辟1字节的空间,将这些空间的所有Bit位都置为0,然后将对应位置为1。最后,遍历一遍Bit区域,将该位是一的位的编号输出(2,3,4,5,7),这样就达到了排序的目的,时间复杂度。如果第一个位图为1第二个位图为0,说明出现了2次,如果第一个位图为1第二个位图为1,说明出现了2次及以上。假如,我们存了10,20,30,40,48,那我们在位图中如何表示?

2025-05-30 20:58:43 523

原创 vscode连接本地Ubuntu

因为在学习项目的时候,自己的云服务器性能太差一直要编译很长时间,而且总是连接失败,所以搞了一个Ubuntu25.04的系统在自己的vmare中。看下面的文章解决完成后再回过头在看Windows下的VsCode软件使用SSH这篇文章,看完就OK了。接下来开始介绍一下vscode连接本地Ubuntu。先看这篇文章,如果遇到下面的错误。其中参考了以下文章。

2025-05-21 19:49:45 457

原创 C++ 回调函数

就是通过客户端发送一个apple,之后服务端通过回调进行发送一个苹果。下面写一个很简单的回调实际应用。这里只输出了客户端的消息。

2025-05-17 10:15:27 335

原创 【Linux】线程互斥同步

信号量本质是一把计数器,描述临界资源中资源数目的多少。比如你开了一家停车场,有 5 个停车位(资源)。信号量的初始值:5(表示有 5 个可用车位)。当车辆进入(线程 / 进程申请资源):如果有空位,允许进入;否则在门口等待。当车辆离开(线程 / 进程释放资源):腾出一个空位,唤醒等待的车辆。(1)P 操作(Wait)目标:申请一个资源(如停车位)。步骤检查信号量值:若信号量 > 0 → 可用资源足够。原子减 1:占用一个资源(信号量 = 信号量 - 1)。若信号量 ≤ 0。

2025-03-30 20:01:48 984

原创 【Linux】线程库

tid其实是一个地址首先,我们知道pthread. h不是操作系统的接口,而是。那么用户创建的线程,操作系统无法管理,则需要线程库来进行管理。他从系统中获取轻量级进程相关属性,从用户中也获取一些属性,这样就先描述起来了,再通过数据结构将线程组织起来,就将线程管理好了。那么线程库如何管理呢,在哪管理呢?在进程地址空间中,通过mmap(共享区)加载了动态库,我们使用的pthread库就在该区域。pthread库会管理进程中的每一个线程,它使用一系列的数据结构(如线程控制块)来组织和维护线程的相关信息。

2025-03-23 20:43:17 532

原创 【Linux】重谈地址空间

Soft Page Fault 也被称为 Minor Page Fault,翻译为软缺页错误 / 次要缺页错误,这时物理内存中是存在对应物理页的,只不过可能是其他进程调入的,发出缺页异常的进程不知道而已,此时 MMU 只需要建立映射即可,无需从磁盘读取写入内存,一般出现在多进程共享内存区域。假如我们只有一个4kb大小的程序我们叫他为main,我们编译链接形成的是ELF格式,当我们main程序在运行,虚拟地址初始化操作系统为进程分配独立的虚拟地址空间,并根据 ELF 文件的。如果页号非法,则为越界访问。

2025-03-16 22:01:02 712 1

原创 【Linux】进程信号

信号是一种用户、OS、其他进程,向目标进程发送异步事件的一种方式。例如:ctrl + c 终止前台进程,就是信号。使用kill -l就可以看到所有的信号 ,我们把前三十一个称为普通信号(也称为不可靠信号),都是大写的宏,前面的数字就是宏对应的值。man 7 signal可以查看更详细的信号手册(没有截全)

2025-03-12 00:07:27 706

原创 【Linux】共享内存

共享内存本质上就是内存中的一块区域,用于进程间通信使用。该内存空间由操作系统分配与管理。与文件系统类似的是,操作系统在管理共享内存时,不仅仅有内存数据块,同时还会创建相应结构体来记录该共享内存属性,以便于管理。因此,共享内存不只有一份,可以根据需求申请多个。进程之间进行通信的时候,会获取到共享内存的地址,写端进程写入数据,读端进程通过直接访问内存完成数据读取。

2025-02-28 10:43:38 812

原创 【Linux】匿名管道

管道是Linux中的最古老的通信方式,我们把一个进程链接到另一个进程的一个数据流称为一个"管道"。linux中指令 | 这个被称为管道符。通过管道符 | 创建的管道是匿名管道,用完了就会被自动销毁。需要注意的是,匿名管道只能在具有亲缘关系(父子进程,兄弟进程,爷孙进程)的进程间使用。也就是说,。

2025-02-19 20:06:15 456

原创 【Linux】动静态库

静态库 .a[Linux]、.lib[windows]动态库 .so[Linux]、.dll[windows]

2025-02-02 21:38:05 804

原创 【Linux】文件系统

所以我们对一个目录没有r权限的时候,查不了文件内容,因为对目录没有读权限,就无法读取目录的data blocks,系统不让读,读不到,就得不到文件名和inode的映射关系,拿不到inode怎么可能访问到文件。例如,如果你访问 /var/log/syslog,首先检查 / 是挂载在 /dev/sda1 上,然后检查 /var 是否是一个单独的挂载点。例如,如果 / 被挂载在 /dev/sda1 上,那么 / 及 / 下的文件和目录都属于 /dev/sda1 分区。里面的内容包括文件名的inode码。

2025-01-22 18:18:17 753

原创 【Linux】重定向&&缓冲区

在一个struct file内部还要有一个数据结构-----文件的内核级缓冲区。

2025-01-18 16:08:44 1002

原创 【Linux】文件描述符fd

我们重新回到2.1open的返回值那块看看返回文件描述符fd,数据类型为整形int main()//以只写方式打开,如果文件不存在则创建if(fd1<0)return 0;return 0;fd1: 3此时文件标识符为3,为什么文件打开从3开始呢?因为进程启动,默认打开了三个标准的输入输出流:stdin,stdout,stderr因为Linux下一切皆文件,这三个标准的输入输出流被当成文件打开了。int main()//以只写方式打开,如果文件不存在则创建。

2025-01-15 18:09:29 1121

原创 【Linux】模拟Shell命令行解释器

snprintf() 是 C语言的一个标准库函数,定义在<stdio.h>头文件中。snprintf() 函数的功能是,并将结果存储在指定的字符数组中。参数returnn。

2025-01-10 23:55:59 892

原创 【Linux】进程控制

在linux中fork函数是非常重要的函数,它从已存在进程中创建⼀个新进程。新进程为⼦进程,⽽原进程为⽗进程。进程调⽤fork,当控制转移到内核中的fork代码后,内核做:分配新的内存块和内核数据结构给⼦进程将⽗进程部分数据结构内容拷⻉⾄⼦进程添加⼦进程到系统进程列表当中fork返回,开始调度器调度。

2025-01-08 17:37:26 718

原创 【Linux】进程地址空间

我们在学习C/C++的时候总是会经常的看到这种内存分布图,我们之前所理解的是程序地址空间,而不是进程地址空间。程序地址空间是指程序在编译链接后,理论上所占据的虚拟地址范围。它是一种静态的概念,主要是由编译器和链接器确定的。进程地址空间是一个进程运行时可以访问的虚拟地址空间,是一种动态的概念。它是在程序执行过程中,。我们先验证一下进程地址空间的基本排布。

2024-12-07 14:09:33 1119

原创 【Linux】命令行参数&环境变量

main 函数⼀共有三个参数,在命令行部分先关注前两个参数:1、‌:表示命令行参数的个数2、表示命令行参数的清单这里我们可以看到命令行,argc中显示的参数个数,argv命令行参数的清单内容为什么要有这两个参数呢?因为同一个程序,可以根据命令行参数,根据选项的不同,表现出不同的功能。就比如常用指令ls -a,ls -d。main函数的参数是谁给传递的呢?在上进行输入指令加选项,他是,首先会被拿到,根据空格为分隔符进行打散,形成一张表argv[]和元素个数argc。

2024-12-01 18:09:39 898

原创 【Linux】进程-PCB

进程信息被放在⼀个叫做进程控制块的。

2024-11-22 11:38:15 1315 3

原创 【Linux】自动化构建工具-make/Makefile

make:一条命令makefile/Makefile:一个文件。文件里面写依赖关系与依赖方法两个搭配使用,完成项目自动化构建。<Tab>必须是隔一个Tab建。代码解析::目标文件。:依赖文件列表。对于proc:proc.c,冒号左侧是目标文件,右侧是它的依赖文件,所以就可以说它们之间存在一种proc:proc.c下面的语句gcc -o proc proc.c叫做:表示声明一个伪目标。(类似于关键字)。:伪目标的一个名称。(类似于变量名)。:clean:单独一行表示这一行的依赖关系,没有依赖列表。

2024-11-11 19:36:49 1183

原创 【C++】智能指针

RAII(Resource Acquisition Is Initialization)是一种(如内存、文件句柄、网络连接、互斥量等等)的简单技术。在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们。这种做法有两大好处:1.不需要显式地释放资源。2.采用这种方式,对象所需的资源在其生命期内始终保持有效。下面介绍3种智能指针,智能指针最重要的就是拷贝构造。

2024-11-03 10:29:00 782

原创 【C++】异常

实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。

2024-10-30 16:43:32 580

原创 【C++11】

左值是。

2024-10-27 17:28:09 744

原创 【C++】哈希表

在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到log2N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器(unordered_map,unordered_multimap,unordered_set,unordered_multiset),

2024-10-16 20:32:33 1272

原创 【C++】红黑树

RED,BLACK:_kv(kv), _col(RED) // 颜色默认给成红色{}思考:在节点的定义中,为什么要将节点的默认颜色给成红色的?答:优先插入红色不一定能破坏红黑树的性质,如果破坏性质可以通过调整红黑树的颜色来进行修改,但是插入黑色直接破坏红黑树的性质。

2024-10-06 20:37:08 2225 2

原创 【C++】AVL树

AVL的概念:左右子树高度差不超过1因此要在二叉搜索树上增加一个平衡因子(来记录左右子树的高度差),当平衡因子超过1时,就要更新向上调整父节点的平衡因子(因为子节点的平衡因子发生变化,间接的导致父节点的平衡因子发生改变),这时就要知道父节点的位置,因此在二叉搜索树上要多维护一个父节点的指针。int _bf;, _bf(0){}

2024-09-29 22:36:13 721

原创 【C++】map与set

序列式容器vector、list、deque其底层为线性序列的数据结构,里面存储的是元素本身。关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高(注:键值对用来表示具有关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。

2024-09-23 19:27:09 1065

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

先定义二叉树的结构利用二叉树结构模拟实现二叉搜索树。

2024-09-16 20:28:46 321

原创 【C++】多态

也就是说下图中不同类域中的BuyTicket之间也是有隐藏关系的(有些概念不清楚可以看我上篇写的继承)派生类屏蔽了父类同名函数BuyTicket,打印的是半价,指定类域后打印的是全价可以认为重写是一种特殊的隐藏。隐藏包含重写。

2024-09-08 12:02:23 721

原创 【C++】继承

1. 很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。2. 多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。继承和组合public继承是一种is-a的关系(Car和BMW Car和Benz构成is-a的关系,总类的细分支)。也就是说每个派生类对象都是一个基类对象。

2024-08-31 12:45:55 1285

原创 【C++】模板进阶

与。类型形参:出现在模板参数列表中,跟在非类型形参:就是用一个,在类(函数)模板中可将该参数。下面size_t N中的N为非类型形参,class T中的T为类型参数。C++20之前,只允许整形做非类型模板参数C++20,可以支持double(x64)等内置类型注意:1. 浮点数(float(x86,x64),double(x86))、类对象以及字符串是不允许作为非类型模板参数的。2. 非类型的模板参数必须在编译期就能确认结果。这里介绍一个非常鸡肋的头文件先说这个好处,这个头文件的好处。

2024-08-27 11:00:15 893

原创 【C++】stack和queue

stack就类似于我们数据结构所学的栈stack是一种容器适配器什么是适配器适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。举个例子:某插头要求输入:100-240V~,50/60Hz,0.7A输出:5V==3A/9V==3A/12V= 2.25A 20V=1.35A/11V=3A Max这就是适配器。

2024-08-14 15:35:52 950

原创 【C++】vector习题

这里给你一个vector<vector<int>>类型也就是说vector中的各个数据,存的是各个不同的vector思路:先给vector开空间,然后给vector中的vector开空间,并且初始化最后根据数学关系找规律。

2024-08-09 12:52:02 1133

原创 【C++】List模拟实现

后置++

2024-08-08 00:14:24 1148

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

start 首元素地址_finish 尾元素后的地址_end_of_storage 指向最后空间的地址capacity是计算这个空间的大小size是计算空间中存储的个数。

2024-08-04 15:23:30 766

原创 【C++】string

而且他们的解决措施一样就是在.h声明,只在一个.cpp中定义。

2024-07-31 16:56:37 1014

原创 【C++】模板初阶

【函数模板格式】注意:typename是用来定义模板参数关键字,也可以使用class【函数模板的原理】当调试的时候在模板层,但是底层依旧是调用Swap<int>,Swap<double>,不是Swap<T>函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该在编译器编译阶段,对于模板函数的使用,

2024-07-10 16:30:43 359

原创 【C++】内存管理

new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数class Apublic:: _a(a)~A()private:int _a;delete p2;return 0;假如不提供默认构造,会发生报错【存储】class Apublic:: _a(a)_a = aa._a;内存存储的是自定义类型。

2024-07-09 20:20:25 737

原创 【C++】类和对象(下)

定义时不添加static关键字,

2024-07-03 18:28:11 767

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

编译器自动生成构造函数,对于内置类型成员变量,没有规定要不要处理(有些编译器会处理)对于自定义类型成员变量才会。

2024-06-24 20:24:22 1081

空空如也

空空如也

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

TA关注的人

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