自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Git】Git 常用指令

1)当文件在本地工作区误删除,但是存储器还存在该文件,即本地删除了但没有commit删除操作(例如,误删了a.txt)3)情况同2),但是会保留删除和文件恢复的过程在log中 ,注意(2)的操作是不保留删除和文件恢复的过程在log中的。2)当文件在本地工作区误删除,且执行了commit删除操作(例如,误删了a.txt),即存储器不存在该文件了。创建新的分支【例如,创建的分支名为user】(要保证文件夹中 先有内容,如a.txt)增加/修改/删除 文件(先在文件夹中对文件就行操作,例如a.txt,再敲命令)

2024-03-21 15:41:27 872 1

原创 【Redis】常见命令

2024-01-08 14:04:03 505

原创 【C++基础】内存泄漏检测——Valgrind、VLD、CRT

关于C++中内存检测工具的简单使用

2023-09-26 11:15:58 897

原创 【项目总结】C++ 云盘

本项目是一款分布式云存储软件,旨在提供强大的文件存储和共享功能。因为要运行高并发量的访问,所以进行了服务器的集群,也就是要有多台web服务器,每台web服务器中部署相同的程序,为了让这几台web服务器的负载是均衡的,搭建了一个反向代理服务器,在反向代理服务器所对应的配置文件中平衡地给多个web分配任务每台web服务器上部署了nginx,nginx可以解析http请求,nginx只能部署静态页面,可以在安装目录下将静态页面放到相应的地方。

2023-09-22 16:10:20 990

原创 【嵌入式】化繁为简 UART、I2C、SPI整理

UART、I2C、SPI整理

2023-09-13 21:01:03 477

原创 【C++基础】lambda表达式

lambda表达式的相关整理

2023-09-12 22:43:01 199

原创 【C++基础】左值引用、右值引用、move、forward

对左值引用、右值引用、move、forward的一些整理和总结

2023-09-12 21:26:19 206

原创 【C++基础】简单工程模式、工厂模式、抽象工程模式

工厂模式的一些整理

2023-09-12 11:33:04 353

原创 【C++基础】观察者模式(“发布-订阅”模式)

观察者模式的一些整理和摘抄

2023-09-11 23:05:05 913

原创 【C++基础】单例模式

对Cpp中单例模式的一些整理

2023-09-11 21:19:31 459

原创 【面试心得】C++ 线程池总结

线程池(Thread Pool)是一种多线程编程的设计模式,它用于管理和复用线程,以有效地执行并发任务。线程池由一组预创建的线程组成,这些线程在需要时被分配来执行任务。线程池的核心思想是将线程的创建、销毁和管理工作从任务执行中分离出来,从而提高性能、资源利用率和代码可维护性。在多线程应用程序中,频繁地创建和销毁线程会导致额外的开销,包括内存分配、上下文切换等。线程池在应用程序启动时创建一组线程,并在任务完成后不立即销毁它们,而是将它们保持在池中以供重用。

2023-09-11 13:58:33 1047

原创 【面试心得】系统调用

这个问题也是在九识面试的时候被问到的,当时我说就是像Shell,从用户态转移到内核态的过程,面试官让我说的详细一点,我就说不出来了,然后我就说了一些函数调用的过程,hhhh。现在在这里做一个记录吧。

2023-09-08 11:15:54 834

原创 【面试心得】WebBench 整理

在面试九识的时候,被问到了WebBench的原理,当时没答上来,这里做一个整理

2023-09-08 10:16:08 417

原创 【C++基础】关于vector的扩容

以2倍的方式扩容,导致下一次申请的内存必然大于之前分配内存的总和,导致之前分配的内存不能再被使用,所以最好倍增长因子设置为(1,2)之间。1.5倍扩容可以使得 之前分配的内存被再次利用。而2倍扩容,扩容时,只能一直寻找新的内存。>2倍的扩容可能产生的堆空间浪费。固定值扩容,时间复杂度为O(n)后来看到这张图,就变得很明了。成倍扩容,时间复杂度为常数项。

2023-08-31 09:33:30 221

原创 【Mysql】索引汇总

这个就叫前缀索引,这样在查找记录时虽然不能精确的定位到记录的位置,但是能定位到相应前缀所在的位置,然后根据前缀相同的记录的主键值回表查询完整的字符串值。这个建议对于表的主键来说更加适用,因为不仅是聚簇索引中会存储主键值,其他所有的二级索引的节点处都会存储一份记录的主键值,如果主键使用更小的数据类型,也就意味着节省更多的存储空间和更高效的IO。因为更新数据的时候,也需要更新索引,如果索引太多,在更新索引的时候也会造成负担,从而影响效率。第二层含义:避免对经常更新的表创建过多的索引,并且索引中的列尽可能少。

