自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 感受命令行界面的魅力——Linux环境下基础开发工具的使用

(1)在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器, 就好比 "App" 和 "应用商店" 这样的关系。

2025-03-16 21:18:37 1139 9

原创 探索数据交互的奥秘:深入剖析缓冲区的工作原理与应用场景

缓冲区是内存空间的⼀部分。也就是说,在内存空间中预留了⼀定的存储空间,这些存储空间⽤来缓冲输⼊或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输⼊设备还是输出设备,分为输⼊缓冲区和输出缓冲区。

2025-03-16 21:17:21 969 1

原创 基础输入输出技术深度解析与实践指南

我们来看几个标志位:说明时候使用第二种传参呢,看图:第三个参数在文件不存在时使用,因为如果我们要打开的文件不存在,就会在当前路径下新建这个文件,但是它的权限是乱的,所以要加上权限,文件的默认权限是666,所以给它设置为0666就可以了。pathname: 要打开或创建的⽬标⽂件flags: 打开⽂件时,可以传⼊多个参数选项,⽤下⾯的⼀个或者多个常量进⾏“或”运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开。

2025-03-16 21:15:47 967

原创 深入理解进程替换技术及其在实现自定义shell中的应用与实践

在继续学习新知识前,我们来思考函数和进程之间的相似性。exec/exit就像call/return⼀个C程序有很多函数组成。⼀个函数可以调⽤另外⼀个函数,同时传递给它⼀些参数。被调⽤的函数执⾏⼀定的操作,然后返回⼀个值。每个函数都有他的局部变量,不同的函数通过call/return系统进⾏通信。这种通过参数和返回值在拥有私有数据的函数间通信的模式是结构化程序设计的基础。Linux⿎励将这种应⽤于程序之内的模式扩展到程序之间。如下图:⼀个C程序可以fork/exec另⼀个程序,并传给它⼀些参数。

2025-03-16 21:11:32 1009

原创 现代计算机系统进程控制原理与实践

答:“系统将父进程页表的数据段和代码段设为了只读,当子进程试图修改数据段的数据,系统就会报错,通过区域划分确认子进程要修改的是数据段的数据,这就导致虽然不允许子进程修改父进程的数据,但是由于是数据段,符合写时拷贝的条件,所以才发生了写时拷贝。它的退出码竟然为256,是的,从我们上述可知,我们只研究status的低16位。所以,fork之前⽗进程独⽴执⾏,fork之后,⽗⼦两个执⾏流分别执⾏。通常,⽗⼦代码共享,父子再不写⼊时,数据也是共享的,当任意⼀⽅试图写⼊,便以写时拷⻉的⽅式各⾃⼀份副本。

2025-03-16 21:10:29 647

原创 程序地址空间:深度解析其结构,原理与在计算机系统中的应用价值

假设我们有一个进程,它有一个变量我们将它的值设置为100,这个变量会有两个地址,一个是虚拟空间地址,一个是物理地址,都放在页表中,当我们访问这个变量的地址时,通过页表中它的虚拟地址找到它的物理地址进行访问。当子进程对这个变量修改数据时,系统会在物理内存中创建一块新的空间,然后将这块空间的地址替换子进程在页表中的这个变量的物理地址,到这一步,父子进程的这个变量的虚拟地址还是一模一样,而物理地址则发生了改变,这就是。描述linux下进程的地址空间的所有的信息的结构体是 mm_struct (内存描述符)。

2025-03-16 21:09:41 900

原创 操作系统——环境变量的奥秘与影响深度剖析

环境变量名称=内容,我们可以看到很多这种形式的环境变量,也可以看到PATH的内容是被“:”分隔开的几个路径,执行某个指令时就会依次从这些路径中找该指令的二进制文件,如果找到了就执行,直到最后一个路径都没找到就提示”command not found“。这就是一个简单的身份识别程序。字符串,这个表叫环境变量表,它的本质是一个指针数组,环境变量是由一个个字符组成的,数组各个指针各自指向一个环境变量。本质上,Linux中的一个个指令,都是程序,既然都是程序 ,为什么我们编写的程序需要带上./ ,而指令不需要呢?

2025-03-16 21:08:45 980

原创 操作系统——进程优先级切换调度与调度算法

在系统当中查找⼀个最合适调度的进程的时间复杂度是⼀个常数,不随着进程增多⽽导致时间成本增加,我们称之为进程调度O(1)算法!本章完。

2025-03-16 20:59:21 1065

原创 操作系统——进程状态与僵尸进程、孤儿进程

在上一章进程章节中,我们详细讲解了操作系统是什么,操作系统的核心功能,进程是什么,进程是如何管理的以及通过fork创建一个进程并回答了关于fork的几个问题。今天的章节,我们仍然要讲解关于进程的知识。如果你是一个学生,你在学校努力学习,那么你就是一个好学生,如果不思进取,那么就不是一个好学生,学生有多种状态,同样的,进程也会有不同的状态,本章节的知识也是围绕进程状态来展开的。

