自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux system V 信号量

Linux 进程间通信 system V semop semct semop

2023-11-09 21:52:32 65

原创 C++线程池

线程池介绍线程池维护者多个线程,等待着分配可并发执行的任务,可以避免在短时间创建和销毁大量线程带来时间成本。线程池的优点:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。原理线程池中有一个阻塞队列,用于存放上层发来的任务请求。线程池中管理着一批线程,当任

2022-05-31 13:58:51 6524

原创 AVL的旋转

AVL的旋转AVL树是一棵高度平衡树,树中任何节点的两个子树的高度最大差别为1。我们可以在节点中加入一个变量,该变量用来判断当前节点是否平衡,当该节点的左子树发生变化时,我们可以将平衡因子进行减1,当该节点的右子树发生变化时,我们可以将该节点的平衡因子进行加1。所以当这棵子树平衡时它的平衡因子为0,当平衡因子为2或者-2时,此时就需要进行旋转。特点本身首先是一颗二叉搜索树。自带平衡条件:每个节点的左右子树高度差不差过1。节点template <class K, class

2022-05-19 15:51:55 379

原创 Linux多线程同步和互斥

Linux多线程 同步和互斥、生产者消费者模型、pthread库

2022-05-13 08:51:41 229

原创 进程间通信

进程间通信要想进行进程间通信,必须让相互通信的进程看到同一份资源。匿名管道匿名管道只能用于具有亲属关系间进程的通信,常用于父子。匿名管道就是通过子进程是以父进程为模板创建的,因此子进程会也有和父进程相同的fd_arr(打开的文件列表),此时它们就看到了同一份资源。管道是单向进行通信的。管道创建#include<unistd.h>int pipe(int pipefd[2]);//pipefd:文件描述符数组,其中pipefd[0]表示读端,pipefd[1]表示写端。

2022-04-23 10:28:38 224

原创 二叉搜索树(排序树)

二叉搜索树 排序树 二叉搜索树的删除详解 非递归版本

2022-04-15 11:11:18 823

原创 C++多态

多态多态的概念当去完成某个行为时,不同的对象调用,产生不同的行为。构成多态的条件必须通过基类(父类)指针或者引用调用虚函数。被调用的函数必须是虚函数,派生类对基类的虚函数进行重写满足多态:跟调用对象的类型无关,跟指向对象有关,指向哪个对象基于调用它的虚函数不满足多态:跟调用它的类型有关,类型是什么就调用谁的虚函数。#include<iostream>using namespace std;class A{public: void virtual BuyTicket

2022-04-14 20:27:22 968

原创 C++继承

继承 菱形继承 虚基表

2022-04-04 14:01:20 596

原创 Linux程序替换(exec)