2023-08-28 22:18:34 205

原创 【计算机网络】HTTPs 传输流程

1、HTTP协议传输的数据都是未加密的,是明文的,使用HTTP协议传输隐私信息非常不安全, HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。,可以保证在数据收发过程中的安全,即是第三方获得数据包,也无法对其进行加密,解密和篡改。客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。

2023-08-25 14:58:15 2427

原创 【0824面试】快手客户端开发一面凉经

太紧张了,就给了一天时间准备,有点失了智,唉,不过自己掌握的也确实不够好,因为非科班 考了很多计算机原理的东西,没怎么答上来……7、https传输的过程, 每一次都需要公钥加密私钥解密吗?知道底层算法是什么吗。5、如何在cache中写入数据?2、什么时候会发送缺页中断。8、常见排序算法和复杂度。手撕题:寻找最近公共祖先?1、计算机指令有哪些。4、虚拟内存和物理内存。设计题:两个队列实现栈。3、页表的内部结构?

2023-08-25 14:11:35 158

原创 【网络编程】muduo库——InetAddress类

inet_aton() 转换网络主机地址ip(如192.168.1.10)为二进制数值,并存储在struct in_addr结构中,即第二个参数*inp,函数返回非0表示cp主机有地有效,返回0表示主机地址无效。inet_ntoa 函数转换网络字节排序的地址为标准的ASCII以点分开的地址,该函数返回指向点分开的字符串地址(如192.168.1.10)的指针,该字符串的空间为静态分配的,这意味着在第二次调用该函数时,上一次调用将会被重写(复盖),所以如果需要保存该串最后复制出来自己管理!

2023-08-21 14:04:47 159

原创 【网络编程】muduo库——Timestamp类

explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,使得不能发生相应的隐式类型转换,只能以。这里的时间类主要是为了调取当前时间,并进行格式化,方便后续调用(如在Logger中调用)申明:这是一个仿muduo库的项目,在这里只截取一些重要的部分进行仿写~其实为了严谨考虑,所有带参的构造函数都应该使用explicit。下面实现类方法,我们这里借助了time的库函数。第二个方法使用了explicit关键字。

2023-08-20 22:59:17 162

原创 【网络编程】muduo库——Logger日志类

其实设置日志级别 或者是获取单例等,对于调用者来说是不重要的,因为调用者只想简单的调用一个函数来完成日志的输出,如果我们直接将上述类交给调用者,他们用起来还是太复杂了。1、因为日志对象在整个项目中是唯一的,所以采用单例模式,来获取日志对象。这里的宏定义为什么使用do……while(0)呢,可参考下面的博客,总之就是。和_ _VA_ARGS_ _是组合使用的,用在不确定参数个数的场合中。其内部实现如下所示,也是主打一个简单易懂,这里就不多说啥了。可变参数宏...和_ _VA_ARGS_ _

2023-08-20 22:01:23 198

原创 【网络编程】muduo库——noncopyable

继承自这个类的子类,都直接拥有了禁止拷贝的功能,而不用在自身的类中再一个个单独禁用拷贝。可以说 这是一个极为巧妙的设计。在研读muduo库源码时,可以发现其中的很多类都是私有继承自noncopyable的。继承自 noncopyable 之后,派生类对象可以正常地构造和析构。其将拷贝构造和拷贝运算符禁止使用了,然后析构和构造函数保持默认。其实从名字也可以得知 noncopyable——不可复制。那么这是一个什么类呢?为什么要继承这个类?但是派生类对象无法进行拷贝构造和赋值操作。

2023-08-20 20:51:02 175

原创 【笔试题心得】物理内存和虚拟内存的区别和联系

如果没能在页表中查询到虚拟地址对应的物理地址,则会触发一个与MMU相关的缺页异常,在异常处理的过程中,会将EMMC中相关的数据加载到主存,然后建立相应的页表,然后将物理地址对应的内容返回给cache及处理器。当程序引用到不在物理内存中的页时,由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失败的指令。页表的查询过程是由TWU硬件自动完成的,但是页表的维护是需要操作系统实现的,页表存放在主存中。虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。为了更好的管理内存,

2023-08-16 16:25:38 1251

原创 【笔试题心得】排序算法总结整理

希尔排序的思想是采用插入排序的方法,先让数组中任意间隔为 h 的元素有序,刚开始 h 的大小可以是 h = n / 2,接着让 h = n / 4,让 h 一直缩小,当 h = 1 时,也就是此时数组中任意间隔为1的元素有序,此时的数组就是有序的了。当每次堆排序完成后,最顶端的即是当前堆的最大值,随后可以将堆的最大值与堆的倒数第一个元素互换,因为此时当前最大值已经完成排序,将其赶出堆内,堆的size减1,剩下的元素进行堆重构。我们以[ 8,2,5,0,7,4,6,1 ]这组数字为例来进行演示。

