自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux——进程信号(2)(函数信号与软件信号与硬件中断)

1.产生机制硬件检测到异常(如除零、非法内存访问)后通知内核内核将硬件异常转换为相应信号发送给进程2.常见硬件异常信号信号编号触发条件默认动作SIGFPE8算术异常(如除零、溢出)CoreSIGSEGV11无效内存引用(段错误)CoreSIGILL4非法指令CoreSIGBUS7总线错误(内存对齐错误等)CoreSIGTRAP5断点/陷阱指令Core。

2025-03-26 19:51:18 442

原创 Linux——进程信号(1)(signal与sigaction)

信号本质:异步事件通知机制,由操作系统发送,进程决定处理方式。核心函数:signal() 或更健壮的 sigaction()。关键特性异步性(可能打断任何代码)。用户自定义处理(捕获/忽略)。前台/后台进程差异。应用场景:进程优雅退出、定时任务(SIGALRM)、父子进程通信(SIGCHLD)。附:常用信号列表信号  编号  默认行为  触发方式SIGINT  2   终止    Ctrl+CSIGQUIT 3  终止+核心   Ctrl+\SIGTERM 15  终止     kill。

2025-03-26 13:22:21 505

原创 Linux——进程间通信(system V共享内存)

(1)在代码中创建共享内存在 C 代码中,可以使用以下系统调用来操作共享内存:shmget():创建或获取共享内存段。shmat():将共享内存段附加到进程的地址空间。shmdt():将共享内存段从进程的地址空间分离。shmctl():控制共享内存段(如删除)。

2025-03-11 12:08:50 777

原创 Linux——进程间通信初解(匿名管道与命名管道)

(1)在 Bash 中创建命名管道/tmp/my_fifo 是命名管道的路径。创建后,可以通过文件操作(如 cat、echo)使用命名管道。# 终端 1:写入数据 echo "Hello from terminal 1" > /tmp/my_fifo # 终端 2:读取数据 cat /tmp/my_fifo(2)在代码中创建命名管道复制/tmp/my_fifo 是命名管道的路径。0666 是权限模式,表示所有用户可读写。

2025-03-11 11:48:42 1178

原创 Linux——ext2文件系统(二)

inode(索引节点)是Linux文件系统中的一个核心概念,它存储了文件系统对象(如文件和目录)的所有元数据,除了文件名以外的所有信息几乎都存储在inode中。

2025-02-03 14:15:18 1048

原创 Linux——ext2文件系统(一)

块是操作系统与磁盘交互的最小数据单元。在Linux系统中,通常称之为“块”(block),而在Windows系统中,则称之为“簇”(cluster)。块的大小在硬盘格式化时被指定,常见的有1KB、2KB、4KB(最常用)等。inode是Linux文件系统中用于存储文件和目录元数据信息的数据结构。每个文件和目录在文件系统中都有一个唯一的inode与之关联。这个inode包含了文件的各种属性信息,如文件大小、文件类型、权限、所有者、用户组、时间戳等,但不包括文件内容本身。

2025-02-01 12:56:49 774

原创 Linux——自定义简单shell

能处理普通命令能处理内建命令要能帮助我们理解内建命令/本地变量/环境变量这些概念理解shell的运行。

2024-12-01 22:22:26 1120

原创 计算机操作系统——进程控制(Linux)

fork() 是 Linux 中用于创建新进程的系统调用,返回两次:一次在父进程中返回子进程的 PID,一次在子进程中返回 0。它复制父进程的资源,并使用写时复制技术优化性能。子进程和父进程是相互独立的,但它们共享某些资源,如文件描述符。父进程应该使用 wait() 等函数来回收子进程的资源,避免僵尸进程。进程终止的本质:进程终止是操作系统回收进程资源、清理内存并通知父进程的过程。终止原因:可以是正常结束、错误崩溃、外部信号等。

2024-11-26 22:56:49 1473

原创 刷题——【模板】二维前缀和

