自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 CMake简易使用教程

示例是将项目名称设置为hello_world,VERSION是用来指定CMake版本,而下面的LANGUAGE是用来设置项目语言(project一定要在顶级构建目录(最初源文件的目录)中显示调用,否则CMake会报警告,并将语言设置为默认的C和C++,项目名称设置为project)前言:cmake能且仅能识别的cmake文件名称为CMakeLists.txt,有一个字母的错误都会导致cmake无法正常使用,同时,包含CMakeLists和源代码的最初的目录被称作顶级构建目录。

2025-09-07 19:37:16 491

原创 Linux匿名管道和命名管道以及共享内存

6、共享内存是让不同进程的地址空间映射到同一块物理内存,从而实现进程间通信,删除共享内存,只是让这块共享内存拒绝后续映射,但只有其引用计数变为零即没有进程的地址空间再映射这块物理空间时,这块共享内存才会真正被删除。5、前面已经说过,命名管道的本质是一块文件标识符,用于让多个进程能够找到同一块缓冲区进行通信,所以删除命名管道并不能影响已经打开这个缓冲区的进程的 读写操作。4、命名管道是当被以读的方式打开时,会发生阻塞,只有在被当以读的方式再打开时,才会正常运行,反之亦然。

2025-09-06 20:12:52 188

原创 Linux软硬链接详解

静态库是在链接过程中直接将静态库链接到可执行文件当中,因此这种方式比动态库加载到内存中每个使用它的程序还要根据加载的起始地址计算内部函数与变量地址是要快的,但是运行库的缺点也正是它的有点:那就是多个进程共用一份,节省内存空间。软连接是两个文件都有自己独立的inode节点,文件中保存了源文件的路径,通过这个路径直接访问源文件,而硬链接是与源文件共用一个目录项,本质上与源文件没有区别。inode中包含了文件的各种描述信息,有了inode上层就可以重拟文件的逻辑虚拟结构,通过inode映射其物理结构。

2025-09-05 21:30:42 184

原创 Linux文件描述符详解

进程在打开一个文件后,会在当前进程内部生成文件的描述信息结构,并且会将其地址添加到pcb的文件描述符表中,而添加位置在文件描述符表当中的数组下标,就成为了我们的文件描述符,因此两个进程产生的文件描述符是互相独立的;当两个进程读取同一个文件的时候,若一个进程将文件删除,另一个进程并不会立即读写失败,因为删除一个文件只是修改了文件系统中相应分组的block bitmap等描述其是否存在的信息,在data block中其信息不会改变,而另一个进程一直都知道应该到磁盘的什么位置去读取文件,因此并不会失败。

2025-09-05 20:58:40 300

原创 Linux中的fork详解

现在已经有了10个进程,他们再在5号fork出各产生一个p5这样总共就有10 * 2 = 20个进程,而我们又不算主进程,所以一共有19个进程被创建。fork是产生一个新的进程,底层原理调用的是系统调用的clone函数,创建了新的PCB(进程控制块),而execl是一个程序替换函数,是将其调用位置之后的程序代码全部替换为目标代码,当前进程的PCB并不会退出。waitpid默认是阻塞等待指定进程或者任意进程退出,而使用选项WNOHANG时,父进程不会阻塞,即使最后也没有子进程退出,也不会报错,返回值为0。

2025-09-05 20:14:49 304

原创 Windows常用的API接口介绍

这些API(Application Programming Interface)你需要知道!想做一个小游戏比如贪吃蛇?这种可以有键盘操纵的小游戏吗?

2025-09-05 12:57:35 514

原创 Linux中孤儿进程的理解

使用shell时,默认的环境变量放置在~/.bast_profile中,是用户级的环境配置文件;/etc/profile.d其中包含了系统级的环境目录文件。守护进程和精灵进程:是同一种运行状态的不同翻译,是特殊的孤儿进程,不但运行在后台,而且脱离了与终端和登陆会话的所有联系,默默在后台运行不想受到任何影响。查看环境变量的命令:echo用于输出一个变量的内容,包括环境变量;孤儿进程:父进程先于子进程退出,子进程运行在后台,父进程成为1号进程(init),退出后由1号进程回收资源。

