自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 [linux复习]——多线程

在一个程序里的一个执行路线就叫线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部执行,本质是在进程地址空间内运行在linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。

2025-04-06 19:11:56 993

原创 [linux复习]——进程信号

你在网上买了很多件商品,在等待不同商品快递的到来。但即使快递没有到来,你也知道快递来临时,你该怎么处理快递,也就是你能“识别快递”当快递员到你的,你也收到快递到来的通知,但是你正在打游戏,需要五分钟之后才能去拿快递。那么在这五分钟内,你并没有下去拿快递,但是你知道有快递到来了。也就是取快递的行为并不是一定要立即执行,可以理解为“在合适的时候去取”。在收到通知,再到你拿到快递期间,是有一个时间窗口的,在这段时间,你并没有拿到快递,但是你知道有一个快递已经到来。本质上可以理解为“你记住了有一个快递要去取”

2025-04-05 16:10:41 720

原创 Qt常用控件第一部分

Widget 是 Qt 中的核⼼概念. 英⽂原义是 "⼩部件", 我们此处也把它翻译为 "控件" .控件是构成⼀个图形化界⾯的基本要素.像上述⽰例中的, 按钮, 列表视图, 树形视图, 单⾏输⼊框, 多⾏输⼊框, 滚动条, 下拉框等, 都可以称为 "控件".

2025-04-02 20:27:41 924

原创 我为啥从机械专业转到后端

刚开始就是C语言,说实话刚刚开始接触编程语言真的很不舒服,我一度想放弃,但是我发现我如果放弃基本就是打螺丝的了(好笑吧,我还是重一本虽然是双非又尬住了),所以也是属于没有退路的一类人,那再难也要学下去,慢慢的也是将数据结构和算法、C++、linux、数据库、Qt学完了,完成了两个项目开始找实习,这里真的的要吐槽一下C++的菱形继承为啥不删了,还有linux为啥东西这么多,但是回过头来看我真的已经走了很远了。希望我可以找到一个实习,以后能有一个好的工作。

2025-04-01 21:43:32 282

原创 [C++复习——C++11新增语法第二节]——包装器、线程库、锁、原子库

在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。要使用标准库中的线程,必须包含< thread >头文件。注意:1.线程是操作系统中的一个概念,线程对象可以关联一个线程,用来控制线程以及获取线程的状态。2.当创建一个线程对象后,如果没有提供线程函数,该对象实际没有对应任何线程。

2025-03-31 18:48:25 687

原创 【linux复习】——进程间通信

数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变1.2 进程间通信的发展和分类管道->System V进程间通信->POSIX进程间通信管道分为:匿名管道pipe、命名管道。

2025-03-26 19:59:48 996

原创 [linux复习]——动静态库的概念和生成

动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。我们如果不想再使用动态库的时候不指名路径,那么我们可以修改环境变量或者将.so(动态库文件)拷贝到共享库路径下,一般指/usr/lib。使用外部库:系统中有很多库,如果我们想使用那么就需要在编译时使用 -l选项指明使用的是哪个库比如pthread库。):程序在编译链接的时候把库的代码链接到可执行文件中。

2025-03-26 17:48:37 391

原创 [C++复习]——C++IO流

在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?1. 使用itoa()函数2. 使用sprintf()函数但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。在C++中,可以使用类对象来避开此问题。在程序中如果想要使用stringstream,必须要包含头文件。在该头文件下,标准库三个类:istringstream、和。

2025-03-24 15:40:29 713

原创 【C++复习】——类型转换

在C语言中,如果C1. 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败2. 显式类型转化:需要用户自己处理缺陷:转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换。

2025-03-23 14:15:00 726

原创 MySQL事务

CURD(指数据的增删查改)不加控制,会有什么问题?当客户端A检查还有一张票时,将票卖掉,还没有执行更新数据库时,客户端B检查了票数,发现票数大于0,于是又卖了一次票。然后A将票数更新会数据库。这就导致了同一张票被卖了两次。由上面的例子我们就可以知道CURD需要满足的属性有:1.买票的过程是原子的2.买票相互之间不能印象3.买完票应该永久有效4.买前,和买后应该是确定的状态。

2025-03-22 20:28:27 728

原创 背包问题——动态规划的经典问题包括01背包问题和完全背包问题

