自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 如何高效率的申请“公租房”----高并发内存池

实现高并发内存池

2022-08-16 18:16:37 778 88

原创 【Linux】进程信号

进程信号引言信号引言Linux下的信号查看信号:kill -l1~31是普通信号34~64是实时信号信号信号产生:1.kill命令产生2.键盘产生3.程序异常信号识别:1.进程收到信号,其实不是立即处理,而是在合适的时候。为什么不是立即处理?因为信号的产生,是在进程的运行的任何时间点都可以产生的,有可能进程正在做更重要的事情。信号的处理:1.默认方式(部分是终止进程,部分有特定的功能)2.忽略信号3. 自定义方式:捕捉信号信号的本质:因为信号不是立即处理的,所以信号

2022-07-29 10:44:41 1968 39

原创 【Linux】进程信号----(一篇带你熟知进程信号)

从无到有、带你认识进程信号!!!

2022-07-27 10:01:51 505 17

原创 【C++】多态(细节拉满,快来学习。)

多态一、多态的概念二、多态的定义及实现2.1多态的构成条件2.2虚函数2.3虚函数的重写2.4 C++11 override 和 final2.5 重载、覆盖(重写)、隐藏(重定义)的对比三、抽象类3.1概念3.2接口继承和实现继承四、多态的原理4.1虚函数表4.2多态的原理4.3动态绑定与静态绑定五、单继承和多继承关系的虚函数表5.1单继承中的虚函数表5.2 多继承中的虚函数表六、概念考察一、多态的概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的

2022-03-24 17:10:42 492 105

原创 【C++】继承(细节满满)

