- 博客(31)
- 资源 (1)
- 问答 (1)
- 收藏
- 关注
原创 《编译原理及实现》附录B(词法分析器)与附录C(语法分析器)完整代码
目录声明代码VS2019工程链接:声明本代码由于是本人边看书边实现(纯手工!写完之后Debug了一万年5555)的,难免会有错漏,测试案例也不够全,如果由错漏的地方,请及时及时告诉我,代码有大量我写的注释,方便各位理解源码,注意:本代码跟书上有部分地方不同,不同的地方是我魔改(增加)了一些语法,有些小伙伴如果是为了完成作业(♂)的话我建议直接从本文章最后的网盘连接获取本源码的工程文件,IDE版本是(VS2019),可以直接运行。或者CV下面的代码,也可以运行!CV工程师们请注意:下面是输入输出文件
2021-11-20 23:42:04 1933
原创 一步步带你观察vector.push_back()具体拷贝机制,超级详细哦
观察vector.push_back()具体拷贝机制实验需要条件:1.vector容器 2.创建一个能通过拷贝控制函数打印相关信息的类,这里我自己写了一个简易的String类来打印信息实验代码: vector<String> vec; String s = "1"; cout << "--------第一个放入容器-------" << endl; vec.push_back(s); cout << "--------第二个元素放入容器----
2021-11-16 10:49:04 8138 5
原创 小白友好——C++基于EeayX简单开发的豪华版贪吃蛇[单人模式+双蛇对战+闯关模式(地图跳转)+排行榜+音乐]
目录注意:该项目源码开源,在本文章最底下链接处获取,源码中附有大量注释。游戏展示单人模式斗蛇模式闯关模式由于该游戏是有点难度的(作者无法到达后续地图),所以本文章只展现四张游戏地图,后面还有四张地图,感兴趣的小伙伴可以试试通关哦!项目代码解析一、整体框架结构二、界面代码解析1.主程序2.主菜单主菜单背景绘制状态码设置音乐播放按钮设置获取鼠标信息鼠标移动信息:鼠标左键信息注意事项:排行榜、帮助、设置、选择游戏界面:退出按钮:游戏结束页面:闯关模式界面和闯关模式里的详细信息界面、界面设置也都与前面设计一样三、游
2021-10-06 19:02:32 1090
原创 Linux端C++聊天室思路详细图解
目录聊天室的组成:客户端+服务器端客户端具体功能:服务器端具体功能:客户端实现思路:服务端实现思路:客户端功能图解:pipefd(管道)具体数据传输图解:服务器端图解:监听文件描述符获取连接图解:向连接文件描述符传输数据图解客户端代码:服务器端代码聊天室的组成:客户端+服务器端客户端具体功能:1.从标准输入终端读入用户数据,并将用户数据发送至服务器2.往标准输出终端打印服务器发送给它的数据服务器端具体功能:1.接受客户数据2.将客户数据发送给每一个登录到该服务器上的客户端(发送方除外)客户端
2021-09-23 17:34:02 719
原创 操作文件操作符的工作模式:LT(电平触发)&ET(边缘触发)实验对比
什么是LT和ET?LT(Level Trigger)模式:LT模式是默认的一个工作模式,在这种模式下epoll相当与一个效率较高的poll。当epoll_wait检测到有事件发生时,并将此事件通知给应用程序去处理,此时应用程序可以选择不处理该事件,而未被处理完全的事件epoll_wait会重复通告应用程序,直至应用程序被处理。ET(Edge Trigger)模式:ET模式则是epoll的高效工作模式,在此模式下,ET模式则和LT模式相反,epoll_wait检测到有事件发生时,并将此事件通知给应用程
2021-09-22 16:10:04 264
原创 lua loader error : attempt to index a boolean value (local ‘xxx‘)
学习lua的过程是漫长且艰难的,在使用skynet框架封装service的过程中遇到这个问题,因此记录下来,给各位也遇到同样问题的小伙伴一个启发。原因:编写lua模块时,要返回return!
2023-04-02 17:23:33 540 1
原创 Epoll学习笔记
对``Select``、``Poll``、``Epoll``、``Kqueue``几种I/O多路复用做测试(限制100个活动连接,并且每一个连接会有1000次写入)
2023-02-13 19:37:38 156
原创 LeetCode440.字典序的第K小数字
思路将字典序抽象成字典树(核心思想)#mermaid-svg-CdnB3EIgKZUEG9OI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CdnB3EIgKZUEG9OI .error-icon{fill:#552222;}#mermaid-svg-CdnB3EIgKZUEG9OI .error-text{fill:#552222;stroke:#552222
2022-03-23 20:01:07 598
原创 LeetCode 688.骑士在棋盘上的概率
解题思路本题是一道经典动态规划题设计状态:当前步长为step,当前坐标为x,y,值为当前留在棋盘上的概率写出状态转移方程dp[step][x][y]+=18∗∑i=08dp[step−1][x+dir[i][0]][y+d[i][1]]dp[step][x][y]+=\frac{1}{8}\ast\sum_{i=0}^8 dp[step-1][x+dir[i][0]][y+d[i][1]]dp[step][x][y]+=81∗i=0∑8dp[step−1][x+dir[i][0]][y+
2022-02-17 16:00:21 188
原创 生成http响应数据【Linux服务器编程】
前言非常感谢社长的开源项目TinyWebServer,让我这个自学服务器编程的小白也能感觉受益匪浅所需前置知识va_list 解决变参问题 头文件:<stdarg.h> 重点!在本项目中实现了代码复用,减少代码量http响应报文格式基础makefile知识数据结构http状态码//本次仅用到个别状态,可根据需求更改代码enum HTTP_CODE { NO_REQUEST = 0,//http解析用到 GET_REQUEST,//http解析用到 B
2021-12-31 18:00:59 183
原创 vscode+gdb远程调试配置
launch.json{ // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "(gdb) 启动", //会显示在debug界面的debug名称
2021-12-29 14:42:30 604
原创 gcc基础
gcc工作流程预编译 ->编译->汇编->链接流程介绍预编译阶段操作展开头文件替换宏消除注释结果:生成.i结尾的预处理文件编译阶段操作源代码翻译成汇编代码结果:生成.s结尾的汇编文件汇编阶段操作将汇编文件翻译为二进制文件结果:生成.c结尾的二进制文件链接阶段操作将多个二进制文件连接起来结果:生成可执行的二进制文件gcc工作流程动图展示...
2021-12-27 20:04:07 816
转载 linux下gdb调试基础
生成带有调试信息的可执行文件参数作用-g(必须添加)生成调试信息-O(选填)关闭编译器优化选项-Wall(选填)打开所有warming,可以尽量避免不必要的bug生成带有调试信息的xxx可执行文件gcc xxx.c -g -o xxx//如果为cpp文件则将命令改为g++即可启动gdb打开gdb调试gdb xxx //此时只是打开了gdb调试,并没有真正开始执行启动gdb后的可选命令命令作用s(start)从程序的开头调试
2021-12-27 17:06:15 265
原创 C++Primer第十五章Query的实现
笔记重点在于理解Query_base的继承体系,派生类有WordQuery,NotQuery,AndQuery,OrQuery。并且创建一个Query类来作为Query_base的接口类,通过Query类对外界隐藏Query_base继承体系,更加方便的管理Query_base派生类直接的转换C++Prime习题集解答书中的实现方式是用Query类封装了Query_base指针,管理实际查询处理用到的不同Query类型对象.如果不使用Query类,则设计使用Query的地方,都要改为Query_bas
2021-11-22 19:10:42 1430
原创 C++Primer第十五章15.5学习笔记(练习15.21组成图形基元的继承体系)
由于继承体系极其简单,这边就不解释了,有错误或者不好的地方希望在评论区指出头文件#pragma once#ifndef GRAPHIC_H#define GRAPHIC_H#include<string>#include<iostream>#include<math.h>using std::string;using std::cout;using std::endl;#define PI acos(-1);//3.1415926//图形基类cl
2021-11-18 09:34:55 472
原创 C++Primer第十五章15.3学习笔记
C++Primer第十五章15.3学习笔记知识点1: OOP的核心思想:多态性(多种形式),而C++语言支持多态性的本质是因为指针/引用的动态类型与静态类型分离知识点2: 编译器根据类的指针/引用的静态类型来判断转换是否合法知识点3: 派生类向基类的转换可能会由于访问受限而变得不可行知识点4 使用override确保虚函数的正确覆盖从基类继承下来的虚函数知识点5 当派生类虚函数需要调用他的基类版本,那么一定要使用作用域运算符,不然会导致无限递归...
2021-11-16 16:50:53 190
原创 C++Primer第十三章13.5(编写StrVec类+简易的string类+[进阶]vec模板类)
C++Primer第十三章 动态内存管理习题编写自己版本的StrVec#pragma once#ifndef STRVEC_H#define STRVEC_H#include<string>#include<memory>#include<utility>#include<initializer_list>#include<algorithm>using std::string;using std::allocator;us
2021-11-11 21:10:35 490
原创 浅谈进程池(半同步/半异步实现)——Linux高性能服务器学习笔记
目录什么是进程池?为什么要使用进程池?如何实现进程池?问题1:客户任务是否具有上下文关系问题2:进程池里子进程这么多,应该通知哪一个子进程?问题3:选好子进程后,主进程如何将客户"交付"给子进程?什么是进程池?线程池就是服务器预先创建好的一组子进程,并且子进程的数量是由人为规定的(和CPU数量差不多最好,数量太多或太少甚至对性能提升没有实质性的帮助)为什么要使用进程池?为了实现高效的并发模式,我们使用多进程实现多进程的方法:动态创建进程/进程池动态创建进程的缺点:1.动态创建耗时2.切换耗
2021-10-12 20:17:23 279
原创 C++ Reference(引用)特点
目录Reference(引用)特点从内存分析为什么喜欢用Referencceconst reference&non—const reference(常量引用与非常量引用的比较)代码运行图示总结注意事项Reference(引用)特点Reference一般不用在变量的声明上,通常在参数传递时使用Reference(Pass by reference or Return by reference),原因:传入传出时速度更快~本质是pointer(指针),引用的内部实现是通过指针实现的,编译器
2021-09-28 19:47:32 225
原创 LeetCode 70.爬楼梯
常规解法:动态规划dp[n]表示楼梯阶数为n时有多少种上楼方案状态转移方程dp[n]=dp[n-1]+dp[n-2]边界条件:dp[1]=1 dp[2]=2矩阵快速幂利用矩阵推导出递推关系,即构造出一个矩阵的n次方乘一个列向量得到一个列向量,此时就可以通过矩阵的n次幂来得到目标列向量(该列向量包含所要求的f(n))递推式子:f(n)=f(n−1)+f(n−2) f(n) = f(n-1) + f(n-2) f(n)=f(n−1)+f(n−2)利用矩阵构造递推关系:[1110]∗[f(n)f
2021-09-25 22:01:30 63
原创 字符串匹配(KMP算法实现)
字符串匹配使用KMP的原因因为其能在「非完全匹配」的过程中提取到有效信息进行复用,以减少「重复匹配」的消耗。在时间复杂度O(m+n)内查找到匹配串,不适用KMP的情况下的时间复杂度是O(m*n)KMP算法流程根据匹配串构造next数组,这个很关键,next数组就是KMP算法的核心,next数组存储的是到匹配串到i下标为止的子串的前后缀相同的个数(关于如何构造next数组,这里就不详细解答了)匹配子串时通过next数组提供的信息来减枝,从而达到缩短时间复杂度的目的代码演示int strS
2021-09-22 08:51:07 58
原创 对象模型-虚指针虚表
ObjectModelvptr(虚指针)&&vtable(虚表)「虚机制」对象模型在底层内存的分析先上代码:class a{public: virtual void virtual_func1(); //虚函数 virtual void virtual_func2(); //虚函数 void func1(); void func2(); private: int m-data1,m-data2;}class b:public a{
2021-09-18 23:59:41 117
原创 LeetCode 131.分割回文串
分割回文串LeetCode 131 分割回文串 131解题关键: 搜索+判断是否为子串是否为回文预处理子串是否为回文串核心代码:状态转移方程:g[i][j]=(s[i]==s[j])&&s[i+1][j-1]i、j指针指向的字符要一致并且(i,j)的子串(i+1,j-1)为回文串判断回文串完整代码: for(int i=n-1;i>=0;i--) for(int j=i+1;j<n;j++){ g[i][j]=(s[i]==
2021-09-18 17:47:28 43
原创 反转链表的多种写法(武器库了属于是)
指针结构体:struct ListNode{int val;int ListNode *next;ListNode():val(0),next(nullptr){} ListNode(int val):val(val){}ListNode(int val,ListNode* next):val(x),next(next){}};迭代法:分三种,分别为头插法,新建链表法,直接反转法头插法:(插入的节点为prev->next)ListNode* reverseList(Lis
2021-09-17 17:07:24 74
原创 QuickSort(快速排序)&&MergeSort(归并排序)的效率比较[搭配LeetCode例题]
QuickSort(快速排序)&&MergeSort(归并排序)的效率比较QuickSort代码void quickSort(vector<int>& nums,int left,int right){ if(left>=right) return; int r=rand()%(right-left+1)+left; int x=nums[r]; swap(nums[r],nums[right]); int
2021-09-16 14:23:33 355
原创 生产者-消费者线程模型学习
生产者消费者模型基本框架:也就是一个线程扮演生产者往资源池放入数据,另一个线程扮演消费者从资源池中取出数据(当资源池为空时不能取数据),因为资源池是共享的,所以需要互斥量保证当一个线程操作资源池时,另一个线程不能操作资源池,也就是生产和和消费者不能同时操作资源池涉及技术unique_lock+mutex+condition_variable代码实现:#include<iostream>#include<thread>#include<mutex>#incl
2021-09-15 12:05:06 901
原创 C++并发编程实战学习笔记
并发编程实战学习笔记用代码(互斥量mutex)保护共享数据常见错误切勿将受保护数据传递到互斥锁作用域之外切勿将受保护的数据以参数的形式传递到用户函数中去线程安全问题-拷贝构造异常(内存分配失败)传入一个引用通过引用来获取想要的值缺点:需要临时构造一个实例,从时间和资源的角度看不划算需要可赋值的存储类型,因为要通过给传入的引用赋值来获取数据,很多用户自定义的类型可能都不支持赋值操作无异常抛出的拷贝构造函数或移动构造函数返回指向数据的指针优势:自由拷贝,不会
2021-09-15 11:53:51 459
原创 LeetCode 413.等差数列划分
代码: int numberOfArithmeticSlices(vector<int>& nums) { int n=nums.size(); if(n<=2)return 0; vector<int> dp(n); for(int i=2;i<n;++i){ if(nums[i]-nums[i-1]==nums[i-1]-nums[i-2]){
2021-09-15 11:46:39 60
原创 Linux高性能服务器学习笔记——观察DNS通信过程
观察DNS通信过程DNS(域名系统),第一性原理:为了解决网上机器命名的一种系统。DNS作为将域名和IP地址互相映射的分布式数据库,能让人通过查询目标域名得到目标IP地址,从而更加容易的上网实验:使用tcpdump观察DNS通信过程想要使用DNS(域名系统),那就必须知道DNS的IP地址,可以在.\etc\resolv.conf中查询操作系统预留的DNS服务器IP地址查询DNS服务器IP地址图示:发送一个DNS请求,-t代表请求类型, A代表请求目标域名的IP地址,完整代码:host -t A
2021-09-13 16:21:29 105
C++为一个基类编写拷贝赋值运算符出现"!="无法与操作数匹配的问题
2021-11-18
TA创建的收藏夹 TA关注的收藏夹
TA关注的人