通过这一过程我们发现其实dp[i][j]是等于max(dp[i-1][j],dp[i][j-v[i]]+w[i])的但是对于dp[i][j-v[i]]这个地方我们需要先判断有没有意义,才能进行后续的填值。我提供的第一个版本里的dp[i][j]选择第i个物品时有两种写法一种是循环一种是我的图片那种方式,但是都不会超时最后用数学的那种是因为美观。我们的第i个物品的体积,然后我们的dp[i][j]其实就和我们在前i-1个物品中选择容积为j-v[i]的最大价值加上我们的第i个物品的价值。初始化这里有视情况而定。

2025-03-21 20:32:42 574

原创 C++复习——实现AVL树,包含单旋转、双旋转,会通过递归来检测我们建的AVL树是否是合格的

这里使用struct是因为它在C++里默认的成员级别是public,_bf就是我们的平衡因子,对于每一个叶子结点他的_bf都是0因为他的左右子树都是空,一定是平衡的。T _data;int _bf;// 平衡因子顺手就把构造函数实现了,因为比较简单。public:AVLTree()// 左旋// 右转//插入//打印函数//求树的高度//判断树是否平衡//析构函数~AVLTree();

2025-03-20 15:32:51 889

原创 Linux复习——基础IO,认识文件描述符、软硬件链接

path:带路径的文件名称(待打开的文件)mode:r:以可读方式打开,不可写,文件不存在,则报错r+:以读写方式打开,文件不存在,则报错w:以可写方式打开,但是不能读。文件不存在,则创建。文件存在,则截断(清空文件内容)文件。w+:以读写方式打开。文件不存在,则创建。文件存在,则截断(清空文件内容)文件a:追加写,不能读。在文件末尾进行追加写,文件不存在则创建文件。文件存在,则在文件末尾开始写。

2025-03-19 20:41:45 783

原创 Qt带参数的信号和槽,以及信号与槽的连接方式

Qt5 在 Qt4 的基础上提⾼了信号与槽的灵活性,允许使⽤任意函数作为槽函数。但如果想⽅便的编写槽函数,⽐如在编写函数时连函数名都不想定义,则可以通过 Lambda表达式 来达到这个⽬的。Lambda表达式 是 C++11 增加的特性。C++11 中的 Lambda表达式 ⽤于定义并创建匿名的函数对象,以简化编程⼯作。说明:•由于使⽤引⽤⽅式捕获对象会有局部变量释放了⽽Lambda函数还没有被调⽤的情况。如果执⾏ Lambda函数,那么引⽤传递⽅式捕获进来的局部变量的值不可预知。

2025-03-19 16:16:34 1266

原创 MySQL索引特性——会涉及索引的底层B+树

索引:提高数据库的性能,索引是物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行正确的 create index,查询速度就可能提高成百上千倍。但是天下没有免费的午餐,查询速度的提高是以插入、更新、删除的速度为代价的,这些写操作,增加了大量的IO。所以它的价值,在于提高一个海量数据的检索速度。常见索引分为:主键索引(primary key),唯一索引(unique),普通索引(index),全文索引(fulltext)——解决中子文索引问题。

2025-03-16 16:25:36 1213

原创 Linux复习——进程概念

截止目前。我们所认识的计算机,都是一个个的硬件组件组成*输入单元:包括键盘、鼠标、扫描仪、写板等*中央处理器(CPU):含有运算器和控制器等*输出单元:显示器、打印机等关于冯诺依曼,必须强调几点*这里的存储器指的是内存*不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入输出设备)*外设要输入或者输出数据,也只能写入内存或者从内存中读取*一句话,所有设备都只能直接和内存打交道。

2025-03-15 14:18:36 830

原创 动态路径规划——01背包问题讲解和通过滚动数组优化

我们在填表的时候发现只用到了相邻的两行其实这里可以用滚动数组来优化,只需要一个dp[N]即可当我们填表时只需要在原表操作,但是我们的填表顺序变为了从右往左因为在填dp[i][j]时我们用到了dp[i-1][j]和dp[i-1][j-v[i]]显然dp[i-1][j-v[i]]位置在dp[i-1][j]前面所以如果从左往右填表会导致在填后一个位置的时候前面的位置的值已经被更新。2.1 当我们不拿时那么我们的dp[i][j]显然和dp[i-1][j]是相等的。3.2 当j为0时说明容积为0那么最大价值也是0。

2025-03-14 20:29:48 325

