自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++11 智能指针

weak_ptr支持expired检查指向的资源是否过期,use_count也可获取shared_ptr的引用计数,weak_ptr想访问资源时,可以调用lock返回一个管理资源的shared_ptr,如果资源已经被释放,返回的shared_ptr是一个空对象,如果资源没有释放,则通过返回的shared_ptr访问资源是安全的。通过这种引用计数的方式就能支持多个对象一起管理某一个资源,也就是支持了智能指针的拷贝,并且只有当一个资源对应的引用计数减为0时才会释放资源,因此保证了同一个资源不会被释放多次。

2025-11-24 11:02:36 590 12

原创 MySQL内置函数

对于多字节字符来说,不同编码中一个字符所占的字节个数是不同的,比如utf8中一个字符占用3个字节,而gbk中一个字符占用2个字节。strcmp函数用于逐字符按照ASCII码比较两个字符串的大小,两个字符串大小相等返回0,前者大返回1,后者大返回-1。现有如下成绩表,要求以“XXX的语文是XX分,数学是XX分,英语是XX分”的格式显示成绩表中的信息。如果在date_add函数中添加的日期/时间为负值,则相当于在日期的基础上减去日期/时间。在查询成绩表中的信息时,使用concat函数按要求进行字符串连接即可。

2025-10-20 07:25:21 976 2

原创 MySQL表的增删改查

在select的column列表中添加表达式查询,查询的表达式为语文、数学和英语成绩之和,为了方便观察可以将表达式对应的列指定别名为“总分”,在where子句中指明筛选条件为三科成绩之和小于200。也就是说,where子句的执行是先于select语句的,所以在where子句中不能使用别名,如果在where子句中使用别名,那么在查询数据时就会产生报错。查询数据时,在where子句中指明筛选条件为姓孙或姓曹(模糊匹配),在select的column列表中指明要查询的列为姓名和数学成绩。

2025-10-15 14:21:14 1086 24

原创 表的约束

外键约束 = 把现实世界中的“数据关系”和“逻辑规则”交给数据库,让它帮我们。

2025-10-10 19:19:06 1153 2

原创 MySQL数据类型

注:MySQL本身是不支持bool类型的,当把一个数据设置成bool类型时,数据库会自动将其转换成tinyint(1)的数据类型,其实这个就是变相的bool类型,因为tinyint(1)只有1和0两种取值,可以分别对应bool类型的true和false。此外,由于MySQL在保存值时会进行四舍五入,因此实际可插入float(4,2)的范围为-99.994~99.994,如果插入的数据不在该范围内,那么插入数据时就会产生报错。如果要存储的数据是变长的,那就使用varchar类型进行存储,比如名字、地址等。

2025-10-06 16:57:52 1012 30

原创 I/O 多路转接epoll

当ET底层缓冲区有数据后,ET只会通知用户进程一次,逼着用户一次要把缓冲区的数据读完,但是用户并不知道缓冲区的数据大小,只能进行循环读取recv,一旦底层缓冲区的数据被读完后,再调用recv如果是阻塞模式就被阻塞了,服务器就会被挂起。struct epoll_event结构中有两个成员,第一个成员events表示的是需要监视的事件,第二个成员data是一个联合体结构,一般选择使用该结构当中的fd,表示需要监听的文件描述符。网络协议栈或驱动层,当某个 fd 上有数据可读、可写或异常时,触发底层的。

2025-10-05 09:36:00 1081 21

原创 MySQL-表的操作

在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型, 表的存储引擎等等。可以看到在新增列之前插入表中的两条记录对应的assets值为NULL,因此新增列后可能还需要对原来插入的记录进行修改。数据库创建完毕后选中数据库,在该数据库中创建一个user表,并在建表时指定采用MyISAM存储引擎。在创建表之前需要先选中一个数据库,然后在数据库中创建表,这里我们先创建一个数据库。本篇博客讲的是表的DDL操作,也就是操作表结构的SQL语句。将user表的表名改成employee。