2025-03-16 20:57:57 1267

原创 操作系统——进程

•。

2025-03-16 20:56:52 558

原创 Linux第一节课——初识Linux

随着我们c语言和c++的深入学习,另一门课程——Linux也要开始新的篇章了,我们学习的c和c++语言,很多时候在实际开发中,都偏向于后端开发方向,而我们今天要了解的Linux是一个在生态上,环境上都比Windows更加适合后端开发的操作系统。Linux在服务器,云计算和嵌入式操作系统等领域都有广泛的应用,是许多开源软件和项目的基础平台。

2025-01-25 22:13:11 588

原创 c++解决常见内存泄漏问题——智能指针的使用及其原理

在c/c++程序的开发中,一些项目需要向内存手动申请空间,而手动申请的空间在我们不用时,必须手动将其释放,先不说我们其他问题,这种特有的机制,容易让我们手动向内存申请空间而忘记释放的问题。再说其他问题,如某个局部函数内部申请了资源,在它的栈帧销毁之前抛出了异常,此局部函数立即被终止了,而我们申请的资源也没有释放,这就导致了内存泄漏。所以有人提出能否把我们申请的资源交给一个对象来管理,如果我们忘记释放资源让这个对象来释放。

2024-12-31 09:28:01 5586 64

原创 编程智慧之光:深入理解哈希表的实现原理,掌握数据结构精髓(c++实现)

目录1. 哈希的概念1.1 直接定址法1.2 哈希冲突1.3 负载因子1.4 将关键字转为整数1.5 哈希函数1.5.1 除法散列法/除留余数法1.5.2 乘法散列法1.5.3 全域散列法1.5.4 其他方法1.6 处理哈希冲突1.6.1 开放定址法线性探测⼆次探测 双重散列 1.6.2 开放定址法代码实现开放定址法的哈希表结构扩容 key不能取模的问题1.6.3 链地址法 解决冲突的思路扩容 极端场景1.6.4 链地址法代码实现 而哈希映射有许多方法可以实现,我们在这里介绍几种方法,有些需要我

2024-10-31 19:53:20 1157 69

原创 平衡二叉树底层结构——红黑树(c++实现)

与AVL树一样,红黑树也是一种平衡二叉树,因其高效的结构,它与AVL树都在计算机科学中被广泛使用,它们查找的时间复杂度都是O(N)。我们在上一期已经学过了AVL树,今天这期文章将会详细地介绍红黑树,红黑树的一些操作与AVL树类似,而由于我们学过AVL树,红黑树里的一些概念我们理解起来也会更加轻松。

2024-10-31 19:52:37 7940 67

原创 平衡二叉树底层结构——AVL树

前面对map/multimap/set/multiset进行了简单的介绍,在其文档介绍中发现,这几个容器有个共同点是:其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。与二叉搜索树相同,实现一棵AVL树需要先定义一个结点类。// 需要parent指针,后续更新平衡因子可以看到int _bf;

2024-10-23 14:40:33 1267 94

原创 c++STL——map与set的使用及介绍

在上一期博客中,我们介绍了二叉搜索树的结构及使用,也了解到了二叉搜索树的结构虽然在大部分情况下搜索的速度非常快,但是它的时间复杂度最终还是由数据的插入顺序决定,所以我们要学习另一种结构——平衡二叉树,平衡二叉树的本质还是二叉搜索树,但是它解决了二叉搜索树时间复杂度由插入顺序决定的问题,所以它的时间复杂度达到了log(N),对于这样一种高效的数据结构是不是得掌握它呢。我们来看文档中关于set的介绍:翻译:1. set是按照一定次序存储元素的容器。

2024-10-16 20:46:07 2160 104

原创 c++面向对象三大特性——多态详解与虚函数,虚函数底层

在前几期章节中,我们详细介绍了c++面向对象的另一个特性——继承,而在本章节学习的关于多态的知识,是基于我们学习并了解继承的知识才能学习的知识,也就是说,多态与继承的关系密切,多态是在有了继承的基础上创造出来的产物。多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。而在继承中要构成多态还有两个必要条件(1)必须通过基类的指针或者引用调用虚函数。

2024-10-13 22:40:05 1670 82

原创 二叉树进阶——二叉搜索树(c++实现)

在数据结构部分我们学习了一部分二叉树的知识,包括二叉树实现堆及堆排序,使用递归实现链式二叉树,其中设计二叉树的应用场景很少,并不是二叉树的实用性弱,而是我们目前掌握的知识不足以使用二叉树来应付大多数应用场景。我们学习基础二叉树的知识很大一部分原因是为了学习进阶二叉树打基础,学习需要循序渐进,二叉树的学习也不是能短时间就掌握的,这一期开始我们就要开始重点介绍一些实用性强的二叉树,有了之前学习二叉树的基础,我们接下来的学习也会更加得心应手。