原创 Qt信号与槽

使用“emit”关键字发送信号。“emit”是一个空的宏。“emit”其实是可选的,没有什么含义,只是为了提醒开发人员示例1:1、在widget.h中声明自定义的信号与槽,如图所示;2.在“widget.cpp”中实现槽函数,并且关联信号和槽这里可以通过Alt+Enter快捷键为声明的函数添加定义还可以通过Shift+F2在函数的声明和定义之间快速切换。示例2:当老师说“上课了”,学生就“回到座位,开始学习”1.在源文件中新建两个类,一个是老师类,一个是学生类;

2025-03-13 16:20:01 914

原创 日志系统项目——准备工作了解类的设计模式如单例模式、工厂模式、代理模式

类的职责应该单⼀,⼀个⽅法只做⼀件事。职责划分清晰了,每次改动到最⼩单位的⽅法或 类。使⽤建议:两个完全不⼀样的功能不应该放⼀个类中,⼀个类中应该是⼀组相关性很⾼的函 数、数据的封装⽤例:⽹络聊天:⽹络通信 & 聊天,应该分割成为⽹络通信类 & 聊天类1.2 开闭原则对扩展开放,对修改封闭使⽤建议:对软件实体的改动,最好⽤扩展⽽⾮修改的⽅式。◦⽤例:超时卖货:商品价格---不是修改商品的原来价格,⽽是新增促销价格。1.3 里氏替换原则。

2025-03-12 17:06:03 1105

原创 双指针算法——配合例题讲解

这道题题的意思是遇到0将0后面的数向后移一位让后将0后空出来的位置填为0,这个题一开始我是想暴力的也是两个指针(up和down),但是还开了一个和arr一样大的vector,每次都让up向后走但终止条件时down越界,如果arr[up]是非零直接填到新开的表同时down++,如果arr[up] == 0就让down和down+1处的新开表的值为0然后down向后移两位。*快慢指针的实现方法有很多种,最常用的一种就是:在一次循环中,每次让慢的指针向后移动一位,而快的指针向后移动两位,实现一快一慢。

2025-03-09 21:03:15 358

原创 Qt项目文件解析与注意事项

工程新建之后,在工程目录列表中有一个后缀为".pro"文件,".pro"文件就是工程文件(project),它是qmake自动生成的用于生产makefile的配置文件。

2025-03-09 16:26:01 1465

原创 动态规划之回文字符串,从中等到困难

这个题目让我们找回文子串的个数,这里不要把子串和子序列的概念搞错1.首先我们先确定状态表示(不要问我怎么来的,大多和贪心一样是经验和感觉)如果我们用 一维的状态表示,可以记录以某一位置为结尾的回文串但是并不能确定这一回文串从哪里开始,这并不是我们希望的,所以我们采用二维的状态表示dp[i][j],它表示以i开始以j结尾的回文串。2.推导状态转移方程一. 对于dp[i][j]如果s[i] == s[j]那么在i+1 < j的情况下必然有dp[i][j] = dp[i+1][j-1];

2025-03-08 14:04:27 684

原创 MySQL复合查询——通过案例讲解每个指令

在开始之前可以先准备好相同的数据库方法一:直接在MySQL创建相应的数据库和表第一步:创建数据库并进入数据库第二步:创建部门信息表第三步:创建雇员信息表第四步:创建工资等级表第五步:插入数据方法二:通过数据库的备份完成第一步:在某个目录下创建soctt_data.sql文件并向其中写入以下内容第二步:打开数据库通过一下命令即可如果查到的表内容如下证明表的创建完成。

2025-03-06 16:50:09 1175

原创 STL源码剖析——空间配置器

所有的STL容器其实都有这个缺省模版,他就是我今天的重点空间配置器,但是很抽象的一点是我们一般说空间会想到内存、磁盘或者其他辅助存储介质但是SGI STL提供的配置器,配置的对象是内存,那为什么不叫内存配置器呢。STL中的的容器相信作为一位C++码农在坐的各位都是用的非常熟悉,非常爽了,但是其实我们其实在日常使用时并没有考虑,其最后一位模版参数见下面这段代码。2.空间配置器的标准接口。1.空间配置器的介绍。

2025-03-05 20:46:13 178

原创 【C++复习专题】——内存管理

