自定义博客皮肤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)
  • 收藏
  • 关注

原创 C++之类型转换以及特殊类的设计

首先让我们来回顾一下C语言中的类型转换。在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。这中转换方式是有一定的缺陷的,转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换,于是C++就引入了四种类型转换:static_cast、reinterpret_cast、const_cast、dynamic_cast,接下来让我们一一认识一下。

2024-12-13 15:38:25 807

原创 C++之C++11新特性(三)--- 智能指针

如果我们在div中b为0的话,我们的程序将会抛出异常,使得在Func函数cout之后的语句都不会执行,那就会导致p1,p2所指向的资源没有被及时的释放,就会导致资源泄露的问题,所以很明显,这里我们需要采取一些其他方法来管理我们的资源,在讲其他方法之前,先让我们来看看内存泄漏。

2024-11-29 14:51:54 705

原创 C++之C++11新特性(二) --- function包装器与lambda表达式

在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法,如果待排序元素为自定义类型,需要用户定义排序时的比较规则。不难发现当我们想要对自定义类型进行排序时,还需要我们额外的写类来实现我们的仿函数,很明显这是一个很麻烦的事情。于是C++11后,就有了lambda表达式来帮助我们解决这个问题,来看看用lambda表达式的方式解决上述问题的方法。可以很明显的发现代码量小了很多,同样也非常容易理解意思,当然从使用方法来看,不难发现lambda表达式实际是一个匿名函数。

2024-11-01 16:52:27 875

原创 C++之C++11新特性(一)--- 列表初始化与右值引用

1. 左值引用只能引用左值,不能引用右值。2. 但是const左值引用既可引用左值,也可引用右值。

2024-10-30 14:37:47 867

原创 Linux基础之文件系统

首先我们能认识到的一点是:不是所有的文件都被打开的!大部分文件都不是被打开的(当前并不需要被访问),都在磁盘中进行保存。那么没有被(进程)打开的文件,要不要管理呢?对于这部分文件的核心工作是什么呢?-- 肯定是需要管理的,以便于快速定位(根据路径)。文件的管路工作(文件系统 -- 文件的存储的问题):1.打开的文件进行管理2.没有被打开的文件也要在磁盘中进行管理首先打开的文件会由我们的OS创建struct file进行管理,那未打开的文件呢。在讲这个之前,我们先来认识一下磁盘的结构。

2024-09-24 14:44:46 948

原创 C++之哈希 --- 哈希的应用(位图&布隆过滤器)

在如今网络交通高度发达的时代,网购已经成为我们日常生活中的一部分。没当双11到来,各大平台都会迎来一次网购的高潮。这就会让服务器短时间内获得高达几十亿上百亿的数据,那我们该如何去处理这海量的数据呢?这里给大家上一个腾讯的面试题。面对如此海量的数据,我们传统的容器(如unordered_map,map,vector等)似乎都无法驾驭这如此庞大的数据量。那我们该如何解决这个问题呢?先给出两种常规的思路:第三种方法当然是采用我们的位图啦,那什么是位图呢?其又是如何解决这个问题的呢?位图概念。

2024-09-23 08:34:51 695

原创 Linux基础I/O之缓冲区

缓冲区这个概念,我相信大家或多或少的有听到过,那么其到底是个什么东西呢?简单地理解一下,其可以被看做一部分的内存(可以认为是malloc来的)。那为什么要有缓冲区这个东西呢?其有什么作用呢?先说结论,缓冲区的主要作用就是来提高我们的效率(提高使用者的效率,提高发送效率)。那其是如何做到提高效率的呢?这里我给大家举个例子:比如说发快递,通常我们寄快递都会送到菜鸟驿站,但是其不会立刻将我们的快递发送出去而是会积累一部分快递,等到一定程度再进行发送。

2024-08-22 22:40:28 769

原创 C++之哈希---哈希概念与哈希桶&哈希表的模拟实现

我们都知道在顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(log_2 N),搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。

2024-08-21 20:13:08 603

原创 Linux基础I/O之文件描述符fd & 重定向(下)

