自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【MySQL】内置函数

对于多字节字符来说,不同编码中一个字符所占的字节个数是不同的,比如utf8中一个字符占用3个字节,而gbk中一个字符占用2个字节。strcmp函数用于逐字符按照ASCII码比较两个字符串的大小,两个字符串大小相等返回0,前者大返回1,后者大返回-1。现有如下成绩表,要求以“XXX的语文是XX分,数学是XX分,英语是XX分”的格式显示成绩表中的信息。substring函数用于从字符串的指定位置开始,向后截取指定个数的字符。left函数用于从字符串的左边开始,向后截取指定个数的字符。

2023-10-30 19:51:34 209

原创 【MySQL】表的增删查改

通常情况下不建议使用 * 进行全列查询,因为被查询到的数据需要通过网络从MySQL服务器传输到本主机,查询的列越多也就意味着需要传输的数据量越大,此外,进行全列查询还可能会影响到索引的使用。在select的column列表中指明要查询的列为姓名、数学成绩、英语成绩和语文成绩,在order by子句中指明依次按照数学成绩排降序、英语成绩排升序和语文成绩排升序。再向表中插入一些数据,在插入数据时不指明自增长字段的值,这时会发现插入数据对应的自增长id值是在之前的基础上继续增长的。

2023-10-30 19:50:49 221

原创 【C++】多态

多态是指不同继承关系的类对象,去调用同一函数,产生了不同的行为。必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。在虚函数的后面写上 =0,则这个函数为纯需函数,包含纯需函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承抽象类之后也不能实例化出对象,只有重写纯需函数,派生类才能实例化出对象。抽象类既然不能实例化出对象,那抽象类存在的意义是什么?抽象类可以更好的去表示现实世界中,没有实例对象对应的抽象类型,比如:植物、人、动物等。

2023-10-30 19:50:12 234

原创 Reactor网络模式

可以在当前服务器的基础上接入线程池,当recver回调读取完数据并完成报文的切割和反序列化之后,就可以将其构建成一个任务然后放到线程池的任务队列中,然后服务器就可以继续进行事件派发,而不需要将事件耗费到业务处理上面,而放到任务队列当中的任务,则由线程池当中的若干个线程进行处理。下一次Dispatcher在进行事件派发的时候就会帮我们关注该套接字的写事件,当写事件就绪就会执行该套接字对应的EventItem结构中的写回调方法,进而将outbuffer中的响应数据发送给客户端。

2023-10-09 16:30:43 402

原创 【MySQL】数据类型

而如果是无符号float类型得到取值范围,实际就是把对应有符号float类型中的负数部分全部拿走了,因此float(4,2)的取值范围为0 ~ 99.99,实际可插入的范围为0 ~ 99.994。

2023-10-07 16:06:58 914

原创 【MySQL】表的约束

真正约束字段的是数据类型,但是数据类型约束很单一,需要一些额外的约束,来更好地保证数据的合法性,从业务逻辑角度保证数据的正确性。

2023-09-26 20:37:01 230

原创 【C++】文件IO流

C++流是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从计算机内部向外部输出设备(如显示器)输出的过程。“流”是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且有方向性的数据的抽象描述。注意: 可以在定义文件流对象的同时指定将要打开的文件名,以及文件的打开方式。使用 >> 和 << 运算符对文件进行读写操作,会变得很简单,也很形象。3、使用提取和插入运算符对文件进行读写,或使用成员函数进行读写。以二进制的形式对文件进行写入操作。以二进制的形式对文件进行读取操作。

2023-09-19 17:32:47 68

原创 【C++11新特性】function包装器

function包装器是一种函数包装器,也叫做适配器。它可以对可调用对象进行包装,C++中的function本质就是一个类模板。Ret:被包装的可调用对象的返回值类型。Args…:被包装的课调用对象的形参类型。包装示例function包装器可以对可调用对象进行包装,包括函数指针(函数名)、仿函数(函数对象)、lambda表达式、类的成员函数。public:class Pluspublic:int main()// 1、包装函数指针(函数名)

2023-09-12 20:21:55 126

原创 【C++】继承

继承的概念继承机制是面向对象程序设计使代码可以复用的重要手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,而继承便是类设计层次的复用。例如,以下代码中Student类和Teacher类就继承了Person类。// 父类public:protected:string _name = "张三";// 子类protected:int _stuid;

2023-09-01 17:22:01 184

原创 【C++11新特性】可变参数模板

