自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux系统编程——进程控制

fork之后,父子进程各自执行代码的一部分,代码数据只读,父子进程共享;变量数据写时拷贝那么如果子进程我不执行原来的代码了,我想执行一份全新的程序呢?就是父子代码不共享了,子进程执行自己的代码。程序替换是通过特定的接口,加载磁盘上一个全新的程序(代码和数据),加载到子进程的地址空间中问题:进程替换的时候有没有创建新的子进程?解答:没有创建进程。进程为内核数据结构+代码和数据,把一个全新的程序加载到内存里,仅仅是重新建立了映射关系,进程的内核数据结构,状态和优先级等未发生变化,所以没有创建进程。

2024-05-11 18:14:48 869 1

原创 Linux系统编程 —— 进程概念,环境变量,虚拟地址空间总结(收藏向)

教材概念:进程是一段程序的执行过程,是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。内核概念:进程是操作系统动态执行的基本单位,是系统资源最基本的分配单元,也是系统最基本的执行单元1,以我们写的代码为例,我们写完一个.c文件的代码并且编译好后,在Windows是一个.exe后缀的文件在Linux中是一个绿色的文件叫做可执行文件2,这个时候我们把这玩意儿叫做“程序”,当程序运行起来后,就叫做“进程”。3,

2024-05-07 16:48:19 692 2

原创 Linux系统编程——操作系统的初步认识(Operator System)

我们来举一个简单的例子,如下图:一个学校有三个角色,为学生,辅导员和校长,校长是管理者,学生是被管理者,那么辅导员充当什么角色呢?我们先了解下什么是“决策”和“执行完成任何一件事都要经过两种过程:①首先是绝对一件事要不要做和如何去做 —— 决策②然后就是具体落实做这件事 —— 执行校长作为管理者管理学生,那么校长就是决策的那个人,但是校长一般不 直接执行决策,会把决策交给辅导员去执行,所以辅导员扮演的角色就是“执行者”,执行管理者的决策。

2024-05-01 20:24:05 654

原创 Linux操作系统预备 —— 冯·诺伊曼体系结构

所以现在的体系运行流程就是:用户输入的数据先放到内存中,CPU读取数据的时候去CPU中找,读取完数据后返回给内存,然后内存再把数据交给输出设备,这样就完成一次数据处理。

2024-04-30 19:45:12 449

原创 Linux实现简单进度条(附原理解释和动图效果)

先看下面的代码和运行结果,只是一个简单的打印“你好”然后休眠三秒,最后程序结束再看下面的代码和运行结果:这串代码中我们把printf里面的 ' \n ' ,去掉了,那么运行结果就不同了,就变成了先休眠三秒,然后再打印的“你好”。该现象证明了,打印的时候,系统和屏幕中间是存在缓冲区的。显示器对应的是行刷新,就是当缓冲区写满或者代码执行时遇到 ' \n ' 时,才会显示到屏幕上,至于原因我们到IO流部分会详细讲解,目前阶段可以通过“”的概念把屏幕也看成一个文件。

2024-04-29 16:31:05 259

原创 Linux操作系统基础开发工具的使用——vim,gcc/g++,MakeFile,gdb,yum

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。在目录/etc/下面有个名为vimrc的文件,这是系统中公共的配置文件,对所有用户有效;一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。

2024-04-28 11:37:32 1264

原创 Linux系统编程——权限概念和权限管理