2023-08-15 22:42:11 390

原创 【笔试题心得】关于正则的一些整理

例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。'\n' 匹配一个换行符。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'例如, '[^abc]' 可以匹配 "plain" 中的'p'、'l'、'i'、'n'。

2023-08-15 12:01:16 588

原创 【笔试题心得】关于KMP在笔试中的题型

其前缀是{a, ab, aba, abac, abaca, abacab},真前缀是{a, ab, aba, abac, abaca};对于串“ababa”,其真前缀{a, ab, aba, abab}与真后缀{baba, aba, ba, a}的交集为{a, aba},其中“aba”最长,为3,因此串“ababa”的最长相等真前后缀长度为3。对于一个字符串,其前缀是指其所有头部子串(包括本身)构成的集合,而“真前缀”就是不包括其本身的所有头部子串构成的集合,可以参考子集和真子集的比较。

2023-08-14 16:08:59 424

原创 【leetcode】前缀和

内容摘抄自: 小而美的算法技巧:前缀和数组 | labuladong 的算法小抄看这个 数组,若想求索引区间 内的所有元素之和,就可以通过 得出。如leetcode 304:注意任意子矩阵的元素和可以转化成它周边几个大矩阵的元素和的运算: 而这四个大矩阵有一个共同的特点,就是左上角都是 原点。那么做这道题更好的思路和一维数组中的前缀和是非常类似的,我们可以维护一个二维 数组,专门记录以原点为顶点的矩阵的元素之和,就可以用几次加减运算算出任何一个子矩阵的元素和:值得注意的是 preSum数组

2023-08-12 23:29:03 344

原创 【C++基础】手撕shared_ptr

当使用移动构造函数创建一个新的智能指针并将另一个智能指针的资源所有权转移给它时,移动构造不会影响引用计数。引用计数会在资源所有权转移后保持不变,原来的智能指针会被置为 nullptr ,不再指向资源。当使用移动赋值运算符将一个智能指针的资源所有权转移给另一个智能指针时,移动赋值不会影响引用计数。与移动构造类似,资源的所有权转移后,原来的智能指针会被置为 nullptr ,引用计数保持不变。构造函数(动态创建)、析构函数(销毁对象)对于引用计数的操作服从智能指针的设计规则。拷贝运算符(->、*)

2023-08-11 21:51:03 454 1

原创 【C++基础】友元总结&&一些坑

编译器会在友元类的代码中直接访问被访问类的私有成员,同样无需经过访问权限检查。编译器在生成代码时会根据友元关系插入适当的权限访问代码,以确保友元函数或友元类可以访问私有成员。这样,尽管在类的定义中进行了访问控制,但通过友元关系,某些函数或类可以绕过这些访问限制来访问私有成员。总的来说,友元关系的底层实现是。

2023-08-08 22:58:55 1476

原创 【leetcode】394. 字符串解码

这里用到两个栈,(也有人用一个栈的 stack<pair<string, int>> st,其本质也是两个栈,为了更清楚的表达,这里我们采用两个栈))由于在遍历字符串s的过程中,会冲掉前面保存的数组和字符串,所以要选用栈来对字符串和数字进行保存。输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。//4、如果是']' 将数字和字符栈各取出,然后拼接成新的临时字符串。首先不可避免的是,要记录两个值,一个是字符串,一个是字符串重复的次数,即数字。给定一个经过编码的字符串,返回它解码后的字符串。

2023-08-06 14:52:25 189

原创 【并发编程】线程安全的栈容器

std::stack容器的接口包括 empty(), size(), top(), push(), pop()等。

2023-08-05 19:28:03 215

原创 【网络编程】epoll

若我们有几百万的客户连接,这个数组肯定是越大越好,若我们只有十几个的客户连接,若将数组创建的很大,就会造成空间的浪费,而我们也无法预知一共有多少个连接,因此哈希表就不太适合。其实红黑树和就绪队列存储在同一个结构体中(epitem),当epitem中对应的文件描述符上的事件(event)已经就绪的时候,回调函数就会将该节点连接到已就绪的双端就绪队列中,其实只是在红黑树中做了指针的链接,而我们为了描述更加清晰,可以直接说将红黑树上相应的节点拷贝到就绪列表中。epoll通过内核和⽤户空间共享⼀块内存来实现的。

2023-08-03 12:42:29 168

原创 【网络编程】poll

fds:是一个struct pollfd 结构体数组,这是一个需要检测的文件描述符的集合。events及revents取值,如果有多个事件需要检测,用|即可,如同时检测读和写:POLLIN|POLLOUT。-1:阻塞,当检测到需要检测的文件描述符有变化,解除阻塞。nfds:这个是第一个参数数组中最后一个有效元素的下标 + 1。>0(n):检测的集合中有n个文件描述符发生了变化。>0:具体的阻塞时长(ms)timeout:阻塞时长。通过man poll查看帮助。