2025-08-28 16:16:11 217

原创 对于冯诺依曼体系的理解

4、在抢占式多任务处理中,进程被抢占时,一下内容需要被保存:(1)所有cpu寄存器上的内容,cpu上正在处理的数据(2)页表指针(3)程序计数器:记录下一次获得CPU处理机会时执行的下一条指令的地址。5、进程与程序、作业的关系:进程与程序并不是一一对应的关系,因为一个程序可以运行多次,从而对应多个进程;进程与作业也不是一一对应的关系,一个作业(即用户提供的任务)可以有多个进程在运行。3、系统调用的运行过程是在内核态完成的,操组系统并不允许用户直接访问内核,因此用户运行态并不满足访问内核的权限。

2025-08-28 16:00:09 184

原创 Linux_make_makefile

(3)使用.PHONY声明伪对象,伪对象代表的文件名称并不代表真正的文件名称,因此不管同名目标文件是否存在都会执行相应的生成指令。变量定义:在makefile中可以定义变量,当makefile被执行时,其中的变量都会被扩展到相应的引用位置上,通常使用¥(var)表示引用变量。(1)只生成所有目标对象中的第一个,当然makefile会根据文件的依赖关系生成其他文件,但是只会生成一个第一个目标对象,生成后退出。文件指示:包含在一个makefile中的另一个makefile,类似于C语言中的include。

2025-08-28 15:31:43 192

原创 通过gcc_g++理解编译器的编译

1、死代码删除:死代码删除删除指的是删除根本执行不到的代码,或者对程序运行结果没有影响的代码,并不是指的删除注释(这一步骤发生在预处理阶段)3、强度削弱:强度削弱指的是将执行时间较短的代码等价的替换执行时间较长的代码,比如num%128与num%127比较,显然后者更加轻量。1、编译过程分为 扫描程序--->语法分析--->语义分析--->源代码优化--->代码生成器--->目标代码优化。2、扫描程序进行词法分析,从左往右,从上往下扫描源程序字符,识别出每个单词,确定单词类型。二、对编译过程的理解。

2025-08-28 15:06:02 372

原创 Linux_yum理解

2、yum工具在每次安装指定软件包时,都回去检测源服务器上的软件包信息,为了便捷不用每次都去搜索软件包信息,因此使用yum makecache将软件包信息缓存到本地,使用yum clean all清理老旧的缓存信息;yum -y update升级所有的包、软件、系统内核;yum -y upgrade只升级所有包,不升级软件和系统内核。1、在Centos中,可以使用yum install命令安装软件包,list列出所有可供安装的软件包,search搜索包含关键字的软件包,remove删除指定的软件包。

2025-08-28 14:35:52 209

原创 速通C++类型转换(代码+注释)

4、C++四种显示强制类型转换:static_cast, reinterpret_cast, const_cast, dynamic_cast。2、C++中内置类型->自定义类型、自定义类型->内置类型、自定义类型->自定义类型的转换方式。5、RTTI基本理解(RUNTIME TYPE IDENTIFICATION)1、对C语言两种主要的类型转换方式的回顾。3、C++和C语言都不是类型安全的语言。

2025-08-14 23:38:39 501

原创 C++哈希进阶-位图

但是第二种方法对内存的要求太高,1G约等于10亿Byte,1G可存10/4个int,40 / (10 / 4)还是使用位图,开两个42亿9000万个比特位的空间,第一个代表2^1,第二个代表2^0。,10代表出现两次及以上,00代表未出现,01代表只出现一次,因此对位图进行封装就。因此大约需要16G,但是因为空间太大,只能将这些数放在硬盘中,而二分查找只能处理内存。3、一个文件中有100亿个整数,1G内存,找到所有出现次数不超过两次的整数。2、两个文件中都有一百亿个整数,找出两者的相同的数。

2025-08-13 21:44:02 518

原创 多态考察的一些常见问题