一个目录dir,权限为drwxrwxr-x,拥有者和所属组都是dyk,这时候我以dyk的身份sudo touch test.txt,此时这个文件的权限为-rwr--r--,拥有者和所属组是root,这时候我是dyk,是普通用户,无法写这个文件,但是却可以rm -f删除这个文件(:ll /,在根目录下有一个tmp文件,是公共目录,权限为drwxrxrwx,如果多个用户都在一个共同的路径下,对该目录有所有权限,那么一个用户可以对拥有者和所属组都不是自己的文件进行删除,那么就彻底乱套了。

2024-04-19 15:57:32 844 3

原创 Linux系统编程——常见指令集合(入门必备)

cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面我们指定的所有文件或目录复制到此目录中。反之,如果我们指定的目的地并非一个已经存在的目录,则会出现错误信息。常用选项:-r 递归处理,通常用在压缩目录的时候,将目录里的所有文件和子目录一并处理,如果不加-r,则只会压缩目录文件,目录里面的东西不会压缩。② -a或-all 表示写详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称。

2024-04-14 19:22:57 606 7

原创 C++——IO流

int _month;int _day;return in;//不仅仅针对ostream,ofstream和stringstream也可以用,因为用的是继承体系return out;//自动识别类型的本质--函数重载//内置类型可以直接使用--因为库里面ostream类型已经实现了int i = 1;// 自定义类型则需要我们自己重载<< 和 >>cout << d;

2024-04-10 18:37:11 840 1

原创 C++——类型转换

static_cast用于相近类型之间的转换,编译器隐式执行的任何类型都可以用static_cast来转换,但是不能用于两个不相关的类型进行转换。①static_cast用于相关类型之间的转换,译器隐式执行的任何类型都可以用static_cast来转换,比如int和double的转换,相当于C的隐式类型转换。所以C++看中了C的转换缺陷,推出了属于自己的转换标准,但是要注意,C++是兼容C的,所以C++仍然可以使用C的转换方法。对象本身是无论如何都不允许转换的,所以转换的只是指向对象的指针或引用。

2024-04-07 16:40:45 833 1

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

C++的类是C++这门面向对象语言的精华所在,C++的类设计在众多OO语言中也是非常具有代表性的存在。所以,原本的类功能已经可以满足我们大部分的需求,但是随着编程语言的不断发展和实际应用的持续复杂,类原本的功能可能会有一部分失效或缺陷。所以就有了特殊类设计,通过设计特殊的类来应对特殊的各种情况。正所谓对症下药。下面给出了部分特殊类设计。

2024-04-05 11:23:43 913

原创 C++——C++11智能指针

这是我们双链表的基本结构,两个节点,里面都有两个指针,类型为shared_ptr,当函数结束后要释放资源,首先释放n1,_val被释放,然后shared_ptr调用自己的析构函数,本来没啥问题,但是释放_next时,除了释放_next自己的资源时,还会去释放它指向的资源,它指向的是n2,所以再释放n2,然后释放n2时,_prev和_next都调用自己的析构,然后再去释放它们指向的资源,然后它们指向n1。因为迭代器不管资源释放,它只管访问资源,修改资源,因为释放资源的事情是交给析构函数的。

2024-04-03 11:06:46 787

原创 C++——异常机制

C++库给我们提供了一系列标准的异常,定义在std::exception中。在实际中我们可以去继承exception类实现自己的异常类。但是实际上很多公司有一套属于自己的异常继承体系,因为C++标准库给的并不好用。很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家都随意抛异常,那么外层的调用者基本没法玩了。class SqlException : public Exception //数据库的错误。

2024-04-02 11:21:09 1023 1

原创 C++——C++11线程库

在Linux中我们可以使用用户层的线程接口来实现线程操作,但是Linux下的接口无法在Windows下使用,因为Linux支持了POSIX线程标准,但是Windows没有支持,它搞了一套属于它自己的线程标准。所以在C++11之前,涉及到多线程问题的代码可移植性比较差所以C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类得概念。C++,Linux和Windows下都可以支持多线程程序 -- 条件编译#else#endif。

2024-03-28 15:41:51 992

原创 C++ —— C++11新增语法

str += '-';return str;如上图左图,在bit::string To_String(int value)函数中可以看到,这里只能使用传值返回,所以会有两次拷贝构造(现在的编译器会把连续构造两次的情况优化为只构造一次)cout

2024-03-28 09:23:57 858

原创 C++——使用红黑树封装mat和set

第二个模板参数_Val决定了节点里面存什么,而第一个模板参数是为了单独拿到Key的类型,因为像Find,Erase这些接口函数的参数就是Key,我们也不可能拿pair去find对不对。在STL库中,set和map使用的是同一颗红黑树,所以为了使map和set都有各自的特性,这里采用了泛型的方法,想办法让红黑树支持传两个值,就。上面就是红黑树的部分源码,有两个模板参数_Key和_Val,可以看到节点中用的是_Val这样,查找和插入的改造大体相同,加入仿函数拿到T中的Key,即可,其他的基本不动。

2024-02-20 16:37:12 297

原创 C++——位图与布隆过滤器

先看一个面试题:给40亿个不重复的未排序的无符号整数,然后如何快速判断一个数是否在这40亿个数中以我们前面的知识,最先想到的有两种方法:1,排序+二分查找 2,存到哈希表和红黑树中再查但是题目中给的是40亿个整数,我们先算下需要的内存:1G就是1024MB,是1024*1024KB,是1024*1024*1024Byte,相当于10亿Byte,所以,40亿个数需要4*40Byte大概就是16G的空间,所以由于空间的限制,上面两种方法就都可以去掉了。

2024-02-05 17:14:12 930

原创 C++&&数据结构——红黑树

/用枚举来标识颜色RED,BLACK, _kv(kv){}

2024-01-25 15:04:45 1720 2

原创 C++&&数据结构——哈希表

在C++98中,STL提供了以红黑树为底层的一系列关联式容器,查询时效率可达到logN,但是当树中节点非常多时,查询效率也不理想,所以在C++11中,STL提供了unordered系列的几个容器,使用哈希表作为底层,大大增加了查询效率。对于删除,采用闭散列处理哈希冲突时,不能直接删除表中的数据否则会影响其他数据的搜索,所以采用标记的伪删除法来删除,给要删除的位置打上delete的标记,具体实现请看后面的模拟实现部分。最好的情况是,每个桶中刚好有一个节点,再插入数据时,都会发生哈希冲突,

2024-01-23 19:11:49 1178 2

原创 C++&&数据结构——AVL树

/祖先,三叉链,可以倒着遍历int _bf;

2024-01-15 16:47:08 759

原创 C++——map和set的基本使用

①set是按照一定次序存储元素的容器②在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的③在内部,set中的元素总是按照其内部比较对象所指示的特点排序准则进行排序④set在底层是用红黑树实现的①map是关联容器,它按照特点的次序(按照key来比较)存储由简直key和value组合而成的元素②在map中,键值key通常用于排序和唯一的标识元素,而值value中存储与此键值key关联的内容。

2024-01-10 16:44:49 946

原创 C++&&数据结构——二叉树的非递归遍历

有了C++的STL和前面大量学习的支持,我们可以来实现二叉树的非递归遍历了!二叉树的非递归遍历思路大体如下:①将一棵树分成左路节点和左路节点的右子树两部分②用一个栈存储左路节点,目的是访问每个节点的右子树③然后以子问题访问右子树,将访问的右子树转化为一个个小的左路节点和左路节点的右子树两部分,然后循环。

2023-12-20 16:00:34 445

原创 C++&数据结构——部分OJ题详解

这是一种思路,但是这种思路有很大缺点,因为必须要求是满二叉树或者完全二叉树的时候时间复杂度才是O(logN),其他的都是O(N^2),所以我们采用方法二会更好。②通过一个levelSize变量控制队列出的数据数量,当变量出完后用队列的size更新levelSize。从题目我么可以看出,前序的整数数组preorder和inorder可以确定根,中序可以分割处左右子树。①用两个队列,一个队列控制层序遍历的节点,一个控制节点的层数。只需要将上面的层序遍历逆置一下即可。

2023-12-20 15:32:59 498

原创 C++&&数据结构——二叉搜索树详解

插入的目标是插入合适的值,并且和父亲链接起来,比如要在某个节点右边插入一个值,递归时就是 _Insert(root->right,key),我们用Node* &root之后,这个root就间接代表了上一个节点的right指针,然后我们再root = new Node(key),相当于生成一个新节点并直接赋值给父节点的右,间接完成链接,如下代码。二叉搜索树的插入不难,如果数为空直接新增根节点,如果不为空,比我小走左边,比我大走右边,走到空的时候新增节点并完成链接,如下代码和注释。

2023-12-19 20:08:04 963

原创 C++——关于多态的一些补充

先看下面代码的执行结果可以发现在析构子类对象的时候只调用了父类的析构函数,没有调用子类的,为了能正确调用子类的析构函数,需要对析构函数也实现成虚函数。

2023-12-13 20:52:26 870

原创 C++——关于继承的一些补充

使用父类对象拷贝子类时,会将子类中父类继承下来的那部分内容切出来拷贝一份给父类,中间新对象产生,用父类引用或指针时没有新对象产生,父类指针或引用只代表了子类对象中从父类继承下来的那一部分,所以用父类指针或引用去改变值的时候,会改变子类的值。

2023-12-12 16:29:34 400

原创 C++——内存管理

new:①调用operator new函数申请空间②在申请的空间上执行对象的构造函数完成初始化delete①在空间上先执行析构函数,完成清理工作②调用operator delete函数释放空间new T[N]①调用operator new[]函数,完成对数个对象的空间申请②在申请的数个空间上执行相同数量的构造函数delete[]①先进行N次析构②调用operator delete[]释放多个空间。

2023-12-12 11:31:40 893

原创 C++——类与对象补充

下面的两条语句可以证明该对象存在。

2023-12-06 10:27:07 812

原创 C语言实现通讯录

/名称int age;//年龄//性别//电话//地址}PeoInfo;

2023-11-28 10:38:21 334 1

原创 C语言进阶——预处理详解

在预处理阶段,编译器提前提供了一些指令以供我们使用,下面就是几个常用的预定义符号//进行编译的源文件地址//文件当前的行号//文件被编译的日期(年月日)//文件被编译的时间(时分秒)//当前VS是不支持ANSI C;FOR//死循环预处理后结果为可以看到#define对应的符号被替换了,所以有人写代码的时候就用偷懒了caseint d = 0;

2023-11-16 16:15:12 83 1

原创 关于C语言代码是如何变成可执行程序的

从所周知,计算机是能够执行二进制指令的,但是我们写出的C语言代码是文本信息,计算机不能直接理解所以我们地代码是如何变成二进制代码从而能够让计算机执行的呢?在ANSI C的任何一种实现中,存在两个不同的环境第一种是翻译环境,在这个环境中源代码被转换为可执行的机器指令第二种是执行环境,用于实际执行代码。

2023-11-16 13:16:51 252 1

原创 C语言进阶——文件操作

存储在磁盘上的是文件,我们执行一个程序,查看某个文档,或者最常用的删除复制,都是在对文件进行操作。文件分为程序文件和数据文件。

2023-11-16 10:54:24 76 1

原创 C语言进阶——动态内存管理

我们已经熟悉的内存开辟的方式有但是上面两种方式有两个缺点:1,空间开辟大小是固定的 2,数组在声明的时候必须指明数组长度,在编译时分配但是对于空间的需求,不仅仅时上面的情况,有时候我们对内存的需求是会随着程序的依次执行而改变的,于是上面两种方式就不适合了,于是C语言推出了动态开辟的内存管理方式。

2023-11-13 08:18:39 27

原创 C语言进阶——自定义类型

这个我觉得还是直接上代码比文字解释要清楚得多,啊哈哈struct SNchar c;int i;//可以自己改变初始化顺序//全局变量struct S1double d;//局部变量//结构体里有结构体int i = 0;for (i = 0;i < 10;i++)顾名思义,就是把可能的值一一列举,下面就是枚举的定义enum Dat //星期Mon,Tues,Wed,Thur,Fri,Sat,Suenum Sex //性别MALE,FEMALE,

2023-11-10 13:34:42 71 1

原创 C语言进阶——常用字符串函数和内存函数

字符串以'\0作为结束标志,strlen函数返回的是在字符串中'\0'前出现的字符个数,不包含'/0',并且参数指向的字符串必须要以'\0'结束,strlen的返回值为size_t,是无符号整数,这个要注意。这是因为我们的memcpy是从前面往后面拷贝的,1会覆盖3的位置,2会覆盖4的位置,所以我们再去访问3的位置时最后访问到的还是1,于是造成了上面的情况。所以memcpy函数是用来处理不重叠的内存拷贝的,如果有重叠的会有专门的函数来解决,就是下面的memmove函数。

2023-11-07 10:34:03 38 1

原创 C语言进阶——指针进阶(下)

关于指针进阶的基本知识已经在“C语言进阶——指针进阶(上)”中讲解完成,本篇文章主要是通过大量的sizeof和strlen练习来更加熟悉指针。

2023-11-06 14:13:46 48 1

原创 C语言进阶——指针进阶(上)

数组指针是指针 ,我们已经熟悉整形指针(int * pint)是能够指向整形数据的指针,字符指针(char* charp)是能够指向字符或字符串数据的指针,所以数组指针就是能够指向数组的指针----[]的优先级高于*,所以这个式子可以理解为p1是个10个元素的数组,数组中每个元素类型为int*,所以这是一个指针数组----()将*和p2结合,所以p2是个指针,这个指针指向一个数组,这个数组里有十个元素,所以我们称p2为数组指针,它指向一个数组使用指针模拟实现二维数组//指针数组。

2023-11-05 23:02:29 51 1

原创 C语言进阶——数据的存储

大端存储模式数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中小端存储模式数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一 个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具 体的编译器),另外,对于位数大于8位的处理器,例如16位或者32。

2023-11-02 20:39:35 69 1

原创 C++标准模板库——Stack和queue

1,队列我们在学习数据结构的时候已经了解过了,它是一种“先进后出,后进先出”的一种数据结构2,但与C语言不同,STL将栈当作一种适配器来使用,专门用在具有后进先出操作的上下文环境中,只能从容器的一端进行元素的插入和删除,关于适配器下面会有详细讲解3,stack是作为容器适配器被实现的,所以stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器支持以下操作:①empty:判空操作②back:获取尾部元素操作③push_back:尾部插入元素操作。

2023-10-25 19:56:18 219 2

原创 STL标准模板库——list模拟实现

相较于vector线性空间,list就显得复杂许多,它的好处是每次插入或删除一个元素,就配置或释放一个空间,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或删除,list的时间复杂度永远都是常数list和vector是两个最常被使用的容器,什么十几下最适合使用哪一种容器,必须视元素的多寡,元素的构造复杂度,元素存取行为的特性而定。

2023-10-14 19:27:21 62 1

空空如也

空空如也

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

TA关注的人

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