显而易见,最容易想到的方法就是先录入数据,然后一行一行的求和。先求前缀和数组,显然我们不能每次都遍历一次求和,复杂度太高,那么就可以利用前面已经求出的值求出当前的和。接下来有 q 次查询,每次查询输入 4 个参数 x1 , y1 , x2 , y2。请输出以 (x1, y1) 为左上角 , (x2,y2) 为右下角的子矩阵的和,接下来q行,每行4个整数x1, y1, x2, y2,分别代表这次查询的参数。再求某一个小区域的和,与此类似,画图总结公式,利用已知和求取。输出q行,每行表示查询结果。

2024-11-23 22:01:58 374

原创 Linux——cgdb的使用

cgdb 是一个基于 GDB 的图形化调试前端,结合了命令行界面的功能和代码查看窗口。它主要是为开发者提供一个更为直观的调试体验,使得在调试程序时既能利用 GDB 强大的调试能力,也能同时查看代码,使得调试过程更加高效和便捷。

2024-11-10 14:19:28 1144

原创 c++11新特性——智能指针

unique_ptr的定义在头文件中,它是一个模板类,可以管理任何类型的动态分配对象。其中,T是unique_ptr所管理对象的类型,Deleter是一个删除器,用于在unique_ptr销毁时释放对象。默认情况下,使用std::default_delete作为删除器。删除器是一个函数对象(可以是函数指针、函数对象或lambda表达式),它定义了当unique_ptr销毁时如何释放其所管理的资源。

2024-11-06 14:43:03 978 1

原创 C++11新特性(列表初始化与右值引用折叠与完美转发)

Function(T&&t)函数模板程序中,假设实参是int右值,模板参数T的推导int,实参是int左值,模板参数T的推导int&,再结合引⽤折叠规则,就实现了实参是左值,实例化出左值引⽤版本形参Function,实参是右值,实例化出右值引⽤版本形参的Function。像f2这样的函数模板中,T&& x参数看起来是右值引⽤参数,但是由于引⽤折叠的规则,他传递左值时就是左值引⽤,传递右值时就是右值引⽤,有些地⽅也把这种函数模板的参数叫做万能引⽤。2,左值引用可以被赋值,但不能用于移动语义。

2024-10-27 17:02:45 686

原创 Linux的makefile与进度条小程序实践

变量可以使用 = 或 := 定义VAR = value # 延迟赋值VAR := value # 立即赋值变量在命令中可以用 $(VAR) 访问$@:目标文件的名称。$

2024-10-26 22:10:55 915

原创 哈希表与unordered_map与unordered_set

哈希函数是一种算法,它接收输入(可以是任意长度的数据)并生成一个固定长度的输出,通常称为哈希值或散列值。

2024-10-25 11:36:04 955

原创 C++——红黑树(带头结点)

红黑树是一种自平衡的二叉搜索树,具有以下几个重要特性和规则,确保其在插入、删除和查找操作中的时间复杂度保持在 (O(\log n))。红黑树的基本概念节点颜色:每个节点都有一个颜色属性,可以是红色或黑色。节点结构:每个节点除了存储数据,还包含指向左右子节点和父节点的指针,以及颜色信息。

2024-10-13 14:50:52 666 1

原创 平衡二叉树——AVl树

从插入节点的父节点开始,逐级向上检查每个祖先节点的平衡因子(Balance Factor, BF),即左子树高度减去右子树高度(BF = height(left) - height(right)),或者相反。AVL树是一种二叉搜索树,意味着每个节点都有一个键值,左子树的所有节点值小于该节点的值,右子树的所有节点值大于该节点的值。AVL树在插入或删除节点时,通过旋转操作来保持树的平衡,以确保所有基本操作的时间复杂度为 O(log n)。节点的高度是其左子树和右子树高度的最大值加一。

2024-10-05 19:25:32 756

原创 关联式容器——map与set

如图为官网的英文介绍set的定义语法T就是set底层关键字的类型set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模版参数set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参数。⼀般情况下,我们都不需要传后两个模版参数。set底层是⽤红⿊树实现,增删查效率是 ,迭代器遍历是⾛的搜索树的中序,所以是有序的。

2024-09-25 22:58:09 674 2

原创 数据结构——二叉搜索树

