自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux--库制作与原理

⽐如我们去运⾏⼀个程序,操作系统会⾸先将程序的数据代码连同它⽤到的⼀系列动态库先加载到内存,其中每个动态库的加载地址都是不固定的,操作系统会根据当前地址空间的使⽤情况为它们动态分配⼀段内存。编译和链接这两个步骤,在Windows下被我们的IDE封装的很完美,我们⼀般都是⼀键构建⾮常⽅便,但⼀旦遇到错误的时候呢,尤其是链接相关的错误,很多⼈就束⼿⽆策了。的⽂件,它们被称作⽬标⽂件。随着软件复杂度的提升,我们的操作系统也越来越臃肿,不同的软件就有可能都包含了相同的功能和代码,显然会浪费⼤量的硬盘空间。

2025-03-31 14:23:59 426

原创 Linux--文件系统

1.理解硬件1-1 磁盘、服务器、机柜、机房•机械磁盘是计算机中唯⼀的⼀个机械设备•磁盘--- 外设•慢•容量⼤,价格便宜。

2025-03-31 14:23:31 208

原创 Linux--基础IO

⾸先,在windows中是⽂件的东西,它们在linux中也是⽂件;打开⽂件的⽅式不仅仅是fopen,ifstream等流式,语⾔层的⽅案,其实系统才是打开⽂件最底层的⽅。⽆缓冲区:⽆缓冲区是指标准I/O库不对字符进⾏缓存,直接调⽤系统调⽤。操作⽂件,除了上⼩节的C接⼝(当然,C++也有接⼝,其他语⾔也有),我们还可以采⽤系统接⼝来。读写⽂件时,如果不会开辟对⽂件操作的缓冲区,直接通过系统调⽤对磁盘进⾏操作(读、写等),那么。打开⽂件,本质是进程打开,所以,进程知道⾃⼰在哪⾥,即便⽂件不带路径,进程也知道。

2025-03-30 11:24:06 784

原创 Linux--进程控制

1.进程创建1-1 fork函数初识在linux中fork函数是⾮常重要的函数,它从已存在进程中创建⼀个新进程。新进程为⼦进程,⽽原进程为⽗进程。进程调⽤fork,当控制转移到内核中的fork代码后,内核做:•分配新的内存块和内核数据结构给⼦进程•将⽗进程部分数据结构内容拷⻉⾄⼦进程•添加⼦进程到系统进程列表当中•fork返回,开始调度器调度当⼀个进程调⽤fork之后,就有两个⼆进制代码相同的进程。⽽且它们都运⾏到相同的地⽅。但每个程都将可以开始它们⾃⼰的旅程,看如下程序。

2025-03-30 09:38:17 575

原创 Linux--进程地址空间

物理地址,⽤⼾⼀概看不到,由OS统⼀。个mm_struct结构,在每个进程的task_struct结构中,有⼀个指向该进程的结构。如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪。我们发现,输出出来的变量值和地址是⼀模⼀样的,很好理解呀,因为⼦进程按照⽗进程为模版,⽗。在早期的计算机中,要运⾏⼀个程序,会把这些程序全都装⼊内存,程序都是直接运⾏在内存上的,例如某台计算机总的内存。的实际内存地址每⼀次运⾏都是不确定的,⽐如:第⼀次执⾏a.out时候,内存当中⼀个进程。

2025-03-29 20:57:34 694

原创 Linux--进程概念

queue[140]: ⼀个元素就是⼀个进程队列,相同优先级的进程按照FIFO规则进⾏排队调度,所以,bitmap[5]:⼀共140个优先级,⼀共140个进程队列,为了提⾼查找⾮空队列的效率,就可以⽤。可以在内核源代码⾥找到它。R运⾏状态(running): 并不意味着进程⼀定在运⾏中,它表明进程要么是在运⾏中要么在运⾏。需要强调⼀点的是,进程的nice值不是进程的优先级,他们不是⼀个概念,但是进程nice值会影。并发: 多个进程在⼀个CPU下采⽤进程切换的⽅式,在⼀段时间之内,让多个进程都得以推进,称。