10、有纯虚函数的类是抽象类,他强制了派生类完成重写,因为不完成重写的话,子类因为内部继承了纯虚函数所以仍然是抽象类,而抽象类不能实例化出对象,而override是检查子类的虚函数是否完成了重写,没有则报错。用类、访问限定符将底层实现放在一起,不暴露给使用者,比如迭代器的设计,屏蔽了底层的设计,有一样的使用方法,实际上有多种迭代器,比如双向迭代器、随即迭代器、单向迭代器。4、内联函数也可以是虚函数,但是编译器就忽略了他的内联属性(内联函数没有地址,直接展开,而虚函数必然要有地址,放到虚函数表里)

2025-08-13 10:31:27 350

原创 C++单继承虚函数表探索

定义函数指针,因为虚函数表本质上是一个函数指针数组,其中每个指针都指向一个虚函数,因此我们只需要取到这个虚函数表就可以查看每个虚函数的地址。

2025-08-12 22:55:15 143

原创 C++菱形虚拟继承

以下程序配合本地编译器的内存窗口使用。

2025-08-12 22:19:44 268

原创 ubuntu超简单自动化Vim配置

支持nerdtree,支持语法检测,好看的colorscheme,自动补全,支持unbuntu等常见系统。全程只需输入一次或两次代码,等待完成即可,缺点时间可能较长,但不需要科学上网。./install.sh //不加sudo。如果插件不会生效,重新执行下面指令。

2025-08-10 13:47:19 288 1

原创 C++11特性整理(1)

1、右值和左值的核心区别就是能否取地址,英语中将两者叫做lvalue和rvalue,一般认为全称是left value和right value,但在C++中也有一种理解是local value和read value,因为左值能够找到具体的存储位置,而优质是临时对象、常量等无法取地址的所以叫做只读。1、C++98中只能使用{}对数组进行初始化,C++11中所有类型都可以用{}初始化,包括内置类型和自定义类型,自定义类型只需要提供intializer_list<T>类型的构造函数。

2025-08-10 12:39:52 561

原创 Linux机器可直接使用的自动化编译文件

一下文件为个人应用,可以直接cp到相应项目的目录,每条make指令都有相应的中文注释,修改即可实现个性化使用。还在为了Linux机器上一遍遍输入编译指令苦恼吗?你需要make指令以及自己的makefile文件!在makefile中写入自己的个性化指令,让编译速度飞起,支持多文件编译。

2025-08-07 18:20:08 536

原创 Vim常用指令整理

ls -al ->!!

2025-08-07 18:16:41 592

原创 Linux中Git上传代码

git pushgit statusgit log。

2025-08-07 18:15:15 106

原创 C++封装哈希桶实现ordered_set和unordered_map

【代码】C++封装哈希桶实现ordered_set和unordered_map。

2025-08-02 12:27:58 378

原创 C++中哈希的开放定址法和哈希桶

HashMap unordered_map 哈希表——遍历无序HashSet unordered_set 单向迭代器增删查效率O(1)Map 红黑树——中序遍历有序Set 双向迭代器增删查效率O(logN)哈希又称散列(hash),是一种组织数据的方式,本质是通过哈希函数把关键字Key根存储位置建立一个映射关系查找时通过这个哈希函数计算出Key存储的位置,进行快速查找一、开放定址法。

2025-07-31 17:31:34 1187

原创 封装模拟实现的红黑树以实现set和map

难点总结:1、set中一个节点放一个值,而map是Key-Value结构,因此在红黑树内部比较的时候为了能够实现泛型,要用仿函数实现set直接取出节点的值比较,而对于map直接取出Key-Value中的Key进行比较(虽然pair支持比较,但是规则是先比较Key,再比较Value,与我们需求不同)2、迭代器的实现:核心就是改变指针的指向,需要实现的运算符重载有()、* (主要是set在使用)、->(主要是map使用) 、++、!= 、==3、关于是否可以修改,对于set来说,每个节点的值都不可以修改。

2025-07-28 16:46:11 602

原创 C++红黑树

红黑树是一棵二叉搜索树,每个节点上增加一个存储位来表示结点的颜色通过对任何一个从根到叶子结点的路径上各个节点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出二倍,因此接近平衡(最长路径不超过最短路径的二倍)

2025-07-27 18:22:17 516