继承继承的概念及定义概念定义定义格式继承关系和访问限定符继承基类成员访问方式的变化基类和派生类对象赋值转换继承的概念及定义概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。class Person{public: void Print() { co

2022-03-24 11:48:36 354 53

原创 【Linux】Linux多线程

Linux多线程线程线程的优点线程的缺点线程异常线程用途Linux进程VS线程Linux线程控制POSIX线程库创建线程线程ID及进程地址空间布局线程终止线程线程是进程的一个执行分支,是在进程内部(线程本质是在进程的地址空间内运行)运行的一个执行流。Linux线程的原理:如果我们今天创建“进程”,不独立创建地址空间,用户级页表,甚至不进行IO将程序的数据和代码加载到内存,我们只创建task_struct,然后让新的PCB指向和老的PCB指向同样的mm_struct。然后,通过合理的资源分配(当前

2022-03-19 15:52:15 4736 58

原创 【C++】模板精讲

模板引言函数模板函数模板概念函数模板格式函数模板的原理函数模板的实例化模板参数的匹配原则类模板类模板的定义格式类模板的实例化引言如何实现一个通用的交换函数呢?void Swap(int& left, int& right){ int temp = left; left = right; right = temp;}void Swap(double& left, double& right){ double temp = left; left = ri

2022-03-18 20:08:44 326 49

原创 【C++】内存管理

内存管理引言C语言中动态内存管理方式C++内存管理方式new/delete操作内置类型new和delete操作自定义类型operator new与operator delete函数new和delete的实现原理定位new表达式(placement-new)malloc/free和new/delete的区别共同点不同点内存泄漏什么是内存泄漏:内存泄漏的危害:内存泄漏分类:引言【说明】栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。内存映射段是高效的I/O映射方式,用于装载一个共享

2022-03-18 19:46:08 357 42

原创 【C++】类和对象(下篇)

类和对象再谈构造函数构造函数体赋值初始化列表explicit关键字static成员C++11 的成员初始化新玩法友元友元函数友元类内部类什么是面向对象?再谈构造函数构造函数体赋值在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。class Date{public: Date(int year, int month, int day) { _year = year; _month = month; _day = day; }private: int

2022-03-16 11:46:00 301 32

原创 【C++】类和对象(中篇)

类和对象类的默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载const修饰类的成员函数取地址及const取地址操作符重载类的默认成员函数如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。构造函数构造函数是一个特殊的成员函数, 名字与类名相同 ,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。 构造函数的主要任务并不是开空间创建对象,而是初

2022-03-15 21:13:05 253 40

原创 【C++】类和对象(上篇)

类和对象引言类和对象类的引入类的定义类的访问限定符及封装类的作用域类的实例化this指针this指针的引出this指针的特性引言C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。C++不是一个纯面向对象的语言。类和对象类的引入C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。struct Student{ void S

2022-03-14 13:19:36 1700 15

原创 【Linux】进程间通信(匿名管道、命名管道、共享内存)

进程间通信引言进程通信进程间通信发展进程间通信分类管道 ![在这里插入图片描述](https://img-blog.csdnimg.cn/287585e9df2f402ab78ad873f48a48a3.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGF5bWFu5YWJ772e,size_20,color_FFFFFF,t_70,g_se,x_16)匿名管道命名管道共享内存引言通信的本质是传递

2022-03-10 12:12:54 1176 10

原创 【Linux】基础IO

基础IO基础IO基础IOw:写入,每次写入都是重新写入,意味着之前的文件内容。会被清空。a:append,追加,本质:也是写入,不清空原始文件内容,在文件最后进行写入,数据增多的过程。任何C程序,都默认会打开三个“文件”,分别叫做标准输入(stdin),标准输出(stdout),标准错误(stderr)。所有的外设硬件,本质对应的核心操作无外乎是read和write。1.不同的硬件,对应的读写方式肯定是不一样的。C程序会默认打开stdin,stdout,stderr。file descrip

2022-03-09 11:15:45 715 9

原创 【Linux】进程控制

进程创建1、命令行启动程序(程序、指令等)2、通过程序自身,fork出来子进程(所有fork出来的子进程,以父进程为模板,很多数据、代码继承子进程)子进程、虚拟地址空间可以看作是某种struct结构体变量、对象,里面包含属性值、属性数据。进程调用fork,当控制转移到内核中的fork代码后,内核做:1、分配新的内存块和内核数据结构给子进程2、将父进程部分数据结构内容拷贝至子进程3、添加子进程到系统进程列表中4、fork返回后,开始调度器调度创建子进程,本质是系统多了一个进程,本质是多了一套

2022-03-08 10:00:12 663 12

原创 【操作系统】知识总结集锦

进程冯诺依曼体系输入单元、存储器、输出单元、运算器、控制器外设(输入单元、输出单元)传输数据的时候必须先写入存储器。冯诺依曼规定了硬件层面上的数据流向。存储器是CPU和所有外设的缓存。CPU并不和外设打交道。(数据层面)外设只和内存打交道。(数据层面)操作系统任何计算机系统都包含一个基本的程序集合,称为操作系统。笼统的理解就是:操作系统 = 内核(进程管理、内存管理、文件管理、驱动管理)+其他程序(函数库、shell程序等)操作系统:进行软硬件资源管理的软件。管理的本质:先描述,再组

2022-03-02 18:52:01 560 6

原创 【C++】C++入门下篇——引用详解

引用1.概念:引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。形式:类型& 引用变量名(对象名) = 引用实体;void TestRef(){ int a = 10; int& ra = a;//<====定义引用类型 printf("%p\n", &a); printf("%p\n", &ra);}注意:引用类型必须和引用实体是同种类型的。2.特性1 引用在定义时必须

2021-10-20 16:34:16 324 35

原创 【C++】C++入门上篇

引言C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。C++关键字C++共计63个关键字,而C语言是32个关键字。以下就是C++的关键字,后续的博客会给大家介绍常用的。现在只需要大体知道C++有哪些关键字就可以了。命名空间在C/C++中,变量、函数和后面要学到的类都是大量存在的,这

2021-09-25 18:09:37 355 17

原创 【力扣LeetCode】复制带随机指针的链表

题目:题目分析:解决这个问题的思路如下:1、先复制原来链表的每个节点,新节点连接起来;2、算原链表中每个节点cur的random跟cur的相对距离,再去复制新链表到当前节点相对距离的节点,赋值给random,找每个节点的random时间复杂度是O(N),那么有N节点,整体的复杂度是O(N^2)。这个算法的效率是比较低的,因此要对其做些优化:1、在原链表的每个结点的后面,链接插入一个拷贝节点;2、置random;3、把拷贝节点解下来,链接到一起,同时恢复原链表。代码实现:/** *

2021-09-14 18:23:54 155 1

原创 【力扣LeetCode】环形链表Ⅱ

题目:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。题目分析:方法:1、首先使用快慢指针的方法找到相遇点;2、接着使两个指针分别从head头节点的位置和meet相遇节点的位置同时走;3、当这两个节点相等的时候,所在的位置,即为所求的入环节点。代码实现

2021-09-14 16:25:50 132

原创 【力扣LeetCode】环形链表

题目:给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。题目分析:解决这个问题可以采用快慢指针的方法,快指针走两步,慢指针走一步,如果后期两个指针相遇的话,说明

2021-09-14 15:58:45 124 5

原创 【力扣LeetCode】相交链表

题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。题目分析:解决这道题,我们的常规思路就是暴力求解,A链表每个节点依次去跟B链表的所有节点比较,如果有相同就是交点,如果没有就是不相交。但是其实在此基础上还是有优化思路的:可以分别求出A和B的长度,lenA和lenB,让长的链表先走|lenA-lenB|,再同时走找交点。代码实现:/** * Definition for singly-linked lis

2021-09-14 15:06:09 149

原创 【牛客网】链表的回文结构

题目:对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。测试样例:题目分析:解决这道题首先我们可以使用快慢指针找出中间节点,然后将中间节点开始后的链表进行逆置,再将中间节点前的链表和中间节点后的逆置过后的链表进行比较,当其中任意一个走到空的时候就停止。步骤:1、找中间节点2、逆置3、比较代码实现:/*struct ListNode {

2021-09-14 12:08:45 180

原创 【数据结构】链表基本操作的实现详解

链表链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和

2021-09-13 15:54:21 1031 20

原创 【程序员面试宝典】链表分割

题目:现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。题目分析:解决这个问题采用的方法是:把比x小的值插入到一个链表,把比x大的值插入到一个链表,再把两个链表连接到一起。代码实现:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(N

2021-09-13 13:44:42 1381 1

原创 【力扣LeetCode】合并两个有序链表

题目:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。题目分析:解决这个问题的方法是,可以将两个链表中的数据依次比较,然后我们可以将较小的取下来尾插,就这样依次进行,直到其中一个走到空,就可以结束了。代码实现:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */s

2021-09-13 13:15:16 345 4

原创 【剑指offer】链表中倒数第k个节点

题目:输入一个链表,输出该链表中倒数第k个结点。题目分析:在这里使用的方法还是快慢指针的方法,不同的是,在这里首先让fast快指针先走k步,然后再让slow和fast同时开始走,即slow=slow->next,fast=fast->next。当fast走到空的时候,slow所在的位置,即为所求的倒数第k个节点。注意:如果所求的是倒数第0个节点,则直接返回NULL;如果给的k值大于链表的存储的值,则当fast的k步走完之后,fast就为空了,那么也要直接返回NULL。代码实现:/

2021-09-13 12:22:49 72 2

原创 【力扣LeetCode】链表的中间节点

题目:给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。题目分析:解决这个问题可以使用快慢指针的方法来解决:快慢指针,slow一次走一步,fast一次走两步,fast走到结尾的位置或走到空的时候,slow就走到了中间节点的位置。代码实现:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode

2021-09-13 11:39:03 124

原创 【力扣LeetCode】反转一个链表

题目:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例1:示例2:题目分析:思路一:调节结点指针方向。解题步骤:在这里,可以使用创建3个指针的方法,创建3个指针n1、n2、n3,将n1置成空指针,将n2看作head头指针,将n3看作head->next,这样从前往后依次迭代,当n2等于空的时候停止。注意:n1和n2倒放向,n3进行迭代。思路二:头插法(原链表的一些节点拿下来头插)。解题步骤:创建一个newhead指针置成空,然后将原链表的head

2021-09-13 11:14:15 245 6

原创 【力扣LeetCode】移除链表元素

题目:给你一个链表的头节点head和一个整数val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点 。题目分析:思路1:cur找到val值所在的节点,prev记录前一个位置,依次删除。思路2:创建一个新链表,把链表中所有不是val的值尾插到新链表,删除等于val的节点。在这里,对思路2进行代码实现:/** * Definition for singly-linked list. * struct ListNode { * int val;

2021-09-11 17:31:01 74 4

原创 【力扣LeetCode】合并两个有序数组

题目:给你两个按非递减顺序排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你合并nums2 到 nums1 中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后n个元素为0 ,应忽略。nums2 的长度为n 。示例1:输入:nums1 = [1,2,3,0,0,0],

2021-09-11 11:54:43 1716

原创 【力扣LeetCode】删除有序数组中的重复项

题目:给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例:输入:nums = [1,1,2]输出:2, nums = [1,2]解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。题目分析:当面对这个题的时候,我们应该怎样去处理呢?接下来告诉大家一个方法:我们

2021-09-11 10:48:06 460 5

原创 【数据结构】二叉树的全部详解,没有比这一篇更详细的了。

二叉树1.树的概念及结构1.1树的概念1.2树的相关概念1.3树的表示2.二叉树概念及结构2.1概念2.2特殊的二叉树2.3二叉树的性质2.4二叉树的存储结构3.二叉树的顺序结构及实现3.1二叉树的顺序结构3.2堆的概念及结构3.3堆的实现3.3.1堆向下调整算法3.3.2堆的创建3.3.3建堆时间复杂度3.3.4堆的插入3.3.5堆的删除3.3.6堆的代码实现3.4堆的应用3.4.1堆排序3.4.2TOP-K问题4.二叉树链式结构的实现4.1前置说明4.2二叉树的遍历4.3二叉树的实现1.树的概念及结构

2021-09-09 19:13:28 1390 8

原创 【数据结构】——顺序表基本操作的实现详解

引言线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。线性表是一种在实际中广泛使用的数据结构,常见的线性表: 顺序表、链表、栈、队列、字符串。…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通

2021-09-06 18:25:44 539 8

原创 梦回童年——基于C语言实现三子棋小游戏

引言哈喽,各位朋友们!今天带大家梦回童年,基于C语言来实现一个三子棋小游戏啦!当我们在用C语言来准备实现这个游戏的时候,一定要逻辑清楚、条理清晰,每个步骤都要事先安排好,然后开始按步骤写代码实现相关的功能。接下来,我带着大家顺一遍思路:首先我们建立三个文件:test.c测试游戏的逻辑game.h关于游戏相关的函数声明,符号声明,头文件的包含game.c游戏相关函数的实现菜单的实现:void menu(){ printf("****************************

2021-08-26 15:28:48 1240 5

原创 轻松的认识C语言中的函数

函数什么是函数?通俗易懂的来说,函数就是一个大型程序中的某部分代码, 由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性。C语言函数的分类: 库函数 、自定义函数库函数:存放在函数库中的函数。库函数具有明确的功能、入口调用参数和返回值。C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。库函数库函数的分类:(1)I/O 函数。包括各种控制台I/O、缓冲型文件I/O和UNIX式非缓冲型文件I/O操作。需要的包含文件:stdio.h例

2021-08-25 16:50:16 562 5

原创 数据结构初入门----算法效率(时间复杂度、空间复杂度)

引言首先大家肯定对数据结构是什么很好奇,下面就给大家来讲一下什么是数据结构。 数据结构(data structure)是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。简而言之,数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合。“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储结构。 ...

2021-08-19 17:33:35 877 12

原创 认识一下C语言中常见的函数

引言C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中字符串常量适用于那些对它不做修改的字符串函数.求字符串的长度 strlen长度不受限制的字符串函数 strcpy strcat strcmp长度受限制的字符串函数介绍 strncpy strncat strncmp字符串查找 strstr strtok错误信息报告 strerror字符操作iscntrl 任何控制字符i

2021-08-05 17:57:37 452 18

原创 带你轻松玩转指针八道例题(2)

引言有人觉得C语言中的指针特别难,今天给大家展示了关于指针方面的8道例题,希望对大家在理解指针方面可以更进一步。让我们一起来看看这8到例题。来吧,展示:指针例题例题1:int main(){ int a[5] = { 1, 2, 3, 4, 5 }; int *ptr = (int *)(&a + 1); printf("%d,%d\n", *(a + 1), *(ptr - 1));//2 5 //a+1在这里指的是数组第二个元素的地址,对它解引用得到结果为2. //&am

2021-08-04 17:00:44 462 7

原创 欢迎光顾C语言的世界(C语言基础知识)

计算机中的单位:bit – 比特位1 byte - 字节 = 8 bit1 kb = 1024 byte1 mb = 1024 kb1 gb = 1024 mb1 tb = 1024 gb1 pb = 1024 tbC语言中的数据类型(大小单位是字节):char 1 字符型short 2 短整型int 4 整型long 4 长整型long long 8

2021-08-03 17:49:54 505 5

原创 带你搞懂指针和数组方面的相关例题(1)

引言要搞懂下面这些例题,首先你要知道关于数组名的意义以下这几点:数组名的意义:sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。除此之外所有的数组名都表示首元素的地址。一维数组字符数组二维数组相信搞懂这些例题之后,你会对数组和指针这方面的知识有更深一步的理解与认识。...

2021-08-02 19:17:47 367 4

空空如也

空空如也

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

TA关注的人

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