自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++仿muduo库onethreadoneloop高并发服务器

工具类:字符串分割,文件读写,Url解码与Url编码,Http状态码描述,MIME类型获取,文件类型判断,路径有效性验证HttpServer主要实现对请求报文的处理与响应报文的返回。

2025-12-28 15:52:46 338

原创 C++多态

需注意:继承的基类部分虚函数表指针与基类对象的虚函数表指针不同,正如基类对象成员与派生类中的基类成员也是相互独立的。其次,派生类必须重写基类的虚函数,只有通过函数重写,基类和派生类才能表现出不同的行为,从而实现多态的不同形态效果。其次,派生类必须重写基类的虚函数,只有通过函数重写,基类和派生类才能表现出不同的行为,从而实现多态的不同形态效果。每个类中存在一张虚函数表,将每个虚函数地址放上,如果子类没有重写父类虚函数,就用父类虚函数地址,如果重写了就会覆盖父类的虚函数换成自己重写后的函数地址。

2025-12-17 20:45:54 864

原创 C++继承

本文系统介绍了C++继承机制的核心概念。主要内容包括:1)继承的基本概念与访问控制规则,强调protected成员在继承中的特殊作用;2)基类与派生类的类型转换规则;3)继承中的同名成员隐藏问题;4)派生类默认成员函数的实现要点;5)多继承引发的菱形继承问题及虚继承解决方案;6)继承与组合的对比,建议优先使用组合降低耦合度。文章详细阐述了不同继承方式下成员的访问权限变化,以及虚继承解决数据冗余和二义性的原理,为理解C++面向对象编程提供了全面指导。

2025-12-14 20:31:39 934

原创 C++模板特化

模板类不能把声明与定义分离写在.h与.cpp文件下,因为在.h定义的类中 类是特化的,在编译的时候没有链接,类就不知道自己特化的类型是什么,所以类就没有被实例化,但在链接的时候.cpp需要.h,于是就找不到这个类,会导致最后的链接错误。模板特化概念用处,通常模板存在一些无法处理的特殊情况,比如对单个类型需要特殊处理,就需要对模板进行特化。需要注意的是指针和引用特化后的参数T1 T2 并不代表指针和引用类型,而是他原本的类型。偏特化还可以对模板参数进一步加限制比如引用和指针,而非只是部分参数特化。

2025-12-11 19:42:47 254

原创 C++六个默认成员函数

析构函数与构造函数的功能相反,析构函数并不是完成对对象本身的摧毁,变量生命周期到了,自己就摧毁了,而是需要我们将变量所分配的空间给释放掉,C++在对象销毁时会自动调用析构函数,所有没有动态开辟空间的类是不需要析构函数的,调用编译器默认的即可。在C++中,当运算符作用于类类型的对象时,可以通过运算符重载来赋予其新的含义。构造函数是特殊的成员函数,构造函数并不进行对成员变量开空间(局部变量在栈帧创建时,就已经有空间了),构造函数是为了初始化成员变量,构造函数是创建对象时会自动调用的。

2025-12-09 20:10:04 694

原创 五种IO模型与多路转接

因此,需要程序员手动进行尝试读写文件描述符来检测数据是否准备好了,这个过程叫做轮询,这一过程只有特定场景使用,因为浪费CPU资源。根据传入的cmd参数值不同,fcntl函数需要追加不同的参数。当内核尚未准备好数据时,非阻塞IO会立即返回,并抛出EWOULDBLOCK错误码。在内核将数据准备好之前,系统调用会一直进行等待,所有的套接字,默认都是阻塞io。当内核准备好数据时,会通过信号sigio信号通知程序进行io操作。IO多路转接可以同时等待多个文件描述符的就绪状态。由内核完成数据拷贝时,通知应用程序。

2025-12-08 19:27:58 244

原创 C的编译和链接

c语言中存在一些预定义符号__FILE__//进⾏编译的源⽂件__LINE__//⽂件当前的⾏号__DATE__//⽂件被编译的⽇期__TIME__//⽂件被编译的时间__STDC__//如果编译器遵循ANSI C,其值为1,否则未定义#define 机制是C/C++预处理器中的一个重要功能,它允许开发者定义宏(macro)来实现文本替换。

