- 博客(59)
- 收藏
- 关注
原创 序列化结构(protobuf)实现一个TCP服务器(C++)
1、首先建立proto文件,syntax如果不标明proto3,则会默认使用proto2版本,在后面的使用过程中需要加上包名,以防止命名空间冲突,消息体中的序号表明在序列化数据中该变量出现的顺序。当服务端两次使用同一个端口号,会出现Error on binding,这是同一时间在同一端口上启动两个TCP服务器,第二个服务器会收到端口已被占用的错误,并且无法绑定到该端口上。2、编写服务端,编辑 g++ -o server server.cpp message.pb.cc -lprotobuf。
2024-04-08 20:52:15
749
原创 Ubuntu上安装Nginx
7、将Nginx的安装路径写道Linux的环境变量中,8、到Nginx的安装路径下,启动Nginx,2、解压Nginx的压缩文件,,prefix为安装的路径。10、关闭Nginx,1、下载Nginx,
2023-11-18 18:58:01
814
原创 C++文件的读取和写入
3、c++对txt文件的写文件,追加到目前文件的最后,ios::app。4、c++读取二进制文件,ios::in|ios::binary。5、c++写二进制文件,ios::out|ios::binary。2、c++对txt文件的写文件,ios::out。1、C++对txt文件的读,ios::in。
2023-11-09 14:44:11
899
原创 Linux中PATH的一些常见错误
2、命令 ‘protoc’ 可在 ‘/usr/local/bin/protoc’ 处找到,由于/usr/local/bin 不在PATH 环境变量中,故无法找到该命令。1、命令 ‘uname’ 可在 ‘/bin/uname’ 处找到,由于/bin 不在PATH 环境变量中,故无法找到该命令。命令 ‘ls’ 可在 ‘/bin/uname’ 处找到,由于/bin 不在PATH 环境变量中,故无法找到该命令。解决方案:在Terminal下: export PATH=“$PATH:/usr/local/bin”
2023-11-09 12:45:41
464
原创 计算机网络基础知识1
有客户端首先发起,第一次挥手客户端发送一个报文,在报文里面将FIN=1,根据之前发送报文生成的序列号这里将seq=x,当服务端收到这个报文后就知道了客户端想断开连接,但是此事服务端可能在发送数据导致不能立刻断开连接,服务端需要继续发送数据,服务端只进行一次消息queren(第二次挥手)报文内容ACK=1,ack=x+1,即告诉客户端我知道你要和我断开连接,但我没做好准备,你需要等我消息。服务端没有消息发送时,给客户端发送一个报文(第三次挥手),报文内容:seq=y,FIN=1。例如:RSA、DSA。
2023-11-07 22:56:03
308
原创 操作系统基础知识1
select实现多路复用的方式是,将已连接的socket都放在一个文件描述符集合中,然后调用select函数将文件描述符集合拷贝到内核里,让内核来检查是否由网络事件的发生,遍历所有的文件描述符,检查到有事件产生后,将socket标记为可读或可写,然后把文件描述符拷贝到用户态,用户态还需要遍历找到可读或可写的socket,再进行处理。线程的切换者是操作系统,切换时机是根据操作系统自己定义的切换策略来决定的,用户是无感的,线程的切换内容包括内核栈和硬件上下文。时间片太短会导致过多的上下文切换,降低CPU效率;
2023-11-07 18:19:40
208
原创 C++基础知识4
resize(n)如果n大于vector的size,新元素会被添加到vector的末尾,如果n小于size,则末尾的元素会被删除,改变的是vector的size;reserve(),改变的是vector的capacity,不改变vector的大小,只是预先分配主够的内存,主要是为了内存优化,避免添加元素时导致的进行频繁的内存分配。d、成员函数有一个特殊的指针this,它指向调用该成员函数的对象,普通函数没有这个指针。a、普通函数是在类的外部定义的,成员函数是在类的内部定义的;1、普通函数和成员函数的区别?
2023-11-07 15:33:09
124
原创 ubuntu18.04上安装protubuf3.19.4
d、输入 :wq 命令,保存并退出文件。如果需要仅保存文件而不退出 Vim,可以输入 :w 命令。8、查看ubuntu的版本:lsb_release -a,cat /etc/issue。a、在 Vim 编辑器中,移动光标到文件的末尾或你想插入内容的位置。b、按下 i 键进入插入模式,并输入你想添加的新内容。c、按下 Esc 键退出插入模式。9、查看内核版本:uname -r。7、执行main.cpp代码。test.pb.ccd代码。6、执行protobuf。test.proc代码。test.pb.c代码。
2023-11-05 17:47:20
1304
原创 ubuntu卸载protobuf
2、查找protobuf的位置:which protoc,我的电脑上是/usr/local/bin/protoc。4、sudo rm -rf /usr/local/include/google //头文件。5、sudo rm -rf /usr/local/lib/libproto* //库文件。3、执行sudo rm /usr/local/bin/protoc //可执行文件。1、先查看protobuf的版本:protoc --version。
2023-11-05 14:06:57
1529
原创 C++基础知识3
(2)、重写指得是垂直区域,例如父子类,父类将函数定义为虚函数,子类重新定义函数体,父子类的函数名、参数列表是同样的。(2)、栈的内存地址是从高到低扩展的,内存区域是连续的,大小有限;(1)、重载指得是同一 水平区域内,例如类内有多个同名函数,这些函数的参数列表不同,重载是在编译时绑定对象的,是静态多态。(1)、公有继承,派生类对象可以访问基类中的公有成员,派生类的成员函数可以访问基类中的共有和受保护成员;(1)、static成员的名字是在类的作用域中,因此可以避免与其他类的成员或全局对象名字冲突;
2023-10-09 15:57:52
153
原创 C++基础知识2
如果两个shared_ptr相互引用,那么这两个指针的引用计数永远不可能下降为0,资源永远不会释放,它是对对象的一种弱引用,不会增加对象的引用计数,和shared_ptr之间可以互相转化,shared_ptr可以直接赋值给它,它可以通过调用lock函数来获得shared_ptr。(1)、static修饰局部变量,局部变量就是在函数体内定义的变量,普通的局部变量,生存周期随着函数的结束而结束,每次函数重新执行时,局部变量都是重新赋值,不会保留新的值。(2)、智能指针能有效解决野指针、悬挂指针和内存泄漏问题。
2023-10-08 20:40:50
131
原创 C++基础知识1
(2)、malloc在申请内存时需要指定分配内存的字节数,而且不会做初始化,申请成功后返回的是一个void*,需要手动转换数据类型,new在申请内存时不需要指定内存的大小,而且有默认的初始化,申请成功后返回的是一个对象类型;(5)、在默认情况下,为方便对结构体内元素的访问和管理,当结构体内元素长度小于处理器位数的时候,便以结构体内最长的数据元素的长度为对齐单位,即为其整数倍。(1)、指针定义时可以不初始化,而引用在定义时就必须初始化,和一个对象绑定,只要引用存在,就会一直保持和该对象的绑定;
2023-10-07 20:07:18
237
原创 最长回文子串(动态规划) 力扣 c++
思路:我们枚举出字符串的所有子串,并判断这个子串是否是回文串,dp[i][j]记录下标为i和下标为j的字串是都是回文字子串。当回文串的长度为1时,它就是回文子串dp[i][j]=true,i==j,当回文串的长度为2时,dp[i][j]=(s[i]==s[j]);解法2:用扩展方法,由中心点向两边扩展。时间复杂度O(n^2),空间复杂度O(1)。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。给你一个字符串 s,找到 s 中最长的回文子串。解法1:动态规划,时间复杂度O(n^2)
2023-06-29 15:16:49
660
原创 动态规划(路径问题) 力扣 c++
思路:是求左上角和右下角之间的最小和,且每次只能向下或者向右移动一步,不存在走过重复位置,我们用一个二维数组记录走到当前位置的路径和,我们先初始化第一列和第一行的数据,然后dp[i][j]的与dp[i-1][j]、dp[i][j-1]和grid[i][j]有关,求的是最小路径和,所以dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j];思路:转换成一个二维数组,当前位置dp[i][j]得路径和之和与dp[i-1][j]、dp[i-1][j-1]有关。
2023-06-28 15:10:30
663
原创 动态规划(子序列问题) 力扣 c++
我们初始化一个二维数组dp来记录最长公共子序列的长度,遍历两个字符串的字符,比较是否相等,如果相等最长公共子序列的长度等于它们前一个位置的最长子序列的长度+1,如果不相等则最长公共子序列的长度等于两个位置分别减去当前字符串的最长公共子序列的较大值。当前位置dp[i][j]的值只与dp[i-1][j-1]、dp[i-1][j]、dp[i][j-1]三个位置的值有关系,最后返回dp[text1.size()][text2.size()]。解释:最长递增子序列是 [2,3,7,101],因此长度为 4。
2023-06-27 15:33:31
288
原创 918. 环形子数组的最大和 力扣 c++
我们将环形问题分为两种情况,最大子数组的在[0,n-1]下表内,这就转化为求数组的最大子数组的和;第二种情况就是最大子数组牵扯到还的问题,我们可以求出[1,n-2]中间存在子数组最小值,我们用数组的和-这个最小值就得到了结果。形式上, nums[i] 的下一个元素是 nums[(i + 1) % n] , nums[i] 的前一个元素是 nums[(i - 1 + n) % n]。这里我有个疑问,为什么求[1,n-2]内的子数组最小值时,dp[0]=0或者dp=nums[0]都不影响答案中的准确性。
2023-06-24 10:14:22
217
原创 69.x 的平方根 力扣 c++
我们任取一个x0作为初始值,在每一次的迭代中,我们找到函数图像上的点(xi,f(xi)),过这点我们可以画出一个切线,斜率为f(xi)',与横轴的交点记位xi+1,xi+1比xi更接近零点。注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5。我们用C表示是待求出平方根的那个整数,C的平方根就是函数y=f(x)=x^2-C的零点。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去。令y=0,可以得出xi+1=0.5*(xi+C/xi)
2023-06-22 16:19:46
117
原创 回文数 力扣 c++
解法二:对数字进行翻转,将反转后的数字与原始数字进行比较,如果相同,则这个数字是回文数,为了避免计算多余,我们可以只反转数字的一半,比较前后是否相同,如果数字的长度是奇数位,我们可以直接忽略中间的哪一位,他不影响最终结果的判断。给你一个整数 x ,如果 x 是一个回文整数,返回 true;解法一:将数字转化为字符串,然后使用reverse函数进行字符串的反转,来判断是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
2023-06-22 16:05:48
133
原创 295. 数据流的中位数 力扣 c++
为什么我用一个vector存储数据流,每次插入新元素时,插入到该在的位置,使插入后数组仍保持有序,为什么运行时会超时呢?double findMedian() 返回到目前为止所有元素的中位数。中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。void addNum(int num) 将数据流中的整数 num 添加到数据结构中。例如 arr = [2,3] 的中位数是 (2 + 3) / 2 = 2.5。例如 arr = [2,3,4] 的中位数是 3。
2023-06-19 21:44:51
90
原创 4. 寻找两个正序数组的中位数 力扣 c++
维护两个指针,初始时分别指向两个数组的下标0的位置,每次将指向较小值的指针后移一位,如果一个指针已经到达数组尾部,只需要移动另一个数组的指针,直到到达中位数的位置。如果A[k/2-1]>B[k/2-1],则比A[k/2-1]要小的树最多包括A[0]-A[k/2-2],B也是同理,则比A[k/2-1]小的最多只有k-2个数,我们将删除B[k/2-1]自身及之前的数;如果A[k/2-1]<B[k/2-1],我们删除A[0]到A[k/2-1];对于数组A、B我们比较A[k/2-1]和B[k/2-1]的值,
2023-06-15 21:18:56
152
原创 162. 寻找峰值 力扣 c++
解释:利用二分查找,{nums[mid-1],nums[mid],nums[mid+1]},如果nums[mid]>mid[mid+1],则可以将查找区间更新为[l,mid];如果num[mid]<nums[mid+1],差找区间鹰更新为[mid+1,r]给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。你可以假设 nums[-1] = nums[n] = -∞。峰值元素是指其值严格大于左右相邻值的元素。
2023-06-14 13:02:49
132
原创 148. 排序链表 力扣 c++
解释:利用分治的思想,使用快慢指针找到链表中间位置,并递归地对左半部分和右半部分进行排序,最后调用 merge 函数将排序后的左半部分和右半部分合并。merge合并函数时也能利用递归实现,也可以用遍历。递归合并时代码更容易理解。给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表。输入:head = [4,2,1,3]输出:[1,2,3,4]
2023-06-11 15:03:38
87
原创 79. 单词搜索 力扣 c++
输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCB”输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “SEE”
2023-06-10 12:55:16
79
原创 深度优先搜索和回溯算法的异同
回溯算法是一种特殊的 DFS,它通过尝试不同的选择来寻找所有的解。DFS 是通过递归或者栈实现的,每次深入到下一层时,都会将该层的结点存放到栈中,在处理完当前节点后,再从栈中取出上一层的结点继续遍历。回溯算法则是深度优先搜索的一种特殊情况,它通过枚举所有可能的解来寻找最终的答案。DFS 的目标是遍历整个图或者树,寻找特定的解,而且结点的访问只考虑了节点的深度(遍历的顺序是根据深度来进行的)。DFS 主要应用于图、树等数据结构的遍历操作,以及基于搜索的算法中(如 A* 搜索、BFS 等)。
2023-06-09 12:07:54
1134
原创 组合问题 力扣 c++
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。77.组合给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。你可以按 任何顺序 返回答案。
2023-06-08 16:47:54
101
原创 212. 单词搜索 II 力扣 c++
在 dfs 中,程序首先判断当前字符是否是 ‘#’ 或者 Trie 树中不存在以该字符为前缀的单词,如果是则立即返回。如果 Trie 树中存在以该前缀为结尾的单词,则将该单词加入到结果集合中,并将 Trie 树中对应的标记 isEnd 置为 false。然后按行遍历二维字符数组,对每个位置进行深度优先搜索,直到 Trie 树中存在一个对应的单词前缀,或者无法在 Trie 树中继续搜索。如果存在对应的单词前缀,则继续在四个方向上继续搜索,并将搜到的单词保存在结果向量中。定义了一个 TrieNode 结构体。
2023-06-07 16:23:41
127
原创 133. 克隆图 力扣
我们可以用一个map来建立新老节点之间的映射关系,因为图是联通的,我们访问图中的一个节点就可以遍历到所有的节点,我们在深度遍历时使用hashmap来建林新老节点的映射关系,然后访问老节点的林杰表,将边关系复制给新节点,组后返回的是node节点的键值。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。
2023-05-28 14:42:49
122
原创 98. 验证二叉搜索树 力扣
根据二叉搜索树的性质,我们可以指导根节点的值大于左子树所有节点的值,且根节点的值小于右子树上所有子树的值,这个原则适用于该节点的左右子树,我们可以使用递归遍历整棵二叉树。使用中序遍历,将遍历后的数据放到一个数组中,根据搜索二叉树的性质判断这个数组是不是有序的。给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。所有左子树和右子树自身必须也是二叉搜索树。节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。
2023-05-27 16:57:57
74
原创 129. 求根节点到叶节点数字之和 力扣
给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123。计算从根节点到叶节点生成的 所有数字之和。叶节点 是指没有子节点的节点。
2023-05-23 16:31:07
86
原创 106. 从中序与后序遍历序列构造二叉树 力扣
在中序遍历中对根节点进行定位时,一种简单的方法是直接扫描整个中序遍历的结果并找出根节点,但这样做的时间复杂度较高。对于哈希映射中的每个键值对,键表示一个元素(节点的值),值表示其在中序遍历中的出现位置。在构造二叉树的过程之前,我们可以对中序遍历的列表进行一遍扫描,就可以构造出这个哈希映射。给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树。这道题与力扣105题很相似。
2023-05-22 16:23:04
70
转载 105. 从前序与中序遍历序列构造二叉树 力扣
在中序遍历中对根节点进行定位时,一种简单的方法是直接扫描整个中序遍历的结果并找出根节点,但这样做的时间复杂度较高。我们可以考虑使用哈希表来帮助我们快速地定位根节点。链接:https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/solutions/255811/cong-qian-xu-yu-zhong-xu-bian-li-xu-lie-gou-zao-9/来源:力扣(LeetCode)
2023-05-22 16:18:52
61
原创 力扣-多数元素 C++
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。方法1:设置一个flag来表示每个元素的出现次数,若flag>len/2,则返回给元素。方法二:先给数组排序,元素若为多数元素,则数组中间一定是多数元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
2023-05-05 11:28:54
172
空空如也
tesseract文字识别遇到的问题
2023-12-18
protobuf编译错误
2023-11-03
将有序数组转换为二叉搜索树
2023-06-11
yolo用hook取中间特征
2022-12-24
MMdetection配置文件中的参数的求解
2022-11-18
深度学习:目标价测mAP计算
2022-11-17
函数定义也是原型怎么理解呢
2022-09-04
TA创建的收藏夹 TA关注的收藏夹
TA关注的人