在二叉搜索树(BST)中,查找某个节点的步骤非常简单,因为 BST 的特性保证了每个节点的左子树中的所有节点值都小于该节点的值,右子树中的所有节点值都大于该节点的值。如果树是自平衡的(如 AVL 树或红黑树),可能需要调整树的平衡性,例如通过旋转操作来维持树的平衡。:要删除的节点有两个子节点找到该节点的右子树中最小的节点(即“后继节点”),将这个后继节点的值替换到要删除的节点,然后删除后继节点。在最坏情况下,例如树退化成链表(所有节点只有一个子节点),树的高度变为 N,操作的时间复杂度变为 O(N)。

2024-09-17 17:14:56 1359 1

原创 C++——多态的原理

⼀个含有虚函数的类中都⾄少都有⼀个虚函数表指针,因为⼀个类所有虚函数的地址要被放到这个类对象的虚函数表中,虚函数表也简称虚表。但是要注意的这⾥继承下来的基类部分虚函数表指针和基类对象的虚函数表指针不是同⼀个,就像基类对象的成员和派⽣类对象中的基类对象成员也独⽴的。派⽣类的虚函数表中包含,基类的虚函数地址,派⽣类重写的虚函数地址,派⽣类⾃⼰的虚函数地址三个部分。派⽣类中重写的基类的虚函数,派⽣类的虚函数表中对应的虚函数就会被覆盖成派⽣类重写的虚函数地址。基类对象的虚函数表中存放基类所有虚函数的地址。

2024-09-14 17:10:24 896

原创 C++——多态

在C++中,多态(Polymorphism)是指不同的对象可以通过相同的接口进行操作的能力。多态性是面向对象编程中的一个重要特性,允许程序在运行时决定调用哪个方法,从而使得代码更加灵活和可扩展。静态多态和动态多态。协变指的是在继承层次中,类型系统如何处理函数返回值的类型关系。具体来说:如果一个类型 B 是类型 A 的派生类(即 B 是 A 的子类),并且你有一个返回 A 类型对象的函数,那么你可以将这个函数重写成返回 B 类型对象的函数。这是协变的例子。

2024-09-14 11:41:45 953

原创 STL——栈和队列和优先队列

学到这里对于容器的基础内容都是大概掌握了的,所以直接讲重点栈(Stack)栈是一种后进先出(LIFO, Last In First Out)的数据结构,类比为一个容器,你只能从容器的顶部(栈顶)添加或移除元素,不能在中间或底部进行操作。压入(Push):将元素放入栈顶。弹出(Pop):从栈顶移除元素。查看栈顶元素(Top):查看但不移除栈顶元素。判空(Empty):判断栈是否为空。大小(Size):获取栈中元素的个数。

2024-08-02 21:32:38 1242 1

原创 C++——list容器以及手动实现

std::list。

2024-08-01 20:04:45 842 2

原创 c++——vector容器详解

C++ 中的 std::vector 是一个动态数组,是标准模板库(STL)中的一个重要容器。它提供了动态大小、快速随机访问和插入/删除操作的能力,使其成为处理动态数据集合的常用选择。vector——向量向量是表示大小可以变化的数组的序列容器。就像数组一样,向量对其元素使用连续的存储位置,这意味着也可以使用指向其元素的规则指针上的偏移量来访问其元素,并且与在数组中一样有效。但与数组不同的是,它们的大小可以动态变化,容器会自动处理它们的存储。在内部,向量使用动态分配的数组来存储其元素。

2024-07-28 23:14:56 983

原创 c++——string详解

string是表示字符序列的对象, 与普通的char*不一样,本质上是一个类,内部封装了各种函数。标准字符串类通过类似于标准字节容器的接口为此类对象提供支持,但添加了专门设计用于处理单字节字符字符串的功能。字符串类是 basic_string 类模板的实例化,它使用 char(即字节)作为其字符类型,以及其默认的 char_traits 和分配器类型(有关模板的更多信息,请参阅basic_string)。

2024-07-25 12:32:56 1220 3

原创 C++——模板的奥秘

