- 博客(60)
- 问答 (1)
- 收藏
- 关注
原创 Linux进程控制
fork函数初识在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程当一个进程调用fork之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以 开始它们自己的旅程,看如下程序这里看到了三行输出,一行before,两行after。进程43676先打印before消息,然后它有打印after。另一个after 消息有43677打印的。注意到进程43677没有打印before,为什么呢?如下图所示。
2025-02-10 22:23:55
1994
35
原创 Linux进程概念
为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在 Linux内核里,进程有时候也叫做任务)。需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。可以理解nice值是进程优先级的修正修正数据。每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串。通过系统调用获取进程标示符,通过系统调用创建进程-fork初识。
2025-02-04 22:11:35
1548
42
原创 冯诺依曼系统及操作系统
目录一.冯诺依曼体系结构二.操作系统三.系统调用和库函数概念我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系截至目前,我们所认识的计算机,都是由一个个的硬件组件组成关于冯诺依曼,必须强调几点:概念任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:设计OS的目的定位如何理解"管理"总结计算机管理硬件:
2025-01-28 11:30:23
2050
46
原创 yum和vim的使用
在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安 装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装. 软件包和软件包管理器,
2025-01-14 13:37:59
2630
44
原创 Linux权限
目录的可执行权限是表示你可否在目录下执行命令如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这 个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读 权限所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。
2025-01-11 21:27:41
2116
33
原创 leetcode题目(2)
目录1.删除有序数组中的重复项2.移除元素3.找出字符中第一个匹配项的下标4.搜索插入位置5.最大子数组和6.最后一个单词的长度https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/2.移除元素https://leetcode.cn/problems/remove-element/3.找出字符中第一个匹配项的下标https://leetcode.cn/problems/find-the-i
2024-12-31 00:20:27
1882
91
原创 Linux发展历程及环境搭建
学习Linux系统编程,你可能要问Linux从哪里来?它是怎么发展的?在这里简要介绍Linux的发展史。要说Linux,还得从UNIX说起1968年,一些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作系统。Multics在多任务文件管理和用户连接中综合了许多新概念1969-1970年,AT&T的贝尔实验室研究人员Ken Tompson和Dennis Ritchie,在采用很多Multics特点的基础上开发了UINX系统。
2024-12-19 00:03:14
2200
91
原创 LRU Cache
LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。之间也有Cache,乃至在硬盘与网络之间也有某种意义上的Cache── 称为Internet临时文件夹或。DRAM技术,而使用昂贵但较快速的SRAM技术。广义上的Cache指的是位于速度相差较大的两种。狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用。硬件之间, 用于协调两者数据传输速度差异的结构。
2024-12-17 00:06:40
1536
80
原创 数据结构——跳表
假如我们每相邻两个节点升高一层,增加一个指针,让指针指向下下个节点,如下图b所 示。这样所有新增加的指针连成了一个新的链表,但它包含的节点个数只有原来的一半。由 于新增加的指针,我们不再需要与链表中每个节点逐个进行比较了,需要比较的节点数大概 只有原来的一半,以此类推,我们可以在第二层新产生的链表上,继续为每相邻的两个节点升高一层,增加一 个指针,从而产生第三层链表。如下图c,这样搜索效率就进一步提高了
2024-12-14 00:02:53
4678
82
原创 数据结构——B-树
1970年,R.Bayer和E.mccreight提出了一种适合外查找的树,它是一种平衡的多叉树,称为B树 (后面有一个B的改进版本B+树,然后有些地方的B树写的的是B-树,注意不要误读成"B减树")。一 棵m阶(m>2)的B树,是一棵平衡的M路平衡搜索树,可以是空树或者满足以下性质:
2024-12-10 00:01:42
5922
74
原创 数据结构——图(遍历,最小生成树,最短路径)
Kruskal算法(克鲁斯卡尔算法)任给一个有n个顶点的连通网络N={V,E}, 首先构造一个由这n个顶点组成、不含任何边的图G={V,NULL},其中每个顶点自成一个连通分量, 其次不断从E中取出权值最小的一条边(若有多条任取其一),若该边的两个顶点来自不同的连通分量,则将此边加入到G中。如此重复,直到所有顶点在同一个连通分量上为止
2024-12-06 00:01:31
7003
68
原创 数据结构——并查集
在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一 个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-find set)
2024-12-03 00:02:52
1556
65
原创 C++:特殊类设计及类型转换
拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即可C++11扩展delete的用法,delete除了释放new申请的资源外,如果在默认成员函数后跟上 =delete,表示让编译器删除掉该默认成员函数。
2024-12-01 00:01:58
3133
60
原创 智能指针讲解
RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内 存、文件句柄、网络连接、互斥量等等)的简单技术在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在 对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象
2024-11-29 00:01:09
1275
64
原创 C++异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了// 服务器开发中通常使用的异常继承体系public:{}protected:int _id;
2024-11-27 00:03:45
1796
58
原创 C++11特性(详解)
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了 C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。
2024-11-26 00:30:32
1717
42
原创 海量数据处理面试题
给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?方案1:将其中一个文件1的整数映射到一个位图中,读取另外一个文件2中的整数,判断在不在位图,在就是交集。消耗500M内存方案2:将文件1的整数映射到位图1中,将文件2的整数映射到位图2中,然后将两个位图中的数按位与。与之后为1的位就是交集。消耗内存1G
2024-11-25 07:15:00
1273
23
原创 位图和布隆过滤器
布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概 率型数据结构,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存 在”,它是用多个哈希函数,将一个数据映射到位图结构中。此种方式不仅可以提升查询效率,也可以节省大量的内存空间
2024-11-24 07:15:00
1178
36
原创 C++:模拟实现unordered_map和unordered_set
因为unordered_set和unordered_map要支持迭代器遍历,所以为哈希表中添加迭代器。unordered_set和unordered_map的实现通过调用哈希表即可。
2024-11-22 07:15:00
852
30
原创 数据结构——哈希
顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素 时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即 O(log2N),搜索的效率取决于搜索过程中元素的比较次数理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立 一一映射的关系,那么在查找时通过该函数可以很快找到该元素
2024-11-21 07:15:00
1746
36
原创 unordered_map和unordered_set的使用
unordered_set和unordered_map的使用与map和set基本相同,那么他们之间有什么区别和联系?都可以实现key和key/value的搜索场景,功能和使用基本相同.map和set底层使用红黑树,遍历出来是有序的,增删查改的时间复杂度是O(log2N).unordered_set和unordered_map底层使用的是哈希表,遍历出来是无序的,增删查改的时间复杂度是O(1).map和set是双向迭代器,unordered_set和unordered_map是单向迭代器
2024-11-20 07:15:00
1250
30
原创 C++:模拟实现STL的map和set
map和set底层都是通过红黑树实现的,但是set中存放是key,map中为key,value,我们不会去写两棵红黑树来实现他们,因为代码会重复,我们需要对红黑树内部进行改造为了可以同时处理set和map,我们传一个T过去,是set的时候为key,map为pair对于set和map他们的排序,set可以直接通过key来排序,而map的排序规则与set不同,先比较key,如果相同比较value,所以我们传一个KOfT
2024-11-19 07:15:00
2015
53
原创 数据结构——红黑树
红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的
2024-11-17 16:04:27
1790
30
原创 数据结构——AVL树
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查 找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962年 发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度
2024-11-16 07:15:00
2471
38
原创 C++STL容器——map和set
在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque、 forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别?关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对,在数据检索时比序列式容器效率更高
2024-11-15 07:15:00
2008
34
原创 数据结构——二叉搜索树
通过上图可以看到,删除叶子节点时直接删除,而对于右子树为空的节点,让父亲指向删除节点的左孩子,左子树为空,父亲指向删除节点的右孩子,而当我们删除左右都不为空时,就不能直接删除了,需要替代法删除。因为二叉搜索树的特殊性质,所以在插入值的时候我们需要与父亲来比较,以此决定插入在左树还是右树。每一个关键码key,都有与之对应的值Value,即的键值对。对于查找是比较容易的,只需要与根比较,如果比根大就到右树找,比根小就到左树找。KV模型只需要在key模型基础上稍微改动,在这里直接给出。
2024-11-14 07:30:00
1700
37
原创 C++----继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用public:protected:// 姓名// 年龄protected:int _stuid;// 学号protected:int _jobid;// 工号int main()Student s;
2024-11-12 07:15:00
842
3
原创 模板进阶讲解
模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生增强了代码的灵活性模板会导致代码膨胀问题,也会导致编译时间变长出现模板编译错误时,错误信息非常凌乱,不易定位错误。
2024-11-11 07:30:00
903
原创 C++STL容器适配器——stack和queue
stack文档介绍stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作empty:判空操作back:获取尾部元素操作。
2024-11-10 18:07:38
1196
原创 C++:模拟实现STL的list
拷贝构造时我们需要创建一个新的节点,将值依次插入尾部即可,可以通过迭代器遍历,也可以通过范围for。对于erase来说,我们只需要找到删除节点的prev和next,将他们两个连接,删除当前节点即可。析构在这里我们用到clear函数,clear是清空所以数据,只留头节点,但是析构头节点也要释放。因为list是双向带头循环链表,所以我们只需要让头节点的prev和next都指向头节点。赋值是不需要创建新节点的,因为已经有了,所以只需要插入值即可。任意插入一个值,我们需要创建一个节点,并将其与前后节点连接。
2024-11-08 07:30:00
793
原创 C++:模拟实现STL的vector
上一节中了解了vector中部分接口的使用,在这里我们模拟实现vector,为了避免与库中的起冲突,在这里使用命名空间
2024-11-05 07:30:00
620
原创 C++STL容器详解——vector
插入6时正常是因为插入5个元素时,容量扩为了6,所以再插入一个元素就不会有问题,当再次插入时,有7个元素,而容量只有6就会出问题,所以迭代器当对元素处理完需要的时候在定义,定义完后就不要对元素在进行空间上的处理,容易失效。当我们知道删除的元素在哪个位置时,可以通过迭代器删除,而不知道时,就需要find来查找,但是vector中没有find的接口,这时候就需要用到算法中的find。这是因为删除了it后迭代器就失效了,因为it的位置不对,想要正常实现就需要保存删除元素的下一个迭代器。
2024-11-04 07:30:00
1249
原创 C++:模拟实现STL的string
在前一节中我们了解了STL中string的部分接口,在这里我们实现一个自己的string类当我们实现自己的string类时,名字会与库内的冲突,所以可以选择用命名空间解决
2024-11-03 07:30:00
712
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人