2025-03-29 20:27:10 830

原创 Linux--基本指令

管道可以把前一个指令加工后的数据作为后一个指令的参数。

2024-09-28 22:13:17 662 1

原创 C++--IO流

空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输。使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系。类的三个不同的对象,因此这三个对象现在基本没有区别,只是应用场景不。语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?备(显示器)输出的过程。输出:严格按照题目的要求进行,多一个少一个空格都不行。即是流动的意思,是物质从一处向另一处流动的过程。类型的对象,那么这里可以做逻辑条件值,源自于。的概念,然后解析缓冲区的内容,返回一个。

2024-09-27 21:33:05 1262

原创 C++--类型转换

我们知道C++中父类指针或者是引用可以指向子类,那有办法让子类指向父类吗?否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用。隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败。个人理解和C语言的隐式类型转换类似,不过为了规范才这样做。显式类型转换将所有情况混合在一起,代码不够清晰。,每次使用强制类型转换前,程序员应该仔细考虑是。显式类型转化:需要用户自己处理。提出了自己的类型转化风格,注意。的简称,即:运行时类型识别。域,以减少发生错误的机会。

2024-09-27 18:25:20 570

原创 C++--特殊类设计

为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有。

2024-09-25 22:18:59 736

原创 C++--智能指针

内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现。智能指针对象中引用计数是多个智能指针对象共享的,两个线程中智能指针的引用计数同时。工程前期良好的设计规范,养成良好的编码规范,申请的内存空间记着匹配的去释放。指针可以解引用,也可。智能指针管理的对象存放在堆上,两个线程中同时去访问,会导致线程安全问题。掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。,接着控制对资源的访问使之在对象的生命周期内始终保持有效,,就说明自己不使用该资源了,对象的引用计数减。

2024-09-23 23:55:33 996

原创 C++--异常

随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象,返回错误码的传统方式有个很大的问题就是,在函数调用链中,深层的函数返回了错误,那。异常会导致程序的执行流乱跳,并且非常的混乱,并且是运行时出错抛异常就会乱跳。异常尽量规范使用,否则后果不堪设想,随意抛异常,外层捕获的用户苦不堪言。二、函数是否抛异常、抛什么异常,都。标准库的异常体系定义得不好,导致大家各自定义各自的异常体系,非常的混乱。

2024-09-22 18:48:36 758

原创 C++--C++11(下)

阶段呢,我们掌握一些基础的可变参数模板特性就够我们用了,所以这里我们点到为止,以后大。只能通过展开参数包的方式来获取参数包中的每个参数,这是使用可变模版参数的一个主要特。默认生成的移动构造函数,对于内置类。型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动构造,,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改。函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对。函数对象,又称为仿函数,即可以想函数一样使用的对象,就是在类中重载了。

2024-09-22 17:24:56 1768

原创 C++--C++11(上)

进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为。增加的语法特性非常篇幅非常多,我们这里没办法一 一讲解,所以本节课程。年磨一剑,第二个真正意义上的标准珊珊来迟。标准委员会成立的第一年,本来计划以后每。标准委员会曾经提交了一份技术勘误表。主要讲解实际中比较实用的语法。的下一个版本的时候,一开始计划是。年发布,所以最初这个标准叫。年视实际需要更新一次标准,的意思是不知道到底能在。时候也没完成,最后在。

2024-09-20 07:48:06 886

原创 C++--哈希的应用

我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉。布隆过滤器的思想是将一个元素用多个哈希函数映射到一个位图中,因此被映射到的位置的比特。所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。一种支持删除的方法:将布隆过滤器中的每个比特位扩展成一个小的计数器,插入元素时给。亿个不重复的无符号整数,没排过序。数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一。他元素的比特位重叠,此时布隆过滤器告诉该元素存在,但实该元素是不存在的。