程序的替换在有些场景中我们需要创建一个进程,让该进程来帮我们完成某项工作,比如Linux中的shell,shell就是一个进程,他通过不断创建子进程,通过让子进程来帮我们执行程序。程序替换的原理程序替换只是将替换的进程加载到内存中,然后修改当前进程的映射信息,完成替换,程序替换并不会创建新的进程。替换函数在linux中程序替换是通过exec函数族完成的。int execl(const char *path, const char *arg, …);int execlp(c

2022-03-29 10:17:58 955

原创 List迭代器的模拟实现

list迭代器 反向迭代器 复用

2022-03-23 15:27:08 1704

原创 你看到的未必是真实的

进程地址空间 页表

2022-03-20 17:19:18 1556

原创 深浅拷贝现代写法

c++ string 深浅拷贝

2022-03-04 17:44:56 435

原创 函数模板、类模板

泛型编程泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。函数模板函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。函数模板格式template<typename T1, typename T2,......,typename Tn>返回值类型 函数名(参数列表){}using namespace std;template <class T>void Swap(T& x

2022-02-20 21:03:48 852

原创 类的默认成员函数

类在C++中可以使用class或者struct来定义类,类中包含成员变量和成员函数,通过限定访问符,限制对成员的访问,限定访问符有:public(公有的)、private(私有的)、protected(保护的)。#include<iostream>using namespace std;class ListNode{ //1.成员变量 //2.成员函数 int _val; ListNode* _next; ListNode* _prev;};struct ListN

2022-01-18 11:38:53 693 5

原创 C语言排序详解

排序插入排序把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个新的有序序列 。插入排序对于接近有序的数据进行排序时,效率很高。void InsertSort(int* number, int size){ for (int i = 0; i < size - 1; i++) { int tmp = number[i + 1]; int end = i; while (end >= 0) { if (nu

2021-11-20 16:14:26 1499

原创 栈(数组)和队列(链表)

栈和队列栈栈是一种后进先出的结构,插入数据的一端称为栈顶,另一端称为栈底。插入数据称为圧栈(入栈),栈的删除称为出栈,出栈也在栈顶进行。数组栈的实现#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<stdbool.h>typedef int STNodeType;typedef struct STack{ STNodeType* _a; int _top;

2021-11-01 19:41:41 135

原创 位段 联合体

柔性数组结构体中最后一个元素允许是未知大小的数组,这就叫柔性数组成员柔性数组特点:结构体中柔性数组前面必须包含一个其他类型的成员。sizeof返回的结构体的大小不包括柔性数组的大小。包含柔性数组成员的结构体使用,要配合动态内存开辟函数(malloc)使用。//柔性数组的使用struct st_type{ int i; int a[];}int main(){ //创建struct st_type类型的对象 struct st_type* p=(str

2021-09-25 11:49:41 180

原创 字符串及内存函数(strlen、memmove)模拟实现

memcpymemcpy为内存拷贝函数,拷贝方式为按字节拷贝。注意 目标字符串和原字符串不能有重叠。对于需要对有重叠的内存块进行拷贝时应使用memmove函数void* my_memcpy(void*des, const void* sour, size_t n){ assert(des&&sour); void* ret = des; while (n--) { *((char*)des)++ = *((char*)sour)++; } return ret;}

2021-09-18 21:12:48 111

原创 函数栈帧的创建与销毁

栈帧的创建与销毁什么是栈帧C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(低地址)。注意:EBP指向当前位于系统栈最上边一个栈帧的底部,而不是系统栈的底部。严格说来,“栈帧底部”和“栈底”是不同的概念;ESP所指的栈帧顶部和系统栈的顶部是同一个位置。常用的寄存器有

2021-08-14 14:35:51 553 6

原创 浮点数在内存中的存储

浮点数在内存中的存储根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:(-1)^S *M * 2^ES表示符号位,当S为0时,表示正数,当S为1时,表示负数。M表示有效数字,1<=M<2;2^E表示指数位。例如十进制数5.5的二进制为101.1,写成上面的形式为 -1^0 *1.011* 2^2,其中S=0,M=1.011,E=2;IEEE规定对于32位的浮点数,最高位为符号位S,接着的8位为指数E,剩下的为有效数字M。对于6

2021-08-10 19:52:17 172

原创 C语言这些题你真的会吗

第一题1.//输出什么?#include <stdio.h>int main(){char a= -1;signed char b=-1;unsigned char c=-1;printf("a=%d,b=%d,c=%d",a,b,c);return 0;}输出结果为a=-1,b=-1,c=255题解内存中存储的是补码,正数原码 反码 补码 相等。#include <stdio.h>int main(){ char a = -1; //1000

2021-08-09 14:32:07 147

原创 C语言版扫雷(递归实现自动展开)

先贴一张效果图扫雷的基本思路1.首先对棋盘初始化,并印出棋盘。2.对棋盘进行埋雷。3.输入坐标进行排雷。4.编写函数统计当前位置周围的雷数,当周围8个位置都没有雷时进行递归展开。5.统计棋盘中未展开的坐标数是否与雷数相等来判断输赢。棋盘首先对棋盘具体分析,应该创建两个棋盘,在一个棋盘中记录雷的位置,另一个棋盘打印出来给用户查看。因为后面要统计当前位置周围的雷数,当位置在边角时,统计位置时会造成溢出,所以我们可以考虑把棋盘大上一圈,比如99的棋盘我们可以创建成1111的。如图所示,黑色

2021-07-30 19:58:10 1255 3

原创 C语言版三子棋(井字棋)

如何用C语言来实现三子棋(井字棋)大致思路如下1.先打印出菜单供用户进行游戏还是退出游戏2.编写打印棋盘的函数3.编写用户和电脑下棋的函数4.最后对玩家或用户下棋后进行判断输赢贴张胜利的图片实现打印菜单的函数void menu(){ printf("******************************************\n"); printf("************* 1. play *************\n"); printf("******

2021-07-27 18:30:13 524

空空如也

空空如也

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

TA关注的人

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