2025-10-04 09:39:31 1270 1

原创 MySQL库的操作(ubuntu)

但实际同一中字符集编码格式一般会有多种可选择的校验规则,比如utf8编码格式的校验规则有utf8_general_ci、utf8_bin、utf8_unicode_ci等校验规则。使用不同的校验规则操作数据库中的数据可能会得到不同的结果,比如utf8mb4_general_ci校验规则在比对数据时是不区分大小写的,而utf8mb4_bin校验规则在对比数据时则是区分大小写的。如果没有对MySQL的配置文件进行过修改,则默认的编码格式是utf8,默认的校验规则是utf8_general_ci。

2025-10-03 12:50:24 1855 22

原创 MySQL数据库基础(ubuntu环境)

存储数据用文件就可以了,为什么还要弄个数据库?文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便磁盘内存为了解决上述问题,专家们设计出更加利于管理数据的东西——数据库,它能更有效的管理数据。数据库的水平是衡量一个程序员水平的重要指标。

2025-10-02 17:25:25 1135 23

原创 I/O 多路转接select、poll

设最大文件描述符是。

2025-09-30 07:07:11 1314 19

原创 浏览器发起http,到得到网页的整个过程

当服务端的服务器建立好后,http请求的网页资源位于服务端应用层某路径下的文件(比如index.html在浏览器发起 HTTP 请求之前,需要经过 DNS 解析过程来获取服务器的 IP 地址。

2025-09-27 15:39:18 2133 38

原创 数据链路层:网络通信的基础与桥梁

负责将数据从源主机传输到目标主机,解决的是跨网络的通信问题,但并不保证数据的可靠性。

2025-09-25 22:07:28 1189 26

原创 为什么你的数据能准确送达?——网络层的使命与IP的力量

数据包不断经过路由器路由后,最终就能到达目标主机所在的目标网络,此时就不再根据该数据包目的IP地址当中的网络号进行路由了,而是根据目的IP地址当中的主机号进行路由,最终根据该数据包对应的主机号就能将数据发送给目标主机了。也就是说,IP地址中主机号为全0的代表的是当前局域网的网络号,IP地址中主机号为全1的代表的是广播地址,这两个IP地址都是不能作为主机的IP地址的。CIDR虽然在一定程度上缓解了IP地址不够用的问题,因为CIDR提高了IP地址的利用率,减少了浪费,但IP地址的绝对上限并没有增加。

2025-09-22 19:22:45 1688 33

原创 TCP 协议全解析:握手、挥手、重传与流控的深度剖析

窗口左边界之前的数据已被确认,可以安全释放;以刚才的例子为例,当主机B收到主机A发送过来的32位序号为1的报文时,由于该报文当中包含1000字节的数据,因此主机B已经收到序列号为1-1000的字节数据,于是主机B发给主机A的响应数据的报头当中的32位确认序号的值就会填成1001。在进行网络通信时,一方发出的数据后,它不能保证该数据能够成功被对端收到,因为数据在传输过程中可能会出现各种各样的错误,只有当收到对端主机发来的响应消息后,该主机才能保证上一次发送的数据被对端可靠的收到了,这就叫做真正的可靠。

2025-09-20 13:23:06 1428 39

原创 应用层协议——HTTP

我们这里要演示临时重定向,可以将HTTP响应当中的状态码改为302,然后跟上对应的状态码描述,此外,还需要在HTTP响应报头当中添加Location字段,这个Location后面跟的就是你需要重定向到的网页,比如我们这里将其设置为qq的首页。其中,前面三部分是一般是HTTP协议自带的,是由HTTP协议自行设置的,而请求正文一般是用户的相关信息或数据,如果用户在请求时没有信息要上传给服务器,此时请求正文就为空字符串。但实际我们上传数据时也有可能使用GET方法,比如百度提交数据时实际使用的就是GET方法。

2025-09-17 08:02:25 1307 32

原创 题目:四数之和

【代码】题目:四数之和。

2025-09-12 16:26:02 137 3

原创 题目:三数之和

不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。答案中不可以包含重复的三元组。唯一可能的三元组和不为 0。,判断是否存在三元组。

2025-09-12 16:25:41 251 2

原创 题目:有效三角形的个数(X)

返回其中可以组成三角形三条边的三元组个数。2,3,4 (使用第一个 2)2,3,4 (使用第二个 2)给定一个包含非负整数的数组。

2025-09-12 16:25:05 144

原创 题目: 查找总价格为目标值的两个商品

请在购物车中找到两个商品的价格总和刚好是。购物车内的商品价格按照升序记录于数组。若存在多种情况,返回任一结果即可。[27,34] 或者 [34,27][3,15] 或者 [15,3]

2025-09-12 16:24:48 237 2

原创 题目:盛水最多的容器(medium)

题目描述: 给定⼀个长度为 n 的整数数组height。有 n 条垂线,第i条线的两个端点是 height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的⽔。返回容器可以储存的最大水量。说明:你不能倾斜容器。⽰例1: 输入: [1,8,6,2,5,4,8,3,7] 输出: 49。

2025-09-12 16:24:27 204

原创 题目:快乐数

Tortoise and Hare Algorithm)​,是一种用于检测序列或链表中是否存在环(循环)的经典算法。它的核心思想非常简单且巧妙:使用两个指针以不同的速度遍历序列,如果序列中存在环,那么这两个指针必定会在环内的某一点相遇。​:尽管兔子跑得快,先进入了环,但乌龟最终也会进入环。将它们都置于序列的起始点(或者根据问题要求,置于指定的初始位置)。​:一条跑道,可能是一条直道(无环),也可能是一个环形跑道(有环)。​:说明序列中存在环,算法结束。​:说明序列无环,算法结束。编写一个算法来判断一个数。