而我们又知道,标准输出的文件描述符是1,如果我们通过文件描述符将标准输出关闭,并打开一个新的文件,根据我们的文件描述符分配原则,这个文件的文件描述符将会是1。这里面首先有属性我们可以理解,缓冲区我们之后说,那么这个文件的操作方法集是什么呢?--- 首先我们可以知道各种硬件设备,根据我们之前的理论中(Linux下一切皆文件),其也是各种文件,那如果我们想要操作不同的硬件设备,是不是要使用不同的读写方法,那如果我们要对每一个文件都维护一个不同名的操作方法,到时候用起来是不是很麻烦,所以我们采取一种不同的策略。

2024-07-27 12:43:23 613

原创 Linux基础I/O之文件描述符fd & 重定向(上)

当我们想要访问一个文件时,首先肯定是要将这个文件打开,打开后将其加载到内存当中,而加载磁盘上的文件,就一定会需要访问磁盘,那么这样的工作是谁来做呢 --- 肯定是我们的操作系统来做的。--- 操作系统需要管理打开的文件 --- 先描述在组织 --- 那么一个文件要打开,一定要现在内核中形成被打开的文件对象。flags:表示打开文件的方式,这里的 flags 采取位图的方式,一次性来标志多个位置,根据各个位置的值,来判断,打开文件的方式。首先我们要明确的一个观点是 --- 文件 = 内容 + 属性。

2024-06-16 19:09:42 645

原创 C++之红黑树 + 手撕红黑树

通过上面的基本性质和要求,我们就已经可以定义出红黑树节点的基本结构了(这里我们采用枚举类型来标识颜色)。

2024-06-12 19:11:57 884

原创 Linux基础之进程替换

----执行全新的代码和访问全新的数据,不在和父进程有瓜葛------ 而这一过程就可以理解为程序替换。很明显,执行结果也是没有问题的,这里可能有人会问,为什么我所传入的参数有两个 “ls” ,这第一个 ls 代表是要进行程序替换的指定文件名(路径虽然有了,但是你也需要告诉系统是去哪个文件中执行哪个命令吧),那么第二个就是要执行的命令咯。不难发现,我们刚刚在传参的时候,传入了具体的路径,/usr/bin/ls ,而p则代表的系统会帮我们导入当前环境的环境变量PATH,这样就能简化我们的传参内容。

2024-06-12 18:38:50 950

原创 C++进阶之AVL树+模拟实现

int _bf;, _kv(kv),_bf(0){}这里采用了我们的KV模型进行定义。

2024-06-02 19:11:54 720

原创 Linux基础之进程等待

进程等待是指一个进程在执行过程中暂时停止,并等待某个条件满足后再继续执行的状态。这种等待通常是由于某些事件需要发生,或者某些资源需要被释放,才能使得进程继续执行。进程等待通常发生在多任务操作系统中,其中多个进程共享有限的资源,需要协调资源的使用和访问。其实对于进程等待这个概念,我们是有一个基本的了解的,那么我们该如何理解进程等待的意义呢,又如何去观测这样一个过程呢?这就是本节所要提及的东西。

2024-06-02 17:23:15 1038

原创 Linux基础之进程控制--进程的创建和退出

目录一、进程的创建二、进程的终止2.1 进程退出的场景2.2 main()函数的返回值2.3 用exit和_exit进行退出2.4 进程异常终止一、进程的创建 关于一个进程是如何被创建出来的,我们已经有所介绍这里我在给大家补充些东西。 首先,我们知道当一个子进程被父进程创建时,子进程会拷贝父进程的PCB,进程地址空间,页表等,然后跟父进程指向同一块物理地址执行接下来的代码。而如果,当我们的子进程进行写入、修改某些值时,就会触发写时拷贝,从

2024-05-29 10:11:48 1035

原创 C++进阶之map和set

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

2024-05-24 17:52:49 730

原创 Linux基础之程序地址空间

这张图其实就是我们的程序地址空间的基本结构,这部分空间我们的OS肯定也是要进行管理的,那怎么进行管理呢?我们可以这样理解,我们的进程肯定需要需要一些内存,于是我们的OS就给我们的进程画了一张饼(意思就是给你多少空间呀),而这个画的饼就是我们的地址空间,而我们的大饼并不是实实在在的东西,并不真的物理地址空间,所以我们又可以称其为虚拟地址。当我们子进程修改部分变量的值时,为了确保进程间的独立性,所以在物理地址上重新开辟一块空间,拷贝父进程物理空间的数据,然后再进行写时拷贝,最后再改变子进程页表的映射关系。

