自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 路由设计中的参数校验

参数校验有两种方式:1: 使用结构体方法实现校验逻辑;2: 使用结构体中的 Tag 定义校验。type RegisterParam struct { Phone string `json:"phone"` Password string `json:"password"`}func (param RegisterParam) suitable() (bool, error) { if param.Password == "" || len(param.Phone) != 11 { r

2022-01-10 16:53:33 210

原创 shell:cd的使用技巧

问题: 当在cd进入下一级目录时,有时子目录的名字过于长,或者子目录多个名字相似;情景一:目录下的子目录只有一个这个时候不需要输入目录名字,直接使用cd *或 cd */➜ daySeven mkdir test01➜ daySeven cd *➜ test01➜ daySeven cd */➜ test01情景二:目录下的子目录记不住全称使用tab键自动补全:输入f+tab➜ daySeven mkdir fheivhve➜ daySeven cd fhei

2021-12-30 16:18:36 3438

转载 什么是用户态和内核态

什么是用户态和内核态从图上我们可以看出来通过系统调用将Linux整个体系分为用户态和内核态(或者说内核空间和用户空间)。那内核态到底是什么呢?其实从本质上说就是我们所说的内核,它是一种特殊的软件程序,特殊在哪儿呢?控制计算机的硬件资源,例如协调CPU资源,分配内存资源,并且提供稳定的环境供应用程序运行。用户态就是提供应用程序运行的空间,为了使应用程序访问到内核管理的资源例如CPU,内存,I/O。内核必须提供一组通用的访问接口,这些接口就叫系统调用。为什么要区分内核态和用户态往往我们的系统的资源是

2021-03-19 11:08:09 5935 1

转载 mallco内存分配底层实现

1)当开辟的空间小于 128K 时,调用 brk()函数,malloc 的底层实现是系统调用函数 brk(),其主要移动指针_enddata(此时的_enddata 指的是 Linux 地址空间中堆段的末尾地址,不是数据段的末尾地址)2)当开辟的空间大于 128K 时,mmap()系统调用函数来在虚拟地址空间中(堆和栈中间,称为“文件映射区域”的地方)找一块空间来开辟。这两种方式分配的都是虚拟内存,没有分配物理内存。在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立

2021-03-16 10:20:53 313

转载 MVCC的实现

什么是MVCC:多版本并发控制(multiversion concurrency control),可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。大多数的MVCC都实现了非阻塞的读操作,写操作也只锁定必要的行。当前读像select lock in share mode(共享锁), select for update ; update, insert ,delete(排他锁)这些操作都是一种当前读,为什么叫当前读?就是它读取的是记录的最新版本,读取时还要保证

2021-03-15 16:08:28 194

原创 指针和引用的区别