2025-09-12 16:23:35 460

原创 题目:复写零

找最后一个数(c的任务)两种情况c都预留了两个空位,是因为在复制0时,dest(d)不仅要存储0还要存储0的下一个数。请对输入的数组就地进行上述修改,不要从函数返回任何东西。代码一看就懂了,从后往前复制,就不存在越界的问题,也避免了复写零时覆盖了要移动的数。调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4],请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。左边一组是没有越界的,右边是越界情况,这种思路第一次比较难想。调用函数后,输入的数组将被修改为:[1,2,3]

2025-09-12 16:23:11 343 1

原创 为什么所有网站都要上HTTPS?一文彻底搞懂

加密就是把明文(要传输的信息)进行一系列变换,生成密文解密就是把密文再进行一系列变换,还原成明文在这个加密和解密的过程中,往往需要一个或者多个中间的数据,辅助进行这个过程,这 样的数据称为密钥数字指纹(数据摘要),其基本原理是利用单向散列函数(Hash函数)对信息进行运算, 生成一串固定长度的数字摘要(强唯一性数字指纹并不是一种加密机制,但可以用来判断数据有没有被篡改。

2025-09-11 18:22:59 1883 30

原创 C++ 二叉搜索树

找N左子树的值最大结点R(最右结点)或者N右子树的值最小结点R(最左结点)替代N,因为这两个结点中任意一个,放到N的位置,都满足二叉搜索树的规则。替代N的意思就是N和R的两个结点的值交换,转而变成删除R结点,R结点符合情况2或情况3,可以直接删除。如果支持插入相等的值,插入值跟当前结点相等的值可以往右走,也可以往左走,找到空位置,插入新结点。树不空,按二叉搜索树性质,插入值比当前结点大往右走,插入值比当前结点小往左走,找到空位置,插入新结点。把N结点的父亲对应孩子指针指向N的左孩子,直接删除N结点。

2025-09-10 19:39:08 1091 18

原创 进程间关系与守护进程

刚刚我们谈到了进程组的概念,那么会话又是什么呢?会话其实和进程组息息相关, 会话可以看成是一个或多个进程组的集合,一个会话可以包含多个进程组。每一个会话也有一个会话ID(SID)通常我们都是使用管道将几个进程编成一个进程组。如上图的进程组2和进程组3可 能是由下列命令形成的:Shell# &表示将进程组放在后台执行。

2025-09-09 14:46:09 1215 23

原创 应用层自定义协议与序列化

toStyledString、StreamWriter 和FastWriter 提供了不同的序列化选项, 你可以根据具体需求选择使用。Json::Reader 和parseFromStream 函数是Jsoncpp中主要的反序列化工具, 它们提供了强大的错误处理机制。在进行序列化和反序列化时,请确保处理所有可能的错误情况,并验证输入和输出的有效性。

2025-09-06 06:33:28 4609 58

原创 C++11可变参数模板、emplace系列接口、包装器

function包装器function是一种函数包装器,也叫做适配器。它可以对可调用对象进行包装,C++中的function本质就是一个类模板。是一个类模板,也是一个包装器。的实例对象可以包装存储其他的可调用对象,包括函数指针、仿函数、lambda、bind表达式等,存储的可调用对象被称为的目标。若不含目标,则称它为空。调用空的会导致抛出异常。以上是function的原型,它被定义在头文件中。是function的官方文档链接。函数指针、仿函数、lambda 等可调用对象的类型各不相同,

2025-09-04 19:10:38 987 22

原创 网络编程 socket——TCP

服务端运行后,通过netstat命令可以查看到一个程序名为tcp_server的服务程序,它绑定的端口就是1024,而由于服务器绑定的是INADDR_ANY,因此该服务器的本地IP地址是0.0.0.0,这就意味着该TCP服务器可以读取本地任何一张网卡里面的数据。但在这个客户端正在享受服务端的服务时,我们让另一个客户端也连接服务器,此时虽然在客户端显示连接是成功的,但这个客户端发送给服务端的消息既没有在服务端进行打印,服务端也没有将该数据回显给该客户端。

2025-09-02 22:43:18 1860 46

原创 C++11 ——— lambda表达式

汇编层可以看到 r2 lambda对象调用本质还是调用operator() ,类型是 lambda_1, 这个类型名的规则是编译器自己定制的,保证不同的 lambda 不冲突。这样一来,每次调用sort函数时只需要传入一个lambda表达式指明比较方式即可,阅读代码的人一看到lambda表达式就知道本次排序的比较方式是怎样的,提高了代码的可读性。但这里仿函数也不那么优雅,现实生活中排序可以是价格,也可能是商品上架时间,销量,评分等等,每一种都要实现大于小于的仿函数,那么一共可能有10多个。

2025-09-01 21:05:39 1141 29

原创 C++11——万能模板及完美转发

万能引用上面代码中的第二个模板其实就是万能引用的模板,模板中的&&不代表右值引用,而是万能引用,其既能接收左值又能接收右值。比如:右值引用和万能引用的区别就是,右值引用需要是确定的类型,而万能引用是根据传入实参的类型进行推导,如果传入的实参是一个左值,那么这里的形参t就是左值引用,如果传入的实参是一个右值,那么这里的形参t就是右值引用。如果传入一个左值,模板参数 被推导为 。如果传入一个右值,模板参数 被推导为 。为什么需要转发?下面重载了四个Fun函数,这四个Fun函数的参数类型分

2025-08-31 15:11:31 939 30

原创 C++11基础——— 右值引用和移动语义

C++11是C++的第⼆个主要版本,并且是从C++98起的最重要更新。它引入了大量更改,标准化了既有实践,并改进了对C++程序员可用的抽象。在它最终由ISO在2011年8月12日采纳前,人们曾使用名称“C++0x”,因为它曾被期待在2010年之前发布。C++03与C++11期间花了8年时间,故而这 是迄今为止最长的版本间隔。从那时起,C++有规律地每3年更新⼀次。

2025-08-30 16:18:43 857 28

原创 线程池及线程池单例模式

HandlerTask()是怎么通过回调函数Routinue执行的?由于我们封装了Thread.hpp,在线程类里是通过回调函数Routine// 在线程池构造函数中创建线程});Thread.hpp中Thread类的Start()方法// ...创建POSIX线程,指定Routine为线程入口函数将this指针(Thread对象)作为参数传递给RoutineRoutine函数(静态成员函数)// 这里调用HandlerTask()!!!​_func。

2025-08-28 21:34:05 1342 48

原创 日志的实现

,它提供了处理文件系统和路径的标准方法。我们在上面实现的仿函数没有使用引用,当我们向上面代码这样使用时,logger返回的是一份临时对象(类型是LogMessage包含_loginfo的信息)临时对象在下一行代码就会被析构,析构时就会调用SyncLog函数打印对应的信息在屏幕上。策略模式就是利用多态的特性,我们先定义出一个LogStrategy的基类,后面通过我们传的不同派生类来实现不同的模式,比如向屏幕打印的ConsoleLogStrategy派生类和向文件写入的FileLogStrategy派生类。

2025-08-27 22:18:21 1052 40

原创 C++多态

多态是⼀个继承关系的下的类对象,去调用同⼀函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象优惠买票。在虚函数的后面写上=0,则这个函数为纯虚函数。纯虚函数不需要定义实现(实现没啥意义因为要被派生类重写,但是语法上可以实现),只要声明即可。包含纯虚函数的类叫做抽象类,抽象类不能实例化出对象。如果派生类继承后不重写纯虚函数,那么派生类也是抽象类。纯虚函数某种程度上强制了派生类重写虚函数,因为不重写实例化不出对象。//抽象类class Car。

2025-08-26 17:12:11 1105 48

原创 C++继承

继承(inheritance)机制是面向对象程序设计使代码可以复⽤的最重要的手段,它允许我们在保持原有 类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称派生 类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复用,继承是类设计层次的复用。

2025-08-25 18:39:11 1310 37

原创 网络编程socket-Udp

​:发送数据包的设备的 IP 地址。

2025-08-24 20:20:55 1666 50

原创 C++模板进阶

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。增强了代码的灵活性。模板会导致代码膨胀问题,也会导致编译时间变长。出现模板编译错误时,错误信息非常凌乱,不易定位错误。

2025-08-23 16:21:14 1297 44

原创 linux网络基础

为了能够快速的让两个相隔千里之外的计算机,能够区分出数据是哪些类别,每一种特别类型种的某一些特别的数据的含义,所以就需要通过以提前约定好的方式来减少双方通讯成本的问题。• 定好协议,但是你用频率表示01,我用强弱表示01,就好比我用中国话,你 用葡萄牙语一样,虽然大家可能遵守的一套通信规则,但是语言不同,即是订好了 基本的协议,也是无法正常通信的。关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型 因为协议栈是分层的,所以,每层都有双方都有协议,同层之间,互相可以认识对 方的协议。

2025-08-22 19:23:42 1101 39

原创 C++STL-stack和queue的使用及底层实现

/使用内置类型//使用特定的适配器定义栈。如果没有为stack指定特定的底层容器,默认情况下使用deque。//默认类型//自定义类型如果没有为queue指定特定的底层容器,默认情况下使用deque。

2025-08-21 16:07:52 1044 40

原创 C++STL-list 底层实现

对自定义类型传值传参要调用对应的拷贝构造函数,我们通常加上&(引用)是为了减少传值传参带来的拷贝冗余,但是我们这里故意不用引用,那么lt就是lt1的拷贝,通过交换lt来实现赋值,这样把lt1赋值给了lt2,并且我们交换的是lt(lt1的拷贝)并不会影响lt的数据,并且出函数时,临时对象lt会自动析构。可以理解我们写的是一个迭代器模板,通过传递的参数不同由编译器帮我们实例化出是普通迭代器还是const迭代器,如果不用Ref和Ptr我们就要写两种迭代器并且它们是高度相似的。

2025-08-20 21:51:27 1219 26

空空如也

空空如也

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

TA关注的人

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