2024-09-19 14:52:59 923

原创 C++--哈希

个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同,本文中只对unordered_map。,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此。提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到。的查询是,进行很少的比较次数就能够将元素找到,因此在。将相同哈希值的键值对放在相同的桶中。快,但它通常在遍历元素子集的范围迭。键值对的关联式容器,其允许通过。

2024-09-19 14:32:00 1058

原创 C++--map和set

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

2024-08-19 12:14:49 829

原创 C++--二叉搜索树

问题:如果退化成单支树,二叉搜索树的性能就失去了。个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二。a、从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。在二叉搜索树中检索该单词是否存在,存在则拼写正确,不存在则拼写错误。插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。b、最多查找高度次,走到到空,还没找到,这个值不存在。叉搜索树的深度的函数,即结点越深,则比较次数越多。,统计成功后,给定单词就可快速找到其出现的次数,

2024-08-19 11:51:16 688

原创 C++--多态

1.多态概念多态的概念:通俗来说,就是多种形态,。2.多态的定义以及实现2.1虚函数虚函数:即被virtual修饰的类成员函数称为虚函数。2.2在继承中要1.必须通过基类的指针或者引用调用虚函数2.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写2.3虚函数的重写虚函数的重写覆盖,称子类的虚函数重写了基类的虚函数。1.派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。

2024-07-09 20:08:13 319

原创 C++--继承(下)

无论派生出多少个子类,都只有一个static成员实例。

2024-07-09 10:43:25 486

原创 C++--继承(上)

1.1概念继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。1.2定义1.2.1格式。

2024-06-09 21:06:48 1045

原创 C++--模版进阶

模版参数不止类型,还有常量参数(浮点数、类对象以及字符串是不允许作为非类型模板参数的,)C++20支持double等内置类型,非类型的模板参数必须在编译期就能确认结果。我们知道写个比较大小的模版函数,一般人都是传对应类型的值,但是总有一些二般人传入的值比较奇怪如传入对应类型值的地址,所以我们就需要对模版进行特殊处理。一般情况下如果函数模板遇到不能处理或者处理有误的类型,为了实现简单通常都是将该函数直接给出。4. 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。

2024-06-07 10:23:22 941

原创 C++--priority_queue和仿函数

优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的,其实就是个堆,默认是大根堆。所以我们写个大于小于逻辑的仿函数,并在创建priority_queue时传入此类即可。引入仿函数实现定义类型时就能决定大小堆。

2024-06-06 21:15:24 411

原创 C++--stack和queue

但是,deque有一个致命缺陷:不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到 某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作 为stack和queue的底层数据结构。与vector比较,deque的优势是:头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不需要搬移大量的元素,因此其效率是必vector高的。

2024-06-06 20:50:03 630

原创 C++--list

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

2024-05-31 09:48:51 995

原创 C++--vector

1. vector是表示可变大小数组的序列容器。2.就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。3.与其它动态序列容器相比(),vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好。

2024-05-30 14:20:31 1134

原创 C++--string

c语言中虽然也有字符串,但是其与对应的函数是分离的,不符合c++中面向对象的思想。而且c++中的string类使用起来更方便、快捷。1. string是表示字符串的字符串类2.该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。

2024-05-29 15:32:31 1205

原创 C++模版初阶&STL简介

class 类模板名// 类内成员定义标准模板库是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

2024-05-21 17:19:43 933 1

原创 C&C++内存管理

在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。• new的原理1. 调用operator new函数申请空间2. 在申请的空间上执行构造函数,完成对象的构造• delete的原理1. 在空间上执行析构函数,完成对象中资源的清理工作2. 调用operator delete函数释放对象的空间• new T[N]的原理。

2024-05-05 15:39:27 1378

原创 C++类与对象(下)

比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接 访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。内部类是一个独立的类, 它不属于外部类,更不能通过外部类的对象去访问内部类的成员。内部类天生就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访 问外部类中的所有成员。友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。