指针:指针的值是一个地址,指向一个内存单元;可以为空值,可以改变值引用:引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已,不可为空,不能变值sizeof:sizeof引用为对象大小,sizeof指针则为指针自己的大小。自增操作(++)如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄漏;必须使用引用的地方:operator = 的返回值必须是 A&;(p1 = p2) = p3;p1只得到了p2的内容,并没有得到p3的内容,这是因为执行(p1 = p2.

2021-03-13 11:01:42 156

转载 HTTP1.x与HTTP2.0的区别

HTTP2.0新增以下内容:HTTP2.0性能增强的核心:二进制分帧在二进制分帧层上,HTTP 2.0 会将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码 ,其中HTTP1.x的首部信息会被封装到Headers帧,而我们的request body则封装到Data帧里面。然后,HTTP 2.0 通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。相应地,每个数据流以消息的形式发送,而消息由一或多个帧组成,这些帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装。HT

2021-03-12 15:19:21 313

原创 C++不知道有多少输入

while (cin >> m) { num.push_back(m); if (cin.get() == '\n') break;}

2021-03-11 15:48:33 302

原创 为什么红黑树的最长路径不超过最短路径的两倍

红黑树的性质:每个节点不是红色就是黑色根节点为黑色没有连续的红色节点对于每个节点,每条路径上的黑色节点数相同那么为什么当满足以上性质时,就能保证最长路径不超过最短路径的二倍了呢?我们分析一下:最短路径为全黑,最长路径就是红黑节点交替(因为红色节点不能连续),每条路径的黑色节点相同,则最长路径、刚好是最短路径的两倍。红黑树为什么删除效率高:红黑树不追求"完全平衡",即不像AVL那样要求节点的高度差 <= 1,它只要求部分达到平衡,但是提出了为节点增加颜色,红黑是用非严格的平衡来

2021-03-10 22:39:41 2403 8

原创 2021-03-04

select: 每个连接对应一个描述符(socket),循环处理各个连接,先查下它的状态,ready了就进行处理,不ready就不进行处理。但是缺点很多:每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大select支持的文件描述符数量太小了,默认是1024poll: 本质上和select没有区别,但是由于它是基于链表来存储的,没有最大连接数的限制。缺点是:大量的的数组.

2021-03-04 20:29:49 65 1

原创 STL中内存分配问题

STL中内存配置时的设计哲学如下:向system heap要求空间考虑多线程(multi-threads)的状态考虑内存不足时的应变措施考虑过多“小型区块”可能造成的内存碎片(fragment)问题解决方法如下:SGI以mallco()和free()完成内存的配置及释放考虑“小型区块”造成的内存破碎问题:SGI设计了双层级配置器双层级配置器:当索取的内存块>128bytes时,移交第一级配置器,当<128bytes时,则以内存池(memory pool)管理:SGI第二级

2021-02-07 11:43:12 276

原创 C++和C关于BSS段的区别

当编译器遇到如下定义:Point global;观念上Point的 trivial construction 和 destruction 都会被产生和调用,事实上,这些 trival members 要么没被产生,要么没被调用。在C中,global被视为一个“临时性的定义”,因为他没有显示化的初始化操作,一个“临时性的定义”可以在程序中发生多次,那些实例会被链接器折叠起来,只留下一个单独的实例,放在程序 data segment 中的BSS段;C++并不支持“临时性的定义”,这是因为class构造行为

2021-01-29 17:34:09 171

原创 存储器层次结构

随机访问存储器随机存储器(Random-Access-Memory)分为两类:静态的SRAM(高速缓存存储器)和动态的DRAM(作为主存,内存条)SRAM:将每个为位存储在一个 双稳态 的存储器单元里,只要有电,它就会永久地保存它的值,即使有干扰,在干扰消失时,电路就会恢复到稳定值。DRAM:将每个位存储为对一个电容的充电,对干扰非常敏感,一旦遭到干扰,他就不会恢复了。有跟多原因会导致漏电,内存系统必须周期性地通过读出,然后重新写来刷新内存的每一位。有些系统也使用纠错码。区别:只要..

2020-11-18 19:18:28 79

转载 [LeetCode]134. 加油站

LeetCode134. 加油站分享一个独特的解法,来自leetcode解题区:使用图的思想分析该问题思想该题可以使用图的思想来分析,时间复杂度 O(N),空间复杂度 O(1)。以该题为例:gas = [1,2,3,4,5]cost = [3,4,5,1,2]下图的黑色折线图即总油量剩余值,若要满足题目的要求:跑完全程再回到起点,总油量剩余值的任意部分都需要在X轴以上,且跑到终点时:总剩余汽油量 >= 0。为了让黑色折线图任意部分都在 X 轴以上,我们需要向上移动黑色折线图,直到所有

2020-11-18 10:54:33 67

原创 C++单调栈使用总结

前几天在LeedCode刷了一类关于寻找“下一个更大元素”的题目,发现题解中使用单调栈的妙处,现做个小总结

2020-11-01 16:32:05 324

原创 C/C++语言的程序编译过程

现有一个C程序,当我们用Unix命令行编译这些代码时,GCC(GNU Compiler Collection,GNU编译器套件)编译器会将源代码转换为可执行文件,过程如下:1. 预处理:C预处理器扩展代码,插入所有用#include命令指定的代码,并扩展所有用#define声明指定的宏;2. 编译:编译器产生源文件的汇编代码(机器代码的文本表示,给出程序中的每一条指令,人可读);3. 汇编:汇编器会将汇编代码转化生成二进制目标代码文件(机器代码的另一种形式,包含所有二进制表示);4. 链接:链接器将

2020-10-18 17:25:49 178

原创 LeetCode-32. 最长有效括号

一说到括号匹配,就应该联想到使用栈,题目的关键字为:“最长”和“连续”,所以思路是从这两点下手:先在不连续的地方打上断点;然后计算各段连续区间的长度;最后求出最大值。代码如下:int longestValidParentheses(string s){ stack<int> skt; //栈里存的是字符串括号的下标 vector<int> flag(s.size(), 0); //标记位:1为断点,0为正常的括号匹配 f

2020-10-13 16:37:03 52

原创 C++最长子序列

LeedCode-300. 最长上升子序列,方法一:O(n^2)可能会超时;方法二:贪心二分法,使用lower_bound();

2020-10-08 12:40:36 1145 1

原创 C++ swap函数的实现

C++中的swap函数使用move移动语义实现交换,节省了临时拷贝的开销

2020-10-06 15:47:28 1480

原创 C++通过遍历构建二叉树

相关题目LeetCode889 根据前序和后序遍历构造二叉树LeetCode106 从中序与后序遍历序列构造二叉树LeetCode105 从前序与中序遍历序列构造二叉树105、106核心思想:通过前序(后序)遍历和中序遍历构造二叉树首先通过前序和后序能找出根节点用根节点分割中序遍历的数组,前部分为左子树,后部分为右子树注意递归的中止条件和后序遍历的分割点[1] 从中序与后序遍历序列构造二叉树 TreeNode* DFS(vector<int>& inorder

2020-10-06 13:29:38 94

原创 C++二叉树的最近公共祖先(leetcode-236)

递归思路首先判断当前节点是否命中(if(rootp || rootq)),命中则返回;否则在当前节点的左右子树查找,然后比较左右子树的返回值;如果两个返回值均不为空,说明p和q分别在左右子树,则输出为当前节点如果只有其中一个为空,分两种情况:q(p)的子节点包含p(q);或者公共祖先在当前节点的子节点上;struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : v

2020-10-06 09:26:27 254

原创 C++快速排序

C++快速排序//快速排序void Partition(vector<int> &data, int left, int right){ if (right <= left) return; int target = data[left]; int start = left; int end = right; while (end > start) { //先从大端找起 while (end > start && data

2020-10-05 20:57:10 85

原创 二叉树的遍历(非递归)

二叉树的前序遍历(非递归)

2020-10-05 20:35:05 97 1

空空如也

空空如也

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

TA关注的人

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