2024-10-10 08:09:47 1590 100

原创 常用排序算法(下)

1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序2. 时间复杂度:O(N*logN)3. 空间复杂度:O(logN)4. 稳定性:不稳定。

2024-10-05 17:00:33 2927 90

原创 常用排序算法(上)

当我们学到数据结构时,就无法避开算法,排序是一类常见且常用的算法,在日常生活中,我们在网上购物,筛选价格时用到了排序,查看该商品销量的高低时用到了排序,而这些功能都是我们程序员使用排序算法将其转化成代码实现的。既然排序如此重要,我们当然要好好把排序学好了。

2024-09-01 08:57:38 2305 99

原创 数据结构——链式二叉树的实现与分治编程思维(c语言实现)

在之前的学习中,我们初步学习了二叉树的概念和实现二叉树的顺序结构,最主要的是使用二叉树的顺序结构建堆,从而实现堆排序,这一章我们要学习的是二叉树的另一个结构——二叉树的链式结构,与顺序结构不同的是,顺序结构的底层是一个数组,链式结构是使用递归将多个结点链接起来组成的二叉树,讲到这里,递归还不是很熟悉的小伙伴需要回去复习递归的知识才能更好的理解链式二叉树的实现,话不多是,我们马上开始这一期的学习吧。

2024-08-24 14:29:44 2681 144

原创 c++进阶——继承的定义,复杂的菱形继承及菱形虚拟继承

当我们学到这一章时,已经学完了c++初阶的大部分内容,也将正式进入c++进阶的内容。在掌握更多技术的同时,我们学习的知识也将越来越有挑战性,需要我们日复一日的坚持将它们学完,我们也要相信我们学习的知识不会辜负我们。继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。

2024-08-20 00:27:50 1725 119

原创 c++模板进阶——模板特化和模板分离编译

我们之前的章节简单的介绍了模板初阶的知识,了解了模板的使用和重要性,因为我们那时学习的知识不足以理解模板进阶的大部分内容,而在经过学习模板初阶之后知识之后,我们已经初步具备学习模板进阶知识能力。一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式(编译原理我们在c语言模块了解过一点)。

2024-08-13 12:58:45 1978 122

原创 c++STL中stack,queue使用方法和模拟实现,及适配器模式编程

1.1 stack的介绍栈是计算机中一个重要的数据结构,因其先进先出的特性,可以解决许多结构上的问题,进行栈的学习,了解它的底层是很有必要的。1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。

2024-08-10 01:11:29 1440 117

原创 c++STL中list介绍,模拟实现和list与vector对比

我们在前几期已经详细介绍了STL中string,vector容器的使用及模拟实现,不难发现,string和vector的结构很相似,他们在物理上都是连续的结构,想访问下一个位置的数据,只需要让相应容器的迭代器自增就可以实现,而我们今天要介绍的list,则无法用这种方法访问下一个位置数据,这也是我们在这一期需要解决的问题。1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。

2024-08-06 20:29:37 1913 98

原创 c++STL容器中vector的使用,模拟实现及迭代器使用注意事项和迭代器失效问题

在前面的章节我们已经接触过了关于STL的知识,也就是string类,我们详细介绍了string类的特性及使用,而严格来说string类并没有被归为STL中,因为string类的出现早于STL,string类的接口也比STL中的单个类多,使得string类较其他类显得冗余,这一期我们就要开始讲STL中的内容。1. vector是表示可变大小数组的序列容器。2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。

2024-08-01 18:40:23 1831 94

原创 c++初阶知识——string类详解

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

2024-07-25 12:00:15 2653 104

原创 c++初阶知识——初识模板

class 类模板名// 类内成员定义// 类模版public:_size = 0;// 模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误,具体原因后面会讲// 扩容++_size;

2024-07-19 10:37:56 1636 100

原创 c++初阶知识——内存管理与c语言内存管理对比

我们在c语言模块已经学过了关于内存管理的知识,其中c语言最具特点的内存管理就是有关于动态内存管理部分。

2024-07-18 21:15:01 1784 68

原创 c++初阶知识——类和对象(下)

(3)引⽤成员变量const成员变量没有默认构造的类类型变量,必须放在初始化列表位置进⾏初始化,否则会编译报错。(4)C++11⽀持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显⽰在初始化列表初始化的成员使⽤的。(5)尽量使⽤初始化列表初始化,因为那些你不在初始化列表初始化的成员也会⾛初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会⽤这个缺省值初始化。如果你没有给缺省值,对于没有显⽰在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。