2024-05-24 11:44:28 654

原创 C++进阶之搜索二叉树

比如英汉词典就是英文与中文的对应关系,通过英文可以快速找到与其对应的中文,英文单词与其对应的中文就构成一种键值对。每一个关键码key,都有与之对应的值Value,即的键值对。K模型即只有key作为关键码,结构中只需要存储Key即可,关键码即为需要搜索到的值。从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。

2024-05-22 10:24:51 861

原创 Linux基础之环境变量与命令行参数

我们要知道,我们所运行的各种指令和程序,都是我们的bash的子进程,而我们bash会将其持有的环境变量传给其子进程。环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。我们可以运用C语言的文件操作相关的知识。我们可以根据我们的命令行参数的输入,来判断我们要执行的效果,请看代码。

2024-05-22 09:08:00 736

原创 C++进阶之多态

首先我们要明确一个观点,那就是多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为,就比如我们刚刚所说买票的例子。必须通过基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。一定要记住这个概念!!!那么问题来了,虚函数是什么呢,重写又是什么意思呢?对比一下覆盖、重载、隐藏的关系inline函数可以是虚函数,普通调用时正常展开,多态调用加入虚表,inline失效。

2024-05-18 16:00:48 1819

原创 Linux基础之进程切换

这个想法是不错,但是会不会有一种情况,你后面来的进程优先级都很高,那就会导致我们后面优先级低的进程迟迟得不到执行,这就会导致我们上文所说的进程饥饿的问题。OS为了均衡,很明显是不可能让这种情况发生的,所以我们的OS就维护了一个过期队列,让我们后来的进程加入到过期队列中,让我们优先级低的进程也可以很好的被访问,是不是很细节。还值得一提的是,我们的bitmap扫描队列中是否存在元素的速度是很快的,常数时间,而我们的活跃队列去找到被调度的元素也是很快的,这就是在这之中的大O(1)算法。那么什么是进程间的切换呢?

2024-05-18 10:11:07 1054

原创 C++进阶之继承

上面我们看到Person是父类,也称作基类。Student是子类,也称作派生类。这就是继承关系的基本定义格式。很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。

2024-05-16 14:28:59 917

原创 Linux基础之进程的优先级

这是因为我们的OS在调度进程时,为了去实现一个平衡,如果随意的让用户去设置我们进程的优先级的话,就会很有可能导致一些优先级的进程一直被调度不到,长时间的得不到CPU的资源,那这种现象我们就称为。这样我们一个进程的优先级就被修改成功了,但是我们这是让我们的优先级变小了,如果想让我们的优先级变大,普通用户的权限是不够的,要使用我们的sudo 指令 或者 切换成我们的root权限去修改。这里我们来拿我们的优先级和我们的权限来对比一下(其实这两本质上搭不上关系,这里是来促进我们对一些概念的理解)。

2024-05-16 10:04:10 547

原创 Linux基础之僵尸进程与孤儿进程

在上一篇文章中,我们有提到过进程的死亡状态的概念,而我们的进程在其真正死亡之前还会有一个状态,叫做僵尸状态。这里再给大家具体介绍一下什么是僵尸状态:僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死(尸)进程僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。1.2 为什么要有僵尸状态首先问一个问题,为什么我们要创建一个进程呢。

2024-05-15 20:54:13 494

原创 C++进阶之模板-模板特化

优点:1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性缺点:1. 模板会导致代码膨胀问题,也会导致编译时间变长2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误总的来说,模板是利大于弊的,多使用模板也可以降低我们的工作量。

2024-05-15 09:26:46 806

原创 Linux基础之进程-进程状态

首先我们知道我们的操作系统是通过我们的PCB来管理我们的进程的,那么我们的状态这个属性一定在我们的PCB这个结构体里(其在PCB中是一个整形字段)。用简单的话来说,用宏定义(也可能是其他方式)了几个值,用这几个值来代表我们不同的状态。struct PCB...//其他属性int status;//状态}//通过改变status的值来代表改变进程的状态根据一些教材上的描述,进程大概会有以下的一些状态。(图片来源于网络)。

2024-05-14 22:12:33 773

原创 Linux基础之进程-fork()函数的详解