原创 C++平衡二叉搜索树易错点

删除时,如果某个节点不满足特性时,需要对这棵子树进行旋转,因为有可能高度发生改变,所以还有可能对上一层进行旋转。三、一般情况下,我们的习惯是将一个节点的左子树都设置成比他小的值,将右子树都设置成比他大的值,但是也可以反过来设置,这样中序遍历的出来的就是降序序列而不是生序序列。二、AVL树查询的时间复杂度是O(logN),是通过平衡因子限制子树的高度的(虽然也可以不采用平衡因子的方法)一、平衡二叉搜索树不存在退化成单支树的极端情况,AVL的设计就是为了避免这种情况。

2025-07-26 15:21:17 194

原创 C++AVL树

3、更新平衡因子,并判断是否需要进行旋转,二者有分为四种情况:左单旋(插入在最右边)、右单旋(插入在最左边)、左右单旋(插入在左子树的右边)、右左单旋(插入在右子树的左边)首先是插入的核心代码(为了防止逻辑失误,所以这里在所有的if、else if之外还加上了应有情况的以外情况,一旦出现立即报错)这里采用平衡因子的方式记录左右子树高度,并在普通搜索二叉树的基础上再每个节点中加上一个指向父节点的指针以方便链接。1、找到可以进行插入的叶子结点,或者是只有一个子节点的节点。

2025-07-26 15:00:28 416

原创 闭上眼睛仔细看,原来是我的复旦大学通知书来啦

2025-07-25 15:09:38 276

原创 C++map和set

顺序容器中的元素是按照他们在容器中的存储位置来顺序保存和访问的,比如list、string、vector、deque、array。set底层使用红黑树来实现,增删查效率是O(logN),迭代器遍历采用的是中序遍历(双向迭代器)关联式容器也是用来存储数据的,逻辑结构通常是非线性结构,两个位置交换一下存储结构就被破坏了。map一个节点里存两个值,插入的是pair,里面有first和second两个数据。序列式容器逻辑结构为线性序列的数据结构,两个存储的值之间一般没有紧密关联,

2025-07-24 18:18:48 757

原创 贪心算法简介

其实是贪心策略,是解决问题的策略,局部最优->全局最优解释:1、将解决问题的过程分为若干步2、解决每一步的时候,都选择当前看起来最优的解法3、希望得到全局最优解。

2025-07-23 21:23:42 1279

原创 Linux入门介绍

2、计算机有操作系统---计算机+操作系统必然会进入高校---1991年,芬兰赫尔辛基大学 雷纳斯托瓦兹,在用学校的搭载Unix的电脑,想要打造一个免费的操作系统---Linux诞生(现在也可以找到当时的原码,C语言+部分汇编)---所有的操作系统刚开始诞生,都是没有图形化界面的。第一条线---最有代表性的Unix(用的是汇编语言,肯 · 汤普森)---丹尼斯里奇发明C语言---两人用C语言加上部分汇编对Unix进行重写---全部用C语言重写。第二条线---苹果OS,微软os。

2025-07-21 20:48:15 264

原创 C++二叉搜索树

二叉搜索树是一棵空树,或者是具有以下性质的二叉树:1、若左子树不为空,则左子树上所有节点的值都小于等于根节点的值2、若右子树不为空,则右子树上所有节点的值都大于等于根节点的值3、他的左右子树也分别为二叉搜索树——和堆还不一样,它不区分左右子树,要么都小,要么都大,或者相等二叉搜索树的结构决定了查找一个值时,只要根的值比查找的值大,就往左走;只要根的值比查找的值小,就往右走;直至最后走到空,若还没有找到,就结束,没有这个值。

2025-07-21 16:13:49 632

原创 C++虚函数易错点整理

虚函数只能是成员函数,友元函数不能作为虚函数·重载是在相同作用域中的同名函数,拥有不同的参数(类型或者是数量不同),返回类型可以不同,来进行行为的函数·重写就是覆盖,针对多态,重定义就是隐藏,两者都是要在同一个继承体系当中,但是父类和子类都有自己独立的作用域,因此重写和重定义不是重载;而重写要求三相同(函数名、返回类型、参数),但是协变除外(可以返回基类或子类的指针或者引用),在以上体系中只要不构成覆盖,就构成隐藏。