template 或 template :声明一个模板,T 是类型参数,可以是任何合法的类型,包括内置类型(如 int, double)或自定义类类型。T functionName(T parameter1, T parameter2, …):定义一个模板函数,参数和返回类型都是类型参数 T。函数体内的操作可以使用类型参数 T 定义的任何操作。template 或 template :声明一个模板,T 是类型参数,可以是任何合法的类型,包括内置类型(如 int, double)或自定义类类型。

2024-07-18 14:27:27 932 3

原创 C++——类和对象(初始化列表和运算符重载与静态与友元)

/ 初始化数组// 初始化向量在构造函数中的初始化:public:int x;double y;// 构造函数使用初始化列表// 构造函数体在上面的例子中,Example类的构造函数使用初始化列表来初始化成员变量x和y。// 增加操作数的值// 返回增加后的操作数ReturnType:是返回值的类型,通常是引用类型,以便支持连续操作。operator++:是前置加加运算符的函数名,用于重载前置加加运算符。():代表这是一个函数调用。

2024-07-16 13:22:31 731 2

原创 C++——类与对象

在C++中,类(Class)是一种用户定义的数据类型,用来封装数据(成员变量)和方法(成员函数),关键字为class。可以取代C语言中的结构体,并且功能更全面。析构函数的名称与类名相同,前面加上波浪号(~),不接受任何参数,也没有返回值。它在对象被销毁时自动调用。public:// 构造函数// 析构函数。

2024-07-14 15:46:36 1039 1

原创 C++入门——命名空间与输入输出与缺省参数与重载函数与引用与内联

定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。

2024-07-11 15:32:13 637 1

原创 归并排序(分治)

归并排序(Merge Sort)是一种经典的排序算法,基于分治的思想,它将待排序数组分成两个子数组,分别排序,然后合并这两个已排序的子数组以得到最终的排序结果。

2024-06-03 15:42:36 918 5

原创 二叉树——进阶(递归创建,非递归,广度优先,翻转,深度,对称)

输出当前节点的值,并将当前节点标记为上一个访问过的节点 pre,然后将当前节点设为 NULL,表示已经访问过。最后,将当前节点出栈。1, 非递归遍历树,需要用到数据结构——栈来模拟递归时的过程,并且更加复杂一些,需要判断循环终止条件,循环中对树节点的处理,需要多种数据辅助。1,二叉树是一种结构相对固定的数据,分为根,左节点,右节点,把一颗大树拆分开每部分都是如此,这就有了递归创建的条件。3,比较规则: 对称节点的比较规则是左子树的左节点与右子树的右节点比较,左子树的右节点与右子树的左节点比较。

2024-05-25 12:38:00 1094 4

原创 二叉树——初解

左孩子右兄弟法(Left Child Right Sibling representation)是一种二叉树的表示方法,它将二叉树表示为多叉树的形式,每个节点有两个指针,一个指向其左子节点,另一个指向其右兄弟节点。二叉搜索树(Binary Search Tree,BST):一种特殊的二叉树,其中每个节点的值大于其左子树中的所有节点的值,小于其右子树中的所有节点的值。父节点(Parent Node)、子节点(Child Node):一个节点的直接上级节点称为其父节点,而直接下级节点称为其子节点。

2024-05-14 20:28:52 1050 1

原创 数据结构——链表(精简易懂版)

1,链表(Linked List)是一种常见的数据结构,用于存储一系列元素。它由一系列节点(Node)组成,每个节点包含两部分:数据域(存储数据的部分)和指针域(指向下一个节点的指针)。链表的特点是节点在内存中的存储位置不必是连续的,而是通过指针来相互连接。具体可以想象成一个很多个积木连接的蛇链表可以分为单向链表和双向链表两种常见形式单向链表(Singly Linked List):每个节点包含一个指针,指向下一个节点。单向链表只能从头节点开始顺序访问,无法从尾节点快速访问到头节点。(就是上面那种)

2024-05-03 16:54:29 1134 6

原创 判断循环链表以及其环入口

做这种题需要假设举例,一定的数学推导,从例子中找出其中的普遍规律,才能快速解题。

2024-05-01 15:40:16 609 2