在上节内容中我们已经学会了使用我们的getpid()和我们的getppid()去查看我们进程的pid,并且学习到了两种查看进程的方式,在我们的正文开始之前,我先对上文的一些内容做一些补充。在第二种查看进程的方式中我们看到一个进程的详细信息:即上图的右半部分,这里我们主要对其中的 cwd 和 exe 进行说明。

2024-05-13 13:03:27 916 2

原创 Linux基础之进程的基本概念

进程是什么?课本概念:程序的一个执行实例,正在执行的程序等。内核观点:担当分配系统资源(CPU时间,内存)的实体。这个概念比较的官方,等会我可以给大家讲一讲我是怎么去理解进程这个概念的。

2024-05-11 17:54:10 854

原创 Linux基础之冯诺依曼体系结构

计算机体系结构是指计算机硬件和软件之间的组织结构和交互方式。它涵盖了计算机系统的各个组成部分以及它们之间的相互作用,包括处理器、存储器、输入输出设备、总线、操作系统和应用软件等。处理器(CPU)存储器(Memory)输入输出设备(I/O Devices)总线(Bus)操作系统(Operating System)应用软件(Application Software)1.2 冯诺依曼体系结构根据上面的描述,那么冯诺依曼是一种怎样的交互方式呢?

2024-05-09 16:48:16 528

原创 C++之STL-priority_queue和仿函数的讲解

优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。

2024-05-08 17:29:47 2134

原创 Linux基础之git与调试工具gdb

Git是一种分布式版本控制系统,广泛用于软件开发中跟踪文件变化。它允许多个开发者同时合作,记录文件的修改历史。版本控制:Git可以跟踪文件的变化历史,开发者可以随时查看和恢复到先前的版本。这有助于管理项目的演进,并促进团队成员之间的协作。分布式:与集中式版本控制系统不同,Git是分布式的,意味着每个开发者都在本地拥有完整的代码库副本。这使得可以离线工作,并且大多数操作都可以在本地进行,提高了效率。分支与合并:Git允许开发者创建分支,即独立的开发线,用于开发新功能或修复bug,而不影响主代码库。

2024-05-07 09:38:57 1152

原创 Linux基础之makefile/make

这段代码很有意思,当我们要创建mybin时,目录中却没有code.o,怎么办,那么他就会在makefile中从上至下的去找,看有没有关于code.o的依赖关系,很明显根据这段代码他一直会往下找,直到遇到code.c(该文件在目录中存在),这往下找的过程其实可以看做时一个入栈的过程,而当找到code.c,那么接下来就会相当于一个出栈的过程一直生成所要的文件。那么其和谁去对比呢?不要忘了,我们生成的可执行程序也是一个文件,要知道重新编译的本质不就是重新写入一个二进制可执行文件吗,那么其的修改时间就一定会更改。

2024-05-06 19:03:45 704

原创 Linux基础之gcc/g++

在我们写程序的时候,我们会发现我们明明没有实现输出的功能,却可以用printf这个函数将想要的内容打印到显示器上。这是因为我们使用这个函数是有前提的,我们需要包含一个stdio.h的头文件,这其实就是我们的前辈写好的库,而我们程序如果要用printf这个函数的话,就需要依赖于第三方库。在Linux中,我们可以使用相关指令去查看我们引用了哪些第三方库。ldd(list dynamic dependencies)是一个用于查看可执行文件或者共享库文件所依赖的动态链接库的命令。

2024-05-04 21:49:40 1889

原创 Linux基础之yum和vim

这里用一张图来概括本章所讲。本章节的指令很多,还需要大家多多练习和消化。

2024-05-04 17:39:36 958

原创 C++之STL-栈和队列+容器适配器+deque的基本讲解

栈和队列的基本讲解

2024-05-03 16:41:47 1108

原创 Linux基础之权限

目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)。而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限,所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。

2024-04-30 15:08:54 910 2

原创 Linux基础之基础指令(二)

cat [选项][文件]查看目标文件的内容。

2024-04-29 16:21:05 472

原创 Linux基础之基础指令(一)

cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息。mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录。对于目录,该命令列出该目录下的所有子目录与文件。Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。

2024-04-28 16:37:00 651

原创 C++之STL-list+模拟实现

list基本用法和模拟实现

2024-04-26 21:22:01 915

原创 C++之STL-vector+模拟实现

vector的了解以及模拟实现

2024-04-25 18:07:50 741 1

空空如也

空空如也

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

TA关注的人

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