2025-07-20 21:00:39 438

原创 C++多态知识点真理

多态,通俗来说就是多种形态,分为编译时多态(静态多态)和运行时多态(动态多态)编译时多态主要就是前面讲的函数多态和函数模版,通过参数不同达到多种形态,将它叫做编译时多态,是因为他们的实参传给形参的过程中实现的一般将编译时成为静态,将运行时成为动态运行时多态,具体点就是去完成某个行为(函数),可以传不同的对象就会完成不同的行为,就达到多种形态class Apublic:virtual void print() final//final修饰的虚函数无法被重写。

2025-07-20 17:51:42 1075

原创 C++重载、重写、隐藏的对比

2025-07-20 16:25:19 116

原创 C++继承与组合

/对父类的成员使用父类的运算符重载。// 1、子类的构造函数必须调用父类的构造函数构造父类的部分,如果父类没有默认构造函数。// ·组合是一种黑箱复用对象的内部细节不可见,要求被组合的对象有定义良好的关系,耦合度更低。// 2、当子类和父类有同名的成员变量时,子类会限制父类对同类成员变量的访问,这叫做隐藏。// (父类的private子类不能访问,因此如果继承的话子类中父类的部分无法被初始化)//迭代器的设计就是封装,有可能是原生指针,有可能是类封装的指针,屏蔽了底层的复杂细节。

2025-07-19 16:27:06 1098

原创 C++中vector和list的优缺点对比以及deque

开辟若干个数组(buff),还有一个中控数(是一个指针数组ptr),会试图把第一个数组的地址放在中控数组中间;假设每个buff数组大小是N,要获取第i个数据,x = i / N就是第x个数组,y = i % N就是第x个数组的第y个。访问方式就是ptr[x][y],即 *(*(ptr + x) + y)1、尾插尾删效率不错,支持高效下标随机访问。2、物理空间连续,所以告诉缓存利用效率高。1、按需申请释放空间,不需要扩容。1、空间需要扩容,扩容有代价。2、头部和中间插入删除效率低。两者基本上优缺点互补。

2025-07-16 15:59:31 153

原创 C++中list各种基本接口的模拟实现

在一个就是关于iterator和const_iterator的实现问题,比较简单的方法可以是先实现一个iterator,在复制一份,将其中的解引用和箭头更改为const版本;两种方法在效率上没有区别,但第二种相对更加简洁。因为我们的链表在内存中不是连续存储的,所以不能够使用原生指针作为迭代器,所以需要单独封装一个类,来实现迭代器比如解引用、++、--、->、!三、还有一个可以注意一下的小点是struct默认是公有,class默认是私有,因此迭代器作为非常常用的类可以将它写为struct,访问更加方便。

2025-07-15 17:20:53 449

原创 vector各种接口的模拟实现

其实相比string,vector的接口就要简单许多而且更加规范清晰,但是这里也有我们需要注意的问题,一个是浅拷贝的问题,另一个就是迭代器失效首先是浅拷贝,这里最容易给自己挖坑的就是在reserve()函数的时候,直接用memcpy()去一个字节一个字节的拷贝,一但调用时使用的是自定义类型,就会因为浅拷贝崩溃(例如vector<string>);

2025-07-13 15:59:04 491

原创 初阶数据结构易错点整理

我们通过顺序表来实现,其实最难判断的点就是队列已满和队列为空,所以采取简单的方法是,如果我们需要存储 k 个数据的循环队列,那么我们只需要开 (k + 1)的空间,这样的话让队尾(rear)指向最后一个数据的下一个,这是如果(rear+1)%(k + 1)就是队头,则队列已满;然后,对于笔试题来说,前序序列最大的用处就是确定根节点,中序序列最大的用处就是确定子树(左子树是哪些节点,右子树是那些节点,这里判断出来的不是顺序,是有哪些),后序就是前序的逆置,看的方法就是从后往前看,一次是根、右子树、左子树。

2025-07-12 10:44:39 628

空空如也

空空如也

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

TA关注的人

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