2024-05-02 12:33:49 911 1

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

上一章介绍到类中的成员函数第一个参数默认是this指针,这章将对类中的成员函数作详细介绍。

2024-04-28 12:06:45 1283 3

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

C++更为主流的写法是使用class关键字来定义类//class后加类名//类体//类中的方法叫作成员方法//类中的变量叫作成员变量int age;类中的成员方法有两种声明定义方式:1.声明定义分离,假如类在.h中,且方法在类中只进行了声明,方法的定义在.cpp中,则.cpp除了需要包含.h之外,还需要在方法名前加上:(类会产生类域)。2.声明定义都在类中,编译器可能会把其当成内联函数。

2024-04-21 16:44:35 923 2

原创 C++入门基础(2)【函数重载、引用、内联函数、auto、范围for、nullptr】

在C++中,汇编指令里的函数名不仅仅只有函数名,还使用了函数的参数进行修饰,使用了参数进行修饰的函数名更加复杂,但也使得C++能支持函数重载。引用类型的变量不会创建一个新的变量,而是为另一个变量取一个别名,从语法层面上看,引用不会开空间,引用类型的变量和被引用的变量占用同一块空间。当引用作为函数的参数时,能起到类似指针的效果,若给一个函数传入大量参数,值传参需要浪费大量空间,引用则只需要取别名;同一作用域中同名的函数,且这些同名函数的参数个数不同或参数类型不同或参数顺序不同。

2024-04-20 17:59:02 766 1

原创 C++入门基础(1)【命名空间、输入输出、缺省函数】

当我们想定义一个命名空间时,需要使用namespace关键字。//namespace后加命名空间的名字,然后加一对{}即为命名空间//命名空间中可以定义类型、变量、函数int i;

2024-04-15 14:36:40 786 1

原创 五大排序(上半部分):插入排序,选择排序,交换排序,归并排序

1.因为插入排序需要有已经被排好的数据,所以我们可以认为第一个数据已经有序,从它的后一个开始插入。2.[0,end]是有序序列,将[end+1]处的元素tmp插入,从后往前依次比较3.如果tmp

2024-04-14 12:43:23 1019 3

原创 101. 对称二叉树

思路:我们可以将这棵树看成把根节点删除的左右两棵树,题目保证了一定会有一个节点,所以我们就直接从它的左右孩子下手直接将他的孩子传给我们的接口函数,然后开始递归调用,此处需要注意的是因为我们是用相等二叉树的思路,但此处是对称二叉树,所以在递归调用的时候当往下一层递归时左边的树传左孩子时右边的树应该传右孩子,传右孩子时右边的树应该传左孩子,因为我们要的是满足对称。递归的返回条件有三个:1.当子节点为空时,有两种情况,一是只有一个根节点时此树仍是对称返回true,

2024-04-06 16:49:17 686 1

原创 143. 重排链表

思路:找中间节点,将中间节点之后的节翻转,然后遍历中间节点前的节点的时候插入翻转后的节点。

2024-03-31 12:46:41 150 1

原创 237. 删除链表中的节点

步骤:先用Next记录node的后一个节点,然后将Next的值赋给node,最后free(Next)大致思路:将被删除节点的后一个节点的val和next赋值给被删除节点。一开始看到这题可能会毫无思路,但是仔细想想发现也是不难的。

2024-03-30 19:20:23 164 1

原创 题解 | #链表的回文结构#

步骤:求节点个数以及尾节点(最后比较用)->用节点个数的数学关系求翻转处的位置->将cur置于翻转处,prev记录cur前一个节点,next记录cur下一个结点->用三个指针将中间之后的节点进行翻转->最后从前后往中间遍历比较val。大致思路:将中间结点之后的节点翻转,然后用一个头指针head和一个尾指针tail分别从前面和后面往中间遍历并进行值的比较。

2024-03-30 17:12:51 331 1

空空如也

空空如也

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

TA关注的人

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