模板参数Args前面有省略号,代表它是一个可变参数模板,我们把带省略号的参数称为参数包,参数包里面可以包含0到N(N>=0)个模板参数,而args则是一个函数形参参数包。模板参数包Args和函数形参参数包args的名字可以任意指定。现在调用ShowList函数时就可以传入任意多个参数了,并且这些参数可以是不同类型的。我们可以在函数模板中通过sizeof计算参数包中参数的个数但是我们无法直接获取参数包中的每个参数,只能通过展开参数包的方式获取,这是使用可变参数模板的一个主要特点,也是最大的难点。

2023-08-27 15:47:20 204

原创 【C++11新特性】lambda表达式

的方式捕捉变量时,编译器也不一定会把父作用域所有的变量捕获进来,编译器可能只会对lambda表达式中用到的变量进行捕获,没有必要把用不到的变量也捕获进来,这个主要看编译器的具体实现。这样一来,调用lambda表达式时就不用传入参数了,但实际我们只需要用到变量a和变量b,没有必要把父作用域中的所有变量都进行捕捉,因此也可以只对父作用域中的a、b变量进行捕捉。但由于这里是传值捕捉,lambda函数中对a和b的修改不会影响外面的a、b变量,与函数的传值传参是一个道理,因此这种方法无法完成两个数的交换。

2023-08-19 20:42:07 142

原创 【C++11新特性】右值引用和移动语义

为了更好地解决问题,这里需要借助一个深拷贝的类,下面模拟实现了一个简化版的string类。右值引用和万能引用的区别就是,右值引用需要的是确定的类型,而万能引用是根据传入实参的类型进行推导,如果传入的实参是一个左值,那么这里的形参t就是左值引用,如果传入的实参是一个右值,那么这里的形参t就是右值引用。移动赋值是一个赋值运算符重载函数,该函数的参数是右值引用类型的,移动赋值也是将传入右值的资源窃取过来,占为己有,这样就避免了深拷贝,所以它叫移动赋值,就是窃取别人的资源来为自己赋值的意思。

2023-08-18 15:51:45 104

原创 【MySQL】表的基本操作

本篇博客介绍表的DDL操作。

2023-08-17 08:54:03 78

原创 【MySQL】数据库基础

数据库是按照数据结构来组织、存储和管理数据的仓库,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。存储数据用文件就可以了,为什么还要弄个数据库呢?文件的安全性问题:数据误操作之后无法进行回退文件不利于数据查询和管理:没有将存储的数据以某种数据结构组织起来文件不利于存储海量数据:数据量越大用户操作数据的成本越高文件在程序中控制不方便:数据的控制需要用户自己来完成总之,文件虽然确实提供了数据的存储功能,但是文件并没有提供非常好的数据管理能力。

2023-08-15 09:05:59 387

原创 【MySQL】数据库的基本操作

表恢复之前需要先选中一个数据库,表明需要将表恢复到哪一个数据库中去,为了防止恢复出来的表与该数据库中已有的表的表明恢复,一般在恢复表时会选择创建一个空的数据库,然后在该数据库中进行表的恢复。使用不同的校验规则操作数据库中的数据可能会得到不同的结果,比如utf8_general_ci校验规则在比对数据时是不区分大小写的,而utf8_bin校验规则在对比数据时则是区分大小写的。如果没有对MySQL的配置文件进行过修改,那么默认的编码格式是utf8,默认的校验规则是utf8_general_ci。

2023-08-12 21:46:57 181

原创 【Linux】多路转接 -- epoll

struct epoll_event结构当中有两个成员,第一个成员events表示的是需要监听的事件,第二个成员data是一个联合体结构,一般选择使用该结构当中的fd,表示需要监听的文件描述符。epoll_ctl 函数用于向指定的epoll模型中注册事件,它不同于seletct()的一点就是,select在监听事件时告诉内核要监听什么类型的事件,而它是先注册要监听的事件类型。epoll的高性能,是有特定的场景的,如果场景选择不合适,epoll的性能可能适得其反。

2023-08-09 09:14:12 121

原创 【Linux】多路转接 -- poll函数

poll函数原型如下:

2023-08-07 22:32:50 1000

原创 【动态规划】回文子串专题

我们创建的dp表是二维的,我们可以想到,在可能越界的时候,就是左上角的位置或者右下角的位置,但其实这两个位置满足 i == j,那么dp[i][j] 就会被直接赋值为1,此时就不会用到 i + 1 和 j - 1 了,所以其实我们不用考虑越界的情况。i 和 j 位置的字符不相同,那么此时只需找到 dp[i+1][j] 和 dp[i][j-1] 的最小值,然后将最小的那个加1即可,即dp[i][j] = min(dp[i+1][j], dp[i][j-1]) + 1;如果 s[i] == s[j]