2023-08-02 22:42:02 324

原创 【网络编程】select

fd_set:是一块固定大小的缓冲区(结构体), sizeof(fd_set)=128,即对应1024个比特位。初始置为-1,当有状态改变时,置为相应文件描述符。轮训时,跳过标记为-1的客户端,加快遍历速。个最大可监听数量,可以申请等量客户端数组。对于问题二:对读缓存区循环读,直到返回。内核检测完毕后,返回给用户态结果。调用select委托内核检测。timeval:结构体类型。通过man select。select参数列表说明。

2023-08-02 22:01:45 267

原创 【网络编程】五种网络IO模式

对于一次IO访问(以read为例),数据会中,然后。所以说,当一个read操作发生时,会经历两个阶段:1、等待数据准备2、将数据从内核拷贝到进程中linux系统产生了下面五种网络模式的方案1、阻塞IO(blocking IO)2、非阻塞IO(nonblocking IO)3、IO多路复用(IO multiplexing)4、信号驱动IO(signal driven IO)不常用5、异步IO (asynchronous IO)1、阻塞IO(blocking IO)这种IO模型是。

2023-08-02 21:05:11 486

原创 【网络编程】同步IO/异步IO

继续开始做自己的事情,而当I/O操作已经完成的时候会得到I/O完成的通知。同步IO需要发起者进行内核态到用户态的数据拷贝过程,所以这里必须阻塞。,内核线程将数据从内核态拷贝到用户态,所以这里没有阻塞。的去查看I/O操作是否就绪。

2023-08-02 16:44:00 289

原创 轮转数组——左旋数组,右旋数组

左旋转字符串:【1234567】—左旋3下—>【4567123】右旋转字符串:【1234567】—右旋3下—>【5671234】

2023-07-18 21:59:43 339

原创 和为 K 的子数组——前缀和+哈希

注意:此题不能使用滑动窗口,因为数组中可能会出现负数。也就是说右指针向后移1位不能保证区间会增大,左指针向后移1位也不能保证区间和会减小。即sum[j] = sum[i]-k;这个sum[j]的个数就是数组中和为k的连续子数的个数。已知sum[i]是从nums[0~i]的和,sum[i-1]是nums[0~i-1]的和。则存在一个j(0<=j<=i) 使得sum[i]-sum[j] = k;则有 sum[i] - sum[i-1] = nums[i]在本题解中,在循环中完成sum[i]的计算即sum。

2023-07-18 21:19:46 720

原创 代码随想录算法训练营第六十天| 84.柱状图中最大的矩形

假设以柱子1(指值为1的柱子)为基准,柱子1的左侧没有比柱子1矮的元素,所以柱子1可以无限像左边扩展,柱子1的右侧也没有比柱子1矮的元素,所以柱子1可以无限向右边扩展,以柱子5为基准,柱子5左侧没有比柱子5矮的柱子,说明柱子5左边不能进行扩展了,而柱子5右边第一个比柱子5小的柱子是柱子2,这说明柱子5能够扩展到柱子2(不包含柱子2)当当前元素小于栈顶元素时,比较此时栈顶元素右边元素、栈顶元素、当前元素的大小关系。所以柱子1的高度可以贯彻整个柱状图,即以柱子1为高度的面积为:1*6=6。

2023-07-09 20:25:08 110

原创 代码随想录算法训练营第五十九天| 503.下一个更大元素II| 42. 接雨水

当原来的栈顶元素弹出后,新的栈顶元素st.top(),就是凹槽的左边位置,下标为st.top(),卡哥的标答中指出,其实也可以不扩充nums,而是在遍历的过程中模拟走了两边nums。取栈顶元素,将栈顶元素弹出,这个就是凹槽的底部,也就是中间位置,下标记为mid。当前遍历的元素i,就是凹槽右边的位置,下标为i,对应的高度为height[i]。雨水的宽度是 凹槽右边的下标 - 凹槽左边的下标 - 1(因为只求中间宽度),栈顶和栈顶的下一个元素以及要入栈的元素,三个元素来接水。单调栈st中储存遍历过的元素下标。

2023-07-08 17:28:29 296

原创 代码随想录算法训练营第五十八天|739. 每日温度、496.下一个更大元素 I

总体思路和上题一致,先得出nums2的result数组,再根据result推算出nums1各元素的下一个更大元素。如果需要使用对应的元素,直接T[i]就可以获取。卡哥采用了map数据结构,使代码更精简。单调栈里 存放元素的下标i,

2023-07-07 23:01:12 135

空空如也

空空如也

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

TA关注的人

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