原创 使用C语言实现简单的贪吃蛇(学不会来砍我兄弟)

Win32 API(Windows API)是微软公司为其Windows操作系统开发的一组应用程序接口。它提供了一系列函数和数据结构,允许开发人员创建Windows应用程序并与操作系统进行交互。Win32 API包含了许多不同的功能,包括窗口管理、图形设备接口、文件和输入输出等。开发人员可以使用Win32 API编写原生的Windows应用程序,控制应用程序的行为以及与用户交互的方式。

2024-04-19 22:45:16 1075 7

原创 C语言程序编译与链接(拓宽视野的不二之选)

include 指令:用于包含其他文件的内容,分为尖括号包含系统头文件(如#include )和双引号包含用户定义的头文件(如#include “myheader.h”)。在C语言中,预处理阶段是编译过程中的第一步,主要是通过预处理器对源代码进行处理,包括宏替换、头文件包含、条件编译等操作。在独⽴的环境中,程序的载⼊必须由⼿⼯安排,也可能是通过可执⾏代码置⼊只读内存来完成。宏替换:预处理器会在编译前将代码中出现的宏名称替换为对应的值,比如将代码中的PI替换为3.14159。

2024-03-27 22:31:43 810 2

原创 震惊!C语言是这样操作文件的!

1,在C语言中,文件指针是一个用于在程序中操作文件的特殊类型指针。文件指针用于跟踪文件中的位置,以便在文件中执行读取和写入操作。2,常见的文件指针类型是FILE,它是C标准库中定义的一种结构类型。通常,我们使用 FILE* 类型的指针来引用一个文件。文件指针的主要作用是1,定位文件位置:文件指针跟踪文件中当前的读/写位置。在文件操作期间,指针会根据读写操作的进行而自动移动到相应的位置。2,进行文件操作:通过文件指针,可以进行文件的读取、写入和定位等操作。在文件操作中,文件指针的一般流程是。

2024-03-27 14:25:41 1066 1

原创 BC38 变种水仙花 ——牛客题

变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是一个Lily Number。一行,5位数中的所有 Lily Number,每两个数之间间隔一个空格。1,需要函数判断是否为 Lily Number。2,主函数打印五位数的 Lily Number。求出 5位数中的所有 Lily Number。

2024-03-20 13:05:12 219

原创 自定义类型——结构体(如何计算结构体内存)

1,结构体(Structures)是 C 语言中一种用户自定义的数据类型,它可以包含不同类型的数据成员,这些成员可以按照用户的需求进行组织。结构体允许将多个不同类型的变量组合在一起,形成一个新的数据类型,从而更方便地描述和操作复杂的数据。下面是结构体的一些重要特点和用法:2,结构体类型的关键字是 struct + 类型名定义结构体int age;上面的代码定义了一个名为 Person 的结构体,其中包含了三个成员:name、age 和 height,分别表示姓名、年龄和身高。结构体变量的声明。

2024-03-20 12:57:52 1291 1

原创 C语言——神奇的浮点数与整数储存方式

但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE754规定,存⼊内存时E的真实值必须再加上⼀个中间数,对于8位的E,这个中间数是127;具体来说,整数在内存中以固定长度的字节存储,可以是1个字节、2个字节、4个字节或8个字节,取决于整数的数据类型(如char、short、int、long等)。⽐如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。⾸先,E为⼀个⽆符号整数,这意味着,如果E为8位,它的取值范围为0 - 255;

2024-03-17 14:26:40 1003 2

原创 好玩的字符串函数与内存管理函数(计算机内存的秘密)

/求字符串长度,不包含0//复制字符串到dest//追加src到dest后面,0会被覆盖//比较字符串,直到不同时str1大返回1,相同返回0,str2大返回-1//查找c是否在str中,返回对应地址,否则返回null//找字符串str2是否包含在str1中,同上//分割字符串,delim为分割字符//进阶,限制复制字符数,下面类似原理都是类似的,就不举太多例子了,希望看了能有所收获!

2024-03-14 21:01:17 1093 1

空空如也

空空如也

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

TA关注的人

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