这段代码涉及了C/C++中程序内存区域划分,如果可以清楚的知道每个变量和只读常量所在C/C++中程序内存区域的位置说明还是可以的。一般在函数内创建的变量都是在栈区的,如果是static变量不论在那创建都是在数据段(静态区),对于ptr1这样的用于指向动态开辟的内存空间的变量,他本身在出栈时会被释放,但是他所指向的空间并不会在出栈时被释放。说明:1.栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。

2025-03-04 20:05:42 613

原创 MySQL函数——包括日期、字符串、数学类函数

对日期函数的运用:1.创建一张表,记录生日2.创建一个留言表。

2025-03-03 18:48:06 262

原创 创建第一个Qt项目

打开Qt在菜单栏中选中“文件”---->"新建文件",或者使用快捷键:ctrl+n;或者直接点击new 在点击新建文件后会跳出如下对话框 新建对话框里有五类项目模版 常用的只有第一类Application,可以在右侧看到Qt应用程序开发的五个子模版 Qt Widgets Application:普通窗体模版,传统基于部件的窗体界面程序 Qt Console Application:Qt控制台应用程序。因为Qt主要用来开发图形化界面,所以这

2025-03-01 16:20:23 927

原创 MySQL基本查询——补充上一篇的遗落

实际上MySQL不对数据操作,所以DELETE更快,但是TRUNCATE在删除数据的时候,并不是经过真正的事物,所以无法回滚。建议:对未知表进行查询时,最好加一条LIMIT 1,避免因为表中数据过大,查询全表导致数据库卡死。案例:将所有的同学的语文成绩更新为原来的2倍(不加wher筛选就是对表中全部数据做修改)下面补充Update的内容,Update的作用是对查询的结果进行列值更新。下面补充Delete的内容,Delete的作用是删除数据。案例:删除表中的重复记录,重复的数据只能有一份。

2025-02-27 14:41:39 301

原创 贪心算法精品题

那么对于 string A = "12" string B = "23" string C = "14".如果进行排序由于BA大于AB故B位于A的前面由于CA大于AC所以C位于A的前面 故顺序为:B C A那么BCA是不是他们组成的最大数呢这里显然是,但是要以此类推就能知道这题我们只需要重载排序规则就能完成,当然这题还存在一些便捷条件比如如个排序数组的开头是“0”说明这些数着的最大值就是0。这个题目可以理解为找到一个子序列,满足子序列内的元素时先增在减或者先减在增的,就类似正弦函数。

2025-02-25 21:34:00 1066

原创 C++复习专题——泛型编程(模版),包括模版的全特化和偏特化

注意:我这里的代码所有的类内成员函数都在类内定义了,如果只在类内声明而在类外定义,那么在实现时需要带上模版参数列表并指明命名空间和类,详细看下面这份代码的析构函数。类模版实例化与函数模版实例化不同,类模版实例化必须在类模版名字后跟<>,然后将实例化的类型放在<>中即可,类模版的名字并不是真正的类,而实例化的结果才是真正的类。对于非模版函数和同名函数模版,如果其他条件相同,在调用时会优先调用非模版函数而不会从该模版产生一个实例,如果模版可以产生一个具有更好匹配的函数,那么将选择模版。

2025-02-25 20:35:37 801

原创 MySQL基本查询——表的增删查改

案例: 创建一张学生表。

2025-02-24 19:36:31 792

原创 MySQL数据库——表的约束

两个值:null(默认的)和not null(不为空)数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。下面我们通过显示null和null+1来验证null无法参与运算。案例:创建一个班级表,包含班级名称和班级所在的教室。站在正常的业务逻辑中:如果班级没有名字,你不知道你在哪个班级如果教室名字可以为空,就不知道在哪上课所以我们在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这 就是“约束。

2025-02-21 20:44:58 998

原创 【C++复习专题】—— 类和对象,包含类的引入、访问限定符、类的6个默认成员函数等

默认的拷贝构造函数对象按内存存储按 字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。注意:在编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,而自定 义类型是调用其拷贝构造函数完成拷贝的。6.3.3 拷贝构造函数典型调用场景1.使用已存在对象创建新对象2.函数参数类型为类类型对象3.函数返回值类型为类类型对象。

2025-02-20 20:20:31 801

原创 MySQL数据库类型——包括数据类型、文本、二进制类型、时间日期、String等,会对数值进行越界测试

