- 博客(30)
- 收藏
- 关注
原创 Google第三方库详解------ProtoBuf详解 + 样例(5万字详解!)
指令:hexdump -C 二进制文件int main()if (!return -1;else if (!std::cout << "反序列化失败!return -1;i++)std::cout<<"------------联系人-------------"<<std::endl;std::cout<<"姓名: ";std::cout<<"年龄: "<<people.age()<<std::endl;
2025-02-23 23:33:08
413
2
原创 Git版本控制系统---本地操作(万字详解!)
add+commit之后,这就是第一版的Readme文件,之后我们又增加了一行内容"hello mygit!2.查询giteer账号绑定的邮箱:在gitee主页(即上述图片界面),鼠标移动到右上角头像处,会有一个设置选项,点击,左边列表中有一个邮箱管理,点击后就能看到当前gitee账号绑定的邮箱。补充:1.gitee用户名位置:再次提醒:不要带上@!首先,最后一版的Readme内容为"hello git!" 和"hello mygit"此时Readme文件的内容被重置为原来的一行:"hello git!
2025-02-23 17:44:19
1727
3
原创 Linux网络编程--Udp套接字+实战 (万字详解,超详细!!)
----------------------------------------------------分割线-----------------------------------------------------2025.2.10。如:2个人都是用网络进行通信,或者都是用书信交流,不可能存在一方使用书信,另一方使用手机这种“荒谬”的事情发生;套接字创建成功后,需要绑定自己的地址信息,使用系统调用的bind函数。对于客户端来说,需要bind要连接的服务器的ip地址和端口号,不能bind任意地址了。
2025-02-10 12:17:38
1245
2
原创 算法数据结构---栈+习题
解析:先扫描一边给的括号序列,仿造前面括号匹配的步骤走一遍,将合法的括号位置的下标用一个数组标记,最后根据标记的数组下标来将原来的序列重新填入新的res字符串中即可。先不着急全部将入栈序列全部入栈,先在遍历的同时先入栈,再不断匹配出栈序列的值,相等就出栈,同时维护的扫描出栈序列的下标往后++题目链接:https://www.luogu.com.cn/problem/P4387。题目链接:https://www.luogu.com.cn/problem/P1449。解析:例子:3.5.2.-*7.+
2025-01-11 12:39:11
410
原创 MySQL从入门到入土---MySQL表的约束 (内含实践)---详细版
MySQL本质上是数据的最后一道它为了保证自己内部存储的数据一定是符合预期的,会针对每次插入的数据做严格检查,虽然数据类型已经算是一种约束,但是还不够灵活和全面,所以Mysql也存在其他的约束,如:主要介绍null/not null,default, comment, zerofill,unique key 这几种约束。
2024-12-26 15:07:53
485
原创 进程间关系和守护进程---理论+手撕代码(详细版)
多个进程可以组合成为一个进程组,Linux为了管理这些进程组,会给每个进程组分配一个唯一的进程组ID,即PGID,是一个正整数,类型为pid_t;现象:可以发现在这个例子中,Process父子进程属于同一个进程组,PGID一样且为Process父进程的pid。
2024-12-23 16:13:56
406
1
原创 Linux网络基础-----传输层UDP协议
在Linux中存在描述进程的结构体--struct task_struct{...} ,操作系统内核中维护了一张哈希表以端口号为key值,进程的虚拟地址为value进行映射,一个key值只能对应一个进程地址,不然哈希冲突会很严重,但是相反,多个key可以映射同一个value,即同一个进程地址。注意:UDP协议的传输的最大长度是:64kb,如果要传输要超过64k的数据就需要在应用层手动的分包.并且在接收端进行手动的拼装。UDP协议没有真正意义的和发送缓冲区,获得的数据直接通过操作系统内核发送给接收方。
2024-12-18 22:54:50
411
1
原创 MySQL基础 -----MySQL数据类型
分为tinyint,.smallint,mediumint,int,bigint类型,在此处只介绍tinyint的细节,其他int的类型都是相似的,只需要注意类型的范围大小和有无符号即可。
2024-12-18 22:54:20
951
1
原创 Linux系统编程进阶---信号量(超详细!!新手小白也能看懂!!)
它通常用于解决进程间的互斥和同步问题,确保资源在某一时刻只能被一个进程访问(互斥),或者多个进程能够按照某种顺序访问资源(同步)。在这个示例中,我们创建了一个初始值为1的信号量,并创建了5个线程。每个线程在访问共享资源之前都会等待信号量,访问完成后释放信号量。由于信号量的初始值为1,因此只有一个线程能够同时访问资源,其他线程需要等待。信号量在进程同步中有着广泛的应用,特别是在解决生产者-消费者问题和哲学家就餐问题时。信号量的操作主要包括创建、初始化、等待(P操作)和发送(V操作)。
2024-12-03 00:42:25
1091
2
原创 Linux系统编程入门--信号详解--适合零基础小白!!!
seconds秒后OS发送14号信号OS要对闹钟进行管理:先描述在组织被大小堆管理IO很慢alarm(0)表示:取消闹钟,alarm的返回值是上一个闹钟的剩余时间闹钟默认只触发一次!
2024-12-01 16:28:33
1067
1
原创 Linux网络基础:Tcp_Socket ----纯干货无废话!!
要将传入的sockfd设置为监听状态,不断监听来自客户端连接请求。第一个参数:只用来获取新连接,又称为监听套接字!理解该返回的fd:真正进行IO交互的fd。Return val:返回一个文件fd。到对应的client的sockfd。对应的client的sockfd。用于客户进行连接服务器时使用。结构体对象中,然后强转地址为。的ip和port到一个。
2024-12-01 16:14:23
218
1
原创 Linux零基础入门--Makefile和make--纯干货无废话!!
本文介绍了Makefile的概念与使用,Makefile是Linux中用于自动化构建的文件,它定义了一系列规则来指定文件的编译顺序和复杂操作。在CentOS7环境下,以hello.c为例,通过vim编辑器创建并编写Makefile文件,其中使用了特殊变量$@和@^分别代表当前目标文件名和构建目标文件的源文件名,以及.PHONY伪目标用于声明非实际文件名的目标。文章还介绍了如何编写包含多个源文件的Makefile,并使用伪依赖项让make不断执行目标文件的依赖项,直到结束。
2024-11-30 23:18:43
404
3
原创 Linux网络基础:Udp_socket--纯干货无废话!!!
本文概述了网络通信的基本概念,包括端口号、socket系统调用接口及网络通信命令。端口号作为16位整数,用于唯一标识互联网中的进程。Socket接口涉及套接字的创建、配置(如IP地址和端口号的设置),以及地址转换函数。Bind函数将套接字与特定IP和端口绑定,客户端通常无需此步骤。recvfrom和sendto函数分别用于接收和发送数据。在云服务器上,服务器需绑定IP为0,客户端则无需。此外,强调了服务器设计时业务与IO的解耦。最后,介绍了使用netstat -upa命令查询UDP服务进程的方法。
2024-11-30 23:11:16
463
2
原创 Linux环境基础开发工具简解
yum 使用方式:yum install -y 包名字,例如yum install -y gcc 移除软件:yum remove 包名字 下载yum源,复制相关链接地址,使用指令wget + 链接下载 vim 用来编写代码,但是目前不是主流 三种模式 命令模式 vim默认打开时就是该模式 指令 复制:yy ,也可以加上数字代表同时复制n行 粘贴:p,注意:可以在p之前输入数字,代表要p多少行 撤销已进行复制粘贴的操作:u 对撤销操作
2024-09-02 00:03:53
644
3
原创 Linux常用指令和权限
基本指令(常用) ls -al 显示当前目录下所有的dir mkdir 创建文件/目录 当我们想要递归式创建目录时,使用指令mkdir -p 后面接上目录名字 mkdir -p test1/test2/test3... 最好使用touch创建文件 cd 进入某个指定的目录 rm 用于删除目录/文件,但是在root模式下会询问 使用rm -rf 可以不用询问直接递归式删除指定目录中的所有文件 man man后面接指令名字,可以查询
2024-09-01 23:48:38
365
1
原创 C/C++面试重点-->C语言阶段内存函数的实现
memset和memcmp笔试面试考察的相对较少,并且如果大家掌握了前2个函数,那么这2个函数实现和理解应该不在话下,这里就直接给出memset和memcmp的作用和代码实现。如果确定拷贝字节的src和dst位置的内存不会出现内存重叠的情况时,最好还是使用memcpy,会出现内存重叠就是用memmove。函数是 C 语言标准库中的一个函数,用于将内存块的前 n 个字节设置为特定的值。:本文笔者介绍C语言阶段常考的内存函数的使用和模拟实现的细节及完整代码,外加详细图解!祝大家都能找到理想的实习/offer!
2024-08-31 23:06:38
1254
1
原创 高阶数据结构-->图(中)
我们只需要在查找某个元素的双亲节点时,同时直接将该元素路径上的所有非root的元素的root修改为root即可!路径压缩时,当查找的元素的值不是root的下标时,直接更新为root,再继续向上更新,直到将该路径上所有的元素的值都更新为root的下标。此时当我们要查找5的根的时候,会不断往上更新,直到找到1为止,类比到海量数据时,速度降低的会愈发明显
2024-08-29 21:57:24
797
6
原创 高阶数据结构-->图(上)
非人话:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成的一种数据结构,用于表示多对多的关系。图可以表示为G(V, E),其中G表示一个图,V是图G中顶点的集合,E是图G中边的集合。(树是一种特殊的图),更多的图的分类之后提到再细说。人话:简单来说,图是一种表示型数据结构,意在表示某种场景,为了表示不同的场景衍生出了各种类型的图,图的顶点可以看作是一个元素,图的边可以看作元素与元素之间的某种关系(并不一定是单一的关系).2.O(1)的时间复杂度判断2个顶点的连接关系,并取到权值。
2024-08-28 19:50:32
1211
4
原创 C++入门-->初识内存管理
简单来说,在申请自定义类型的空间时,new会调用自定义类型的构造函数,delete会调用自定义类型的析构函数,这在c语言中的内存申请函数无法做到的。如果类中重载了new,那么当new这个类类型的对象时,会自定调用该类中重载的operator new来申请内存。同样的,如果要申请连续的自定义类型的空间,使用new _type[],释放使用delete[] + _type。本篇主要解释了C/C++中动态申请/释放内存的方式,以及C++和C语言中中申请内存方式的相同/异点。
2024-08-27 10:27:41
555
2
原创 C++入门-->类和对象(下)
简单来说,就是C++作为一门面向对象的语言,为了更好的灵活性和方便,引入了运算符重载的概念,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。:友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在 类的内部声明,声明时需要加friend关键字。友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。3.用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义。
2024-08-26 11:23:15
434
原创 C++入门-->类和对象(中)
使用列表初始化需要注意的是,成员变量在声明中的次序就是初始化列表的初始化顺序!,与其在初始化列表中的先后次序无关!此处同样可以一使用,但是使用之后无参和有参会合并,不能再显示写无参构造函数。拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,:本篇笔者主要概述类的六大默认成员函数的的3种,即默认构造,拷贝构造,析构函数。:当我们创建一个类但是什么不写时,该类被称为空类,编译器会自动生成默认函数,当然上述只是做个示范,上述类很明显只需要值拷贝,所以不需要显示的写拷贝构造。
2024-08-26 09:54:29
204
原创 C++入门-->类和对象(上)
类的静态成员函数因为没有this指针这个参数,所以类的静态成员函数也就无法调用类的非静态成员变量。1.C++编译器给每个“非静态(static修饰)的成员函数“增加了一个隐藏 的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象)类定义了一个新的作用域,类的所有成员都在类的作用域中。很显然,只计算了对应类的成员变量的大小,sizeof(t1)=4,sizeof(f1) = 8;顾名思义,就是private中的成员是私有的,外界不能直接调用,只能在类内部调用。在为实例化出对象之前,类是没有大小的。
2024-08-25 11:47:08
422
原创 C++入门->初探缺省参数,函数重载和引用.
简单来说就是:当外部调用该函数时,如果没有显示的传参,则该函数会使用缺省的值!当然模板或许是更好的选择,但是在此先不谈。指针中的权限问题与引用一致,类比即可。运行一下,看是什么现象?
2024-08-25 10:18:58
484
原创 C++入门-->初探命名空间与IO流
所以C++中引入了一个新的概念->namespace,即命名空间,它的出现有效的解决了命名冲突的问题,各个命名空间有着各自独立的作用域,每个namespace中的变量在不展开命名空间的情况下一般互不影响。如果觉得指定作用域繁琐,也可以直接展开某个命名空间,展开后,其作用域中的成员可以直接使用,无需再指定作用域,当然如果展开后存在变量名冲突的问题时,还是要指定作用域来调用相应的成员。C++中的输入输出一般是使用cin和cout来完成的,当然,在C++中也可以使用C语言中的输入scanf和输出printf。
2024-08-24 12:56:50
300
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人