2025-12-07 19:09:31 1043

原创 C/C++内存对齐

在我们不知道内存对齐前,很可能认为结构体大小是4+1+4=9,可实际结果是12为什么会造成这样的现象?那就需要了解结构体的内存对齐了。

2025-12-07 18:52:34 264

原创 应用层协议HTTP

我们常说的网址就是urlURI(Uniform Resource Identifier)和URL(Uniform Resource Locator)是两个容易混淆但又有区别的概念。URI(统一资源标识符)(这是一本书的URN标识符)URL(统一资源定位符):是URI的一个子集,不仅标识资源,还提供访问该资源的具体位置和方法。url也是uri的一种(这是一个网页的具体访问地址)

2025-12-05 19:16:16 751 1

原创 MySQL安装卸载与数据库操作指南

本文主要介绍MySQL数据库的基本操作和管理知识。内容包括: MySQL的安装与卸载方法,包括服务状态检查、关闭和清理流程; 数据库的概念与优势,对比Excel等文件存储方式的差异,以及服务器架构和存储引擎的选择; 数据库基本操作:创建、字符集设置、修改、备份恢复等; 表操作:创建、修改结构、数据插入及删除; 数据类型详解:数值类型(bit、float、decimal)、字符串类型(char、varchar)、日期时间类型以及枚举和集合类型的使用特点。文章提供了从数据库安装到基础管理的完整操作指南。

2025-11-04 20:20:43 873

原创 Linux进程信号

本文介绍了Linux系统中的信号机制:信号是进程间通信方式,用于通知事件发生,可由内核/进程/自身发送。信号处理方式包括忽略、自定义和默认处理。文章详细阐述了信号的产生方式(终端按键、系统命令、函数调用、软件条件和硬件异常),信号的保存机制(阻塞和未决状态),以及信号捕捉过程(涉及用户态和内核态切换)。最后介绍了sigaction函数,这是signal函数的增强版,提供了更灵活的信号处理控制。文中还特别说明了常见的信号类型及其用途,以及信号处理过程中用户态和内核态的转换机制。

2025-07-29 17:52:15 611

原创 进程通信IPC

本文介绍了进程间通信(IPC)的必要性和常见实现方式。进程间通信主要用于数据传输、资源共享、事件通知和进程控制。主要通信方式包括管道(匿名和命名)和共享内存。匿名管道仅适用于有血缘关系的进程,容量64KB,具有单向通信特性;命名管道通过mkfifo创建,适用于无关进程。共享内存是最快的IPC形式,通过shmget创建、shmat映射到进程地址空间实现通信。文章还展示了使用C++实现的进程池类,通过管道在父子进程间传递任务码,实现多进程任务调度管理。

2025-07-22 18:36:45 415

原创 Linux进程控制和进程替代

头文件 #include <unistd.h>类型 pid_t fork(void);返回值:子进程中返回0,父进程返回子进程id,出错返回-1调用fork后 内核:i:内存分配新的内存块和内核数据结构给子进程ii:将父进程部分数据结构内容拷贝给子进程iii:添加子进程到系统进程列表中iv:fork返回 调度器调用2.写实拷贝平时父子进程共用同一处空间,当父子进程任一方修改内容后,系统会给其开辟一片新的空间,使得父子进程分离。

2025-05-28 16:36:49 753

原创 软硬链接与动静态库基本概念(快速回顾)

创建动静态库基本指令,软硬链接基本概念与生成指令

2025-04-18 17:49:20 366

原创 Makefile简单用法