对这个类型进行越界测试,首先创建一个数据库,然后建表。向text1这个表里插入数据可以看到当数据小于-128时以及数据大于127时插入会失败,并且插入小数会四舍五入为整数在MySQL里整型可以指定是有符号的或者无符号的,默认是有符号的可以通过unsigned来说明某个字段是无符号的案例:可以看到无符号的数据范围是0到255。

2025-02-19 18:33:45 674

原创 MySQL基本操作——包含增删查改(环境为Ubuntu20.04,MySQL5.7.42)

语法:说明:大写的表示关键字[] 是可选项指定数据库采用的字符集COLLATE:指定数据库字符集的校验规则1.2 创建案例创建一个使用utf8字符集的db1数据库创建一个使用utf8字符集,并带校验规则的db2数据库查看数据库如果没有设置字符集和校验规则他会默认使用utf8字符集,utf8_general_ci校验规则。

2025-02-18 15:27:54 431

原创 排序算法复习——包括插入排序、希尔排序、冒泡排序、快排(包括霍尔法、挖坑法、快慢指针法)、堆排、选择排序、归并排序等 (代码采用c/c++混编)

插入排序就像我们打斗地主的时候,有一大把牌我们来不及理,就会一张一张的拿然后把拿到的牌放到合适的位置。对于插入排序我们可以将待排序的数组理解为那一堆没有整理的牌,将排序好的部分理解为手上的牌,对于第i张牌我们的i-1张牌是理好的,那么我们只需要将第i张的大小与前面的第i-1张牌比较就可以找到他的位置,具体实现如下。

2025-02-17 00:18:59 1199

原创 [Linux复习 -- 五种IO模型] —— 阻塞IO、非阻塞IO、信号驱动IO IO多路转接、异步IO,包括相关接口的使用、select 、poll、epoll 以及通过这些接口封装服务器

阻塞IO:在内核数据准备好前,系统调用会一直等待。所有的套接字默认都是阻塞方式非阻塞IO:如果系统未将数据准备好,系统调用仍会直接返回,并且返回EWOULDBLOCK错误码。一般来讲对于一个可能产生数据的文件描述符我们希望在他有数据时就将数据读上来,但是非阻塞IO直接就返回了并不能达到这个效果,如果要通过非阻塞IO来达到这个目的,就需要不断的尝试读写文件描述符,这个改成称为轮询,但是轮询是对CPU的一种极大的浪费,一般只在特殊情况下使用。

2025-02-16 21:08:37 987

原创 【c++复习--c++11新增语法第一节】——本内容会讲到c++11新增的比较实用的语法,比如智能指针、lambda表达式、新增加的容器、还有右值引用

对于这个结果我个人还有疑惑,我的预期是str1那里调一次深拷贝(新一点的编译器会对连续的拷贝进行优化)str2哪里调两次深拷贝(因为我的赋值重载用到是现代写法所以会多一次深拷贝),但是我跑出来的结果竟然是上面这样,这里我认为可能编译器(vs2022)又做了一些优化,导致我的func这个传值返回没有发生深拷贝,所以就只打印了那个赋值重载又因为是现代的写法所以又掉用了一次拷贝构造也就打印了上面的两条信息。这里讲一下对于内置类型的右值我们叫纯右值,自定义类型的右值我们叫将亡值。

2024-12-03 21:00:11 757

原创 【c++复习专题】——哈希的底层结构和模拟实现

讲解哈希表并模拟实现,附源码

2024-11-25 14:04:37 647

原创 【linux网络部分复习】—— 对应用层HTTP/HTTPS协议和传输层TCP/UDP协议的系统理解,包括了网络套接字编程,以及通过网络套接字编程简单实现UDP和TCP

到这里就可以简单的完成服务端和客户端的通信了,但是这个通信是有问题的,就比如服务端读取客户端发来的数据,你怎么保证你读取的数据是完整的,你又怎么保证你将数据读完了,这些是目前无法解决的但是通过定制协议可以解决这些问题,你们可以自行思考一下,后续肯能我会写这部分内容。内存中的多字节数据对于内存地址有大端和小端之分(补充:大端存储是高位数据存在低地址,小端存储则反之),磁盘文件中的多字节数据相对于文件中的偏移地址也有大端和小端之分,同样的网络中的数据流也有大端和小端之分,对于网络数据流的地址我们是这样定义的。

2024-11-14 15:31:45 1119

空空如也

空空如也

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

TA关注的人

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