2024-07-17 05:01:54 1683 64

原创 c++初阶知识——类和对象(中)

目录1.类的默认成员函数2.构造函数 3.析构函数 4.拷贝构造函数5.运算符重载 5.1 赋值运算符重载 5.2 使用运算符重载等特性实现日期类 6.取地址运算符重载6.1 const成员函数 6.2 取地址运算符重载 默认成员函数就是⽤⼾没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类,我们不写的情况下编译器会默认⽣成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最后两个取地址重载不重要,我们稍微了解⼀下即可。其次就是C++11以后还会增加两个默认成员函数,移动

2024-07-16 03:41:14 1839 68

原创 c++初阶知识——类和对象(上)

(1)class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。public:// 成员函数perror("malloc申请空间失败");return;top = 0;// ...扩容int Top()private:int* arr;int size;st.Init();

2024-07-11 20:28:19 2249 76

原创 C++入门基础篇(下)

以上这个程序就是对引用在对函数传参时效率提高的体现,通常我们如果要交换两个数的值,如果要写一个函数实现,我们必须将两个数的地址,由指针来交换它们的值,而我们在c++学了引用之后,我们也可以使用引用接收两个数的值来交换两个数的值。C++的引⽤跟其他 语⾔的引⽤(如Java)是有很⼤的区别的,除了⽤法,最⼤的点,C++引⽤定义后不能改变指向, Java的引⽤可以改变指向。C++中指针和引⽤就像两个性格迥异的亲兄弟,指针是哥哥,引⽤是弟弟,在实践中他们相辅相成,功 能有重叠性,但是各有⾃⼰的特点,互相不可替代。

2024-07-10 18:18:11 1938 36

原创 c++入门基础篇(上)

(1)定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等int i = 20;//定义变量} //定义函数(2)namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不再冲突了int main()return 0;(3)C++中域有函数局部域,全局域,命名空间域,类域;

2024-07-09 19:49:24 1553 38

原创 数据结构——二叉树之c语言实现堆与堆排序

在上一期我们介绍了有关于树的基础概念,了解了关于树的各名称的含义,然而在现实中树被用得最多的场景还是在我们计算机中的资源管理器的文件存储结构中,在其他场景被使用的情况很少,所以我们这一期要介绍一种被广泛使用的树型结构——二叉树。

2024-07-08 18:12:48 2511 63

原创 数据结构——树的基础概念

目录1.树的概念2.树的相关概念 3.树的表示(1)直接表示法(2)双亲表示法 (3)左孩子右兄弟表示法 4.树在实际中的运用(表示文件系统的目录树结构) 树是一种非线性的数据结构,它是由n(n>=0个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。我们现实中的树是这样的:而我们数据结构中的树是这样的:有一个特殊的结点,称为根结点,根结点没有前驱结点除根结点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合

2024-07-04 12:59:17 4867 69

原创 (超详细)数据结构——“队列”的深度解析

队列与栈都是线性表,它们的结构也非常类似,都是一头进一头出,那么它们有什么区别吗?答案是有的,虽然它们同为线性表,但是栈的出栈入栈方式为后进先出,而队列的出栈入栈方式为先进先出,具体我们在正文讲解。

2024-07-02 01:20:15 3056 63

原创 (超详细)数据结构——“栈”的深度解析

在前几章我们介绍了线性表的基本概念,也讲解了包括顺序表,单链表,双向链表等线性表,相信大家已经对线性表比较熟悉了,今天我们要实现线性表的另一种结构——栈。

2024-06-30 14:43:27 1698 60

原创 数据结构——带头双向循环链表(c语言实现)

我们在前几期详细地讲解了不带头单向不循环链表(单链表),使用它的底层代码实现了一个简单的通讯录项目,也介绍了链表分为八种,但是其中最常用的只有两种:(1)不带头单向不循环链表,(2)带头双向循环链表,今天我们要讲解的就是第二种带头双向循环链表。

2024-06-26 19:18:31 4108 58

原创 数据结构:为什么说链表是顺序表的升级版(c语言实现单向不带头单链表)

我们在之前的几篇文章中详细的讲解了顺序表的特点,增删改查操作和动态顺序表的优点,并使用顺序表的底层结构实现了通讯录项目,似乎顺序表是一个非常完美的数据结构,它可以实现按照需求实现增删查改,对内存的控制也较为合理,空间都是在需要时手动开辟的。但是顺序表真的完美吗?事实上它并不完美,经过我们思考,顺序表还是存在一些问题,例如:(1)。这些问题都是我们应该考虑的,而我们接下来要介绍的另一种数据结构——链表,就能在实现属性表的各个功能的前提下很好的解决这些问题。

2024-06-22 13:57:49 3997 54

空空如也

空空如也

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

TA关注的人

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