CC:编译器(如gccCFLAGS:编译选项(如-Wall显示所有警告,-g生成调试信息)。TARGET:最终生成的可执行文件。OBJS:目标文件列表。

2025-03-07 17:21:54 281

原创 linux调试器-gdb

程序发布方式有两种,release和debug,Linux默认下是release模式如果要像vs一样调试程序,在Linux操作系统下就可以使用gdb工具。

2025-03-06 18:39:43 214

原创 AVL树的详解

AVL树的增加查找以及平衡因子介绍

2024-10-18 19:49:56 962

原创 二叉搜索树

替代节点的意思就是节点和R的两个结点的值交换,转而变成删除R结点,R结点符合情况2或情况3,可以直接删除。R(最右结点)或者N右子树的值最小结点R(最左结点)替代N,因为这两个结点中任意⼀个,放到N的。4.无法直接删除此结点,因为两个孩子无处安放,只能用替换法删除。2.把节点父亲的孩子节点直接此节点的右孩子,后删除此节点。3.把节点父亲的孩子节点直接此节点的左孩子,后删除此节点。1.将此节点的父亲节点的孩子置空,直接删除此节点。如下图,查找3,要找到1的右孩子的那个3返回。2.删除的节点左为空,右不为空。

2024-10-16 21:56:29 384

原创 优先级队列

建堆与优先级队列

2024-10-10 21:34:32 331

原创 c++虚函数

虚函数在C++中用于实现多态,虚函数就是为了通过基类访问派生类实现函数多样性的函数。虚函数在基类中定义一个未实现的函数,在函数前加virtual关键字public:.....private:....类似于上述中的func函数;在继承其的子类中可以对其进行重写。

2024-09-28 19:33:49 616 1

原创 排序算法(C语言)

原理:将最小值与最大值分别找出分别移到左右两侧。每次内循环都找到最大的数放入末尾。时间复杂度:O(n^2)以下是递归算法的代码。

2024-08-15 15:44:46 561

原创 List容器

resize改变有效元素的个数,多余元素用resize第二个参数补充,若无第二参数,则用默认构造;v.insert(v.begin()+n(所需插入位置下标),(插入数据));v.erase(v.begin()+n(所需删除位置下标));insert支持任意位置的插入,利用迭代器插入指定位置数据。l1.resize(n(改变后的长度),(构造的数));erase支持指定位置删除并返回下一位置迭代器。用于交换list数据。

2024-08-08 17:26:33 394

原创 vector容器与vector迭代器失效

3.vector空间增长size:获取数据个数capacity:获取空间容量大小empty:判空resize:改变数据sizereserve:改变capacity。

2024-07-30 18:37:57 483

原创 string类

1.用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&2.当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。3.auto不能作为函数的参数,可以做返回值,但是建议谨慎使用4.auto不能直接用来声明数组 string str:生成空字符串;string s(str):生成字符串为str拷贝复制;string s(str, strbegin,strlen):将字符串s

2024-07-28 19:51:30 285

原创 c++模板简介

通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有。类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的。函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生。该语句不能通过编译,因为在编译期间,当编译器看到该实例化时,需要推演其实参类型。一个T,编译器无法确定此处到底该将T确定为int 或者 double类型而报错。类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

2024-07-20 19:22:27 372

原创 C++内存管理

operator new与operator delete函数是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间;operator new 实际也是通过malloc来申请空间,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。operator delete 最终是通过free来释放空间的;

2024-07-19 13:48:56 609

原创 类和对象的了解

class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。定义在类中的函数默认为inline⽤类类型在物理内存中创建对象的过程,称为类实例化出对象。

2024-07-14 17:32:53 1471

原创 c++入门基础概念

命名空间需要一个叫namespace的关键字,后跟命名空间的名字,再接{},{}内部为命名空间的成员,命名空间可以定义变量,函数以及类型命名空间本身是一个域(c++中有全局域,局部域,命名空间域和类域)命名空间只能定义在全局但可以嵌套使用。

2024-07-10 15:18:17 637

原创 二叉树基本概念

树是一种数据结构,由n(n>=0)个有限节点组成一个具有层次关系的集合。形似一个倒挂的树,根在上叶子在下。有一个特殊的结点,称为根结点,根结点没有前驱结点除根结点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1

2024-05-30 15:56:02 955

原创 带环单链表的追击问题(快慢指针)

可以看出是否能够相遇需要看fast,slow都进入循环后的距离,还需要看他们的速度差,共同决定了fast与slow1能否相遇。解决这个问题的思路其一是快慢指针,本文主要讲快慢指针的解决问题。2.n是奇数,速度为奇数,如果距离之差可以减到偶数,则可以相遇。代码如上,可以判断链表是否带环,如果带环快慢指针必定会相遇。判断一个单链表是否为环(如下图的环)1.n是偶数,则很快就可以追上。减成奇数则不会相遇。

2024-05-03 13:46:05 418 2

原创 文件和文件操作

打开文件操作需要分成读和写,一个是打开文件并读取,一个是打开文件并写入,功能不同具体操作需根据情况而定。fopen与fclose被ascall规定为打开文件与关闭文件的函数。rewind让⽂件指针的位置回到⽂件的起始位置。c程序针对输入输出操作都是通过流来进行的。ftell可以返回文件指针对起始位置偏移量。根据⽂件指针的位置和偏移量来定位⽂件指针。fseek可以返回文件指针的位置偏移量。

2024-03-31 16:17:31 383 1

原创 结构体内存对齐

还有一点.在传参结构体时,最好传输结构体的指针,因为地址,因为传输结构体所占用空间会很大会对性能造成损耗。3.结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的。4.如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构。体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。-Linux中gcc没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩。对⻬数=编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。pragma可以更改对齐数。

2024-03-23 13:59:13 410 1

原创 整数和浮点数在内存中存储

⽐如:0.5的⼆进制形式为0.1,由于规定正数部分必须为1,即将⼩数点右移1位,则为1.0*2^(-1),其。阶码为-1+127(中间值)=126,表⽰为01111110,⽽尾数1.0去掉整数部分为0,补⻬0到23位。这时,浮点数就采⽤下⾯的规则表⽰,即指数E的计算值减去127(或1023),得到真实值,再将有效。⼗进制的5.0,写成⼆进制是 101.0 ,相当于 1.01×2^2。那么,按照上⾯V的格式,可以得出S=0,M=1.01,E=2。反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

2024-03-18 17:13:27 753

原创 c语言内存函数

作用:函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。作用:与memcpy类似,但和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节。

2024-03-15 21:09:04 414 2

原创 初始与深入指针

在学习c语言的过程中,指针有着举足轻重的地位,并作为能否学好这门语言的关键。

2024-03-15 13:33:32 782 1

原创 寻找单身狗II

思路:可以将上述例子中十个数分为两组数列,且5,6,不在同一个数列中,分为两组数后可以利用操作符"^",来将相同的数变为0,最后分别打印出两组数,就可找出单身狗。有了这个思路,我们便可将数组中的数字分别右移k位与0比较,并将他放进不同的数列中,而且可以将相同的数放在一起,5,6不同的数也可以分离;因为3是5,6异或得到,3的二进制为0011,则其中的两个1分别来自5,6;而这个3是通过上述10个数5,6得到的便可利用此点将5,6分离。有数组的元素是:1,2,3,4,5,1,2,3,4,6。

2024-02-03 11:44:37 859 1

原创 扫雷代码实践

然后在成功排雷的情况下计算此坐标周围雷的数量,利用字符大小减去字符0后的数字便是该数字的概念,算数周围的雷数,并显示在棋盘上。棋盘需要打印9*9大小,然后在探测周围雷的数量时,需要边界,则将数组定义为11*11。下一步便是打印棋盘,此时game,h的作用便体现出来了,定义一个game函数。最后关键步骤便是排雷,定义win的胜利条件和遇到重复坐标时的选择。然后在game.h中声明函数以连接主函数与game中的函数。布置雷之前需要定义雷的数量,以免雷的数量比棋盘大。由第一步分析,需要一个开始的菜单,代码如上。

2023-12-20 22:10:24 416 1

原创 分支与循环

While与do while差别是do while循环至少一次,for循环更加便捷,适用范围更大。switch在多选项的时候使用,同时也许使用break 与default。括号中则为条件(在判断中==为判断而=为赋值)分为do while. while for。if语句需要条件判断if()

2023-12-02 20:25:53 399 1

空空如也

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

TA关注的人

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