2023-08-05 22:33:04 306 4

原创 【Linux】多路转接 -- select函数

多路转接也叫多路复用,是一种用于管理多个IO通道的技术。它能实现同时监听和处理多个IO事件,而不是为每个IO通道创建单独的线程或者进程,多路转接允许在单个进程或线程中同时处理多个IO操作,从而提高程序的性能和效率。本篇文章介绍的select函数,就用于select系统调用的多路转接技术。select函数是系统提供的一个多路转接接口。IO = 等待就绪 + 数据拷贝,而select是只负责等。参数说明:参数timeout的取值:返回值说明:select调用失败,错误码可能被设置为:fd_set 结构与 si

2023-08-05 15:29:21 633

原创 【LeetCode】516. 最长回文子序列

在求dp[i][j]的时候,我们可能会用到 i + 1 和 j - 1,在它们有可能越界的时候,一定是 i 等于 j 的时候。我们创建的dp表是二维的,我们可以想到,在可能越界的时候,就是左上角的位置或者右下角的位置,但其实这两个位置满足 i == j,那么dp[i][j] 就会被直接赋值为1,此时就不会用到 i + 1 和 j - 1 了,所以其实我们不用考虑越界的情况。即dp[i][j] = max(dp[i+1[j], dp[i][j-1]);如果 s[i] == s[j]

2023-08-04 22:22:48 281

原创 【LeetCode】094. 分割回文串II

这道题我们使用动态规划的方法来解,首先创建一个大小为字符串长度的dp表。dp[i] 表示 s[0, i] 的字符串最小划分多少次可以全划分为回文串。求状态转移方程,我们要考虑两种情况。s[0, i] 的字符串是回文串和不是回文串的情况。这个我在之前的博客就已经讨论过了,

2023-08-04 20:53:51 282

原创 【Linux】五种IO模型

其实,这个钓鱼场景中的各个事务都能与IO当中的相关概念对应起来,比如这里钓鱼的河对应就是内核,这里的每一个人都说进程或者线程,鱼竿对应的就是文件描述符或套接字,装鱼的桶对应的就是用户缓冲区。任何IO的过程,都包含等和拷贝这两个步骤,在实际的应用场景中“等”消耗的时间远比“拷贝”消耗的时间多,因此要让IO变得高效,就要尽可能减少“等”的时间。需要注意的是,这里问的是他们的钓鱼效率是否一样,而不是问他们整体谁做的事更多,如果说整体做事情的量的话,那一定是王五做的最多,李四次之,张三最少。

2023-08-04 15:46:50 412

原创 【计算机网络】NAT技术

NAT(Network Address Translation,网络地址转换)技术,是解决IP地址不足的主要手段,并且能够有效避免外部网络的攻击,隐藏并保护网络内部的计算机。在IPv4协议中,IP地址数量不足是一个大问题,而NAT技术就是当前解决IP地址不足的重要手段,是路由器的一个重要功能。在对外进行通信时,NAT能够将私有IP经过一系列替换操作最终转换为全局IP,也就是说,NAT是一种将私有IP和全局IP相互转化的技术方法。

2023-08-04 11:36:38 2624

原创 【计算机网络】网络层协议 -- ICMP协议

ICMP(Internet Control Message Protocol,控制报文协议),用于在IP主机、路由器直接传递控制消息,是一个TCP/IP协议。ICMP协议的定位网络层的最典型的协议是IP协议,但是除了IP协议之外,还有ICMP协议和IGMP协议。ICMP、IGMP和IP协议虽然都属于网络层的协议,但是ICMP协议和IGMP协议属于IP的上层协议。也就是说,IP的上层协议不一定就是传输层协议,IP的上层协议可能也属于网络层的协议。

2023-08-03 23:14:11 1312

原创 【计算机网络】应用层协议 -- DNS协议

域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称,例如。com:一级域名,表示这是一个工商企业域名。同级的还有.net(网络供应商)和.org(开源组织或非盈利组织)等。baidu:二级域名,一般对应的就是公司名。www:只是一种习惯用法。

2023-08-03 22:19:44 1653

原创 【计算机网络】数据链路层

数据链路层位于网络层之下,物理层之上。是我们程序员需要了解的最下层协议。该层的主要功能就是在物理网络上提供可靠的数据传输,确保从一个节点(设备)到另一个节点的数据传输是无差错、有序、可靠和高效的。

2023-08-03 11:11:45 2448

原创 【LeetCode】5. 最长回文串

它也就是求出每一个回文子串后,不是统计有多少个回文子串,而是挑出最长的那个回文子串并在循环结束之后返回即可。的题目,如果会了那道求回文子串的题目,这道题基本上也就会了。在做这道题目之前,可以先做一下另一道。代码也只不过改动了一点点而已。与求回文子串思路差别不大。

2023-08-02 18:49:10 276

原创 【LeetCode】647. 回文子串

可以用 i 表示某个子串的起始位置,用 j 来表示某个子串的末尾位置,暴力枚举,可以在N^2的时间复杂度内求出所有子串是否为回文子串。由于我们求dp[i][j]的时候,需要用到 dp[i+1][j-1],且 i 的循环为外层的循环,所以让 i 从大到小循环即可。,那么不管 i 和 j 中间的元素序列是怎样的,以 i 位置为起始位置,以 j 位置为终止位置的子串。我们要知道dp[i][j]为是否为回文子串,首先要判断 s[i] 是否等于 s[j]。,那么需要对 i 和 j 的位置进行判断。

2023-08-02 17:35:27 361

原创 【LeetCode】446. 等差数列划分II -- 子序列

记 a 在nums中的下标为k(至于怎么找到这个k下面会说),我们要找到以 i 和 j 位置为结尾的等差数列的个数,其实找到所有 k 和 i 位置元素结尾的等差数列的个数相加即可(a元素在nums中的位置不只一个,那么k可能就不只一个)。并且也需额外加上一个数列,就是 k,i ,j,本身所构成的等差数列。但是,如果知道了数列的后两个元素,也就是知道了 i - 1 位置以及数列中上一个位置的元素,就能知道数列的公差了,也就能知道 i 位置的元素是否能跟到后面了,所以我们需要用两个元素来表示每个dp位置。

2023-08-01 23:50:38 643

原创 【计算机网络】网络层协议 -- IP协议

IP是(Internet Protocol,网络互联协议的缩写),是TCP/IP体系中的网络层协议。一方面解决互联网问题,实现大规模、异构网络的互联互通。另外一方面是分割顶层网络应用于底层网络技术之间的耦合关系,以利于两者的独立发展。因为目前IP协议主流的版本有IPV4和IPV6,但是目前IPV6不够普及,并且泛用性小,所以这篇文章着重简介IPV6。

2023-07-31 20:28:52 737

原创 【计算机网络】传输层协议 -- TCP协议

从文章的长度也可以看出,TCP协议是非常复杂的,它之所以这么复杂,就是因为它既要保持可靠性,同时又要尽可能地提高性能。检验和序列号确认应答超时重传连接管理流量控制拥塞控制滑动窗口快速重传延迟应答捎带应答TCP的这些机制有些是通过协议来体现的,有些是通过代码逻辑实现的。TCP定时器此外,TCP当中还设置了各种定时器重传定时器:为了控制丢失的报文段或者丢弃的报文段,也就是对报文段确认的等待时间。

2023-07-30 22:03:30 2224

原创 【计算机网络】传输层协议 -- UDP协议

应用层交给UDP多长的报文,UDP就按原样发送,既不会拆分,也不会合并,这就叫做面向数据报。比如用UDP传输100个字节的数据:如果发送端调用一次sendto,发送100字节数据,那么接收端也必须调用一次recvfrom,接收100个字节数据。而不能循环调用10次recvfrom,每次接收10个字节数据。

2023-07-28 14:59:01 1399

原创 【计算机网络】应用层协议 -- 安全的HTTPS协议

HTTPS工作过程中涉及到的密钥有三组第一组(非对称加密):用于校验证书是否被篡改,服务器持有私钥,客户端持有公钥。服务器在客户端请求时,返回携带签名的证书,客户端通过公钥对证书进行验证,保证证书的合法性,进而保证证书中携带的服务端公钥的权威性。第二组(非对称加密):用于协商生成对称加密的密钥,客户端收到CA证书中的公钥给随机生成的对称加密的密钥进行加密,服务器通过私钥解密获取到对称加密的密钥。第三组(对称加密):客户端和服务器后续传输的数据都通过这个对称密钥加密解密。

2023-07-27 16:44:34 1798

原创 【计算机网络】应用层协议 -- HTTP协议

比如你不小心点了某个链接,这个链接可能就是一个下载程序,当你点击之后它就会通过某种方式将程序下载到你本地,并且自动执行该程序,该程序会扫描你的浏览器当中的Cookie目录,把所有的Cookie信息通过网络的方式传送给恶意方,当恶意方拿到你的Cookie信息后就可以拷贝到它浏览器对应的Cookie目录当中,然后以你的身份访问你曾经访问过的网站。其中HTTP请求是由客户端发送的,因此HTTP请求当中表明的是客户端的HTTP版本,而HTTP响应是由服务器发送的,因此HTTP响应表明的是服务器的HTTP版本。

2023-07-26 17:08:04 1053 2

原创 【计算机网络】简易TCP网络小程序

我们将TCP服务器封装成一个类,当我们定义出一个服务器对象后需要马上对服务器进行初始化,而初始化TCP服务器要做的第一件事就是创建套接字。TCP服务器在调用socket函数创建套接字时,参数设置如下:如果创建套接字后获得的文件描述符是小于0的,说明套接字创建失败,此时也就没必要进行后续操作了,直接终止程序即可。说明一下:实际TCP服务器创建套接字的做法与UDP服务器是一样的,只不过TCP服务器需要的是流式服务,而UDP服务器需要的是用户数据报服务。套接字创建完毕之后我们实际只是在系统层面上打开了一个文件,

2023-07-24 23:24:02 1677

原创 【计算机网络】简易UDP网络小程序

在进行绑定的时候需要将IP地址和端口号告诉对应的网络文件,此时就可以改变网络文件当中文件操作函数的指向,将对应的操作函数改为对应网卡的操作方法,此时读数据和写数据对应的操作对象就是网卡了,所以绑定实际上就是将文件和网络关联起来。理论上是这样的,但是我用的是云服务器,云服务器的IP地址是由对应的云厂商提供的,这个IP地址并不一定是真正的公网IP,这个IP地址是不能直接被绑定的,如果要让外网访问,我们需要将IP地址绑定为。构造客户端时需要传入对应服务器的IP地址和端口号,我们这里也可以引入命令行参数。

2023-07-22 21:41:23 619

原创 【计算机网络】socket编程基础

当数据在传输层进行封装时,就会添加上对应源端口号和目的端口号的信息,在网络层又会添加上对应源IP地址和目的IP地址,这样一来,通过源端口号和源IP地址就能在网络上标识发送数据的进程,通过目的端口号和目的ID地址就可以在网络上标识接收数据的进程,这就实现了跨网络的进程间通信。同样的,UDP协议虽然是一种不可靠的传输协议,但这一定意味着UDP协议在底层不需要做过多的工作,因此UDP协议底层的实现一定比TCP协议要简单的多,UDP协议虽然不可靠,但是它能把数据快速地发给对方,虽然数据在传输的过程中可能会出错。

2023-07-21 15:34:32 1045

原创 【计算机网络】网络基础

也就是说,虽然客户端和服务器可能使用的是不同种类的操作系统,但每个系统实现网络协议栈的方法包括各种细节都是一样的,因此双方对数据进行封包和解包操作都是一样的。

2023-07-20 17:37:40 366

原创 【Linux】线程池

当我们去处理任务时,创建线程去进行处理,然后释放线程资源,在下次再有任务时,再创建线程,这样反反复复效率是比较低的。我们可以发现这五个线程在处理时会呈现一定的顺序性,因为主线程是每秒Push一个任务,这五个线程只会有一个线程获取到该任务,其他线程都会在等待队列中进行等待,当该线程处理完任务后就会因为任务队列为空而排到等待队列的最后,当主线程再次Push一个任务后唤醒等待队列首部的一个线程,这个线程处理完任务后又会排到等待队列的最后,因此这五个队列在处理任务时会呈现一定的顺序性。:一种线程使用模式。

2023-07-19 22:46:11 111

原创 【Linux】生产者消费者模型 -- RingQueue

在主函数中创建一个生产者线程和一个消费者线程,生产者线程不断将数据放入环形队列,消费者线程不断从环形队列里取出数据进行消费。现在我们用信号量来描述环形队列中的空间资源(blank_sem)和数据资源(data_sem),在我们初识化信号量时给它们设置的初始值是不同的;在我们自己所写的代码中,我们虽然只让生产者一秒生产一次,而没让消费者的消费速度受限制,但是它们最终的步调是一致的,这正是信号量的作用所在。信号量的初识值为1,说明信号量所描述的临界资源只有一份,此时信号量的作用基本等价于互斥锁。

2023-07-18 15:03:47 304

空空如也

空空如也

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

TA关注的人

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