自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 笔试编程算法题(五)(C++代码)

解法:动态规划状态表示:dp[i]表示,以i位置为结尾的,最长的有效括号。状态转移方程:这里就需要进行分情况讨论了。1.当s[i] == '('时:此时的s[i - 1]又分为两种情况:a.当s[i - 1] == ')'时:此时这两个字符就是 ... )(...,显然这已经不可能拼接成一个有效的括号了,所以此时dp[i] = 0。

2024-12-18 22:44:27 830

原创 网络版本的通讯录青春版(protobuf)

Protobuf 还常⽤于通讯协议、服务端数据交换场景。因为我们主要目的只是为了学习protobuf,因此对于客户端,原本应该具备:新增⼀个联系⼈◦删除⼀个联系⼈◦查询通讯录列表◦查询⼀个联系⼈的详细信息这样四个功能。但是在这里我们只实现新增联系人的功能。对于服务器端,我们同样应该具备增删改查的功能,这里我们也只实现增的功能。这里我们需要用到一个Httplib库:cpp-httplib 是个开源的库,是⼀个c++封装的http库,使⽤这个库可以在linux、

2024-12-04 16:12:17 551

原创 proto 3 语法详解(2)

oneof 类型oneof 类型如果消息中有很多可选字段, 并且将来同时只有⼀个字段会被设置, 那么就可以使⽤oneof加强这个⾏为,也能有节约内存的效果。升级通讯录⾄ 2.3 版本通讯录 2.3 版本想新增联系⼈的其他联系⽅式,⽐如qq或者微信号⼆选⼀,我们就可以使⽤ oneof 字段来加强多选⼀这个⾏为。oneof 字段定义的格式为: oneof字段名字段1;字段2;... }注意:可选字段中的字段编号,不能与⾮可选字段的编号冲突。•。

2024-12-03 13:06:09 822

原创 proto 3 语法详解(1)

字段规则字段规则消息的字段可以⽤下⾯⼏种规则来修饰:•singular :消息中可以包含该字段零次或⼀次(不超过⼀次)。proto3 语法中,字段默认使⽤该规则。•repeated :消息中可以包含该字段任意多次(包括零次),其中重复值的顺序会被保留。可以理解为定义了⼀个数组。更新 contacts.proto ,PeopleInfo消息中新增字段,表⽰⼀个联系⼈有多个消息类型的定义与使⽤。

2024-12-02 18:30:12 1055

原创 ProtoBuf快速上手(C++)

在快速上⼿中,会编写第⼀版本的通讯录 1.0。在通讯录 1.0 版本中,将实现:•对⼀个联系⼈的信息使⽤ PB 进⾏序列化,并将结果打印出来。•对序列化后的内容使⽤ PB 进⾏反序列,解析出联系⼈信息并打印出来。•联系⼈包含以下信息: 姓名、年龄。

2024-12-01 13:48:14 1017

原创 初识ProtoBuf以及环境搭建(Win和Ubuntu)

序列化:把对象转换为字节序列的过程 称为对象的序列化。反序列化:把字节序列恢复为对象的过程 称为对象的反序列化。什么情况下需要序列化和反序列化?存储数据:当你想把的内存中的对象状态保存到⼀个⽂件中或者存到数据库中时。⽹络传输:⽹络直接传输数据,但是⽆法直接传输对象,所以要在传输前序列化,传输完成后反序列化成对象。例如我们之前学习过 socket 编程中发送与接收数据。我们之前在学习HTTP阶段简单使用过json来进行序列化和反序列化操作,除了json还有XML和这里要介绍的ProtoBuf。

2024-11-30 01:14:32 1232

原创 Qt-界面优化&QSS

由于样式的设置非常灵活,很多地方都能设置,这就导致当某个控件的样式不符合预期时,排查起来就比较麻烦。因此,在实际开发中,建议使用某一种统一的方式来设置样式。选择器。

2024-11-29 01:05:08 1178

原创 Qt-系统相关(2)多线程&网络

在 Qt 中,多线程的处理⼀般是通过 QThread类 来实现。QThread 代表⼀个在应⽤程序中可以独⽴控制的线程,也可以和进程中的其他线程共享数据。QThread 对象管理程序中的⼀个控制线程。

2024-11-27 14:41:00 1324

原创 Qt-系统相关(1)事件&文件

事件介绍事件是应⽤程序内部或者外部产⽣的事情或者动作的统称。在 Qt 中使⽤⼀个对象来表⽰⼀个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本⾝在不同的时刻发出的。当⽤⼾按下⿏标、敲下键盘,或者是窗⼝需要重新绘制的时候,都会发出⼀个相应的事件。⼀些事件是在⽤⼾操作时发出,如键盘事件、⿏标事件等,另⼀些事件则是由系统本⾝⾃动发出,如定时器事件。常⻅的 Qt 事件如下信号槽就是对事件的封装,事件是信号槽的底层机制。

2024-11-26 19:58:30 1176

原创 Qt-窗口相关

我们之前学过的代码都是基于QWidget控件,而QWidget更多情况下是作为别的窗口的一部分。Qt 窗⼝ 是通过 QMainWindow类 来实现的。QMainWindow 是⼀个为⽤⼾提供主窗⼝程序的类,继承⾃ QWidget 类,并且提供了⼀个预定义的布局。

2024-11-25 20:06:14 765

原创 Qt-容器类控件 && 布局管理器

之前学过的多元素控件,它里面包含的内容是一个一个自定义好的 “Item”对象。而容器类控件,里面包含的就是之前学过的各种控件了,比如QPushButton,QLineEdit等等。QGroup Box使⽤QGroupBox实现⼀个带有标题的分组框. 可以把其他的控件放到⾥⾯作为⼀组. 这样看起来能更好看⼀点注意, 不要把QGroupBox和混淆. (之前在介绍的时候提到了).核心属性分组框只是⼀个⽤来 "美化界⾯" 这样的组件, 并不涉及到⽤⼾交互和业务逻辑. 属于 "锦上添。

2024-11-23 01:45:18 1004

原创 Qt-多元素控件

Qt提供的多元素控件有:这里的多元素控件都是两两一对的。xxWidget和xxView的一个比较简单的理解就是:xxView是更底层的实现, xxWidget是基于xxView封装来的。可以说,xxView使用起来比较麻烦,但是能实现更复杂的功能。xxWidget使用起来简单,但是功能有限。xxWidget 和 xxView 之间的区别以 QTableWidget 和 QTableView 为例.•。

2024-11-22 15:20:21 961

原创 Qt-常用输入类控件

QLineEdit⽤来表⽰单⾏输⼊框. 可以输⼊⼀段⽂本, 但是不能换⾏核心属性:核心信号:录入个人信息:inputMask 只能进⾏简单的输⼊格式校验.实际开发中, 基于正则表达式的⽅式是更核⼼的⽅法。

2024-11-22 00:34:00 874

原创 Qt-常用的显示类控件

因此在Qt中,每次创建时,都会在widget.h中默认给我们包含了一个头文件,这个头文件中就前置声明了Qt中的所有内置类,这样就能减少头文件包含。为了让我们的图片能够跟着窗口的大小的改变而同步变化,我们可以在Widget中重写它的父类QWidget中的resizeevent虚函数。Qt的中QLabel中的文本是可以指定快捷键的,但是它这里的快捷键规则比QPushButton弱很多。我们发现多出来的部分,我们的图片并不会进行补齐,也就是不会随着窗口大小的改变而同步的发生改变。

2024-11-20 12:02:15 813

原创 Qt-常用的按钮控件 QPushButton & QRadioButton & QCheckBox

在QPushButton中,我们用的最多的就是clicked,在这里我们用QRadioButton来分别验证这里的其它信号运行结果:pressed就是鼠标只要点击还没有放开就会触发,而released只有当鼠标放开才会触发。toggled是只有当checked信号发生改变时才会触发。这里的clicked跟released用起来非常相似,但是还有一些区别的:对于clicked:我们点击这个按钮时,如果在松开鼠标前将鼠标移开按钮,那么此时松开后不会触发。

2024-11-19 01:12:15 765

原创 Qt-QWidget中的属性和方法

控件Wigdet,其实也就是小组件/小部件的意思,但是读作控件就显得非常专业了。在Qt Designer中这些都是Qt给我们内置好的类。

2024-11-18 14:07:10 1242

原创 Qt信号和槽

在Qt5以及更高版本中,自定义一个槽函数的过程跟自定义一个普通的成员函数没有什么区别。这种定义的方式我们之前也是用过的。还有一种自定义的方式:在图形化界面这里:右键一个控件后,有一个转到槽这里面就把这个控件能用到的信号全部展示了出来,包括有它的父类的信号,也有它的父类的父类的信号。比如我们之前用的clicked。点击之后就会自动帮我们生成一个槽函数的定义:在这里我们就只需要编写我们槽函数的代码即可。发现是没有问题的。

2024-11-16 16:11:54 950

原创 Qt初识&简单使用Qt

之前介绍过用图形化界面的方式创建hello world,这里我们使用C++代码的方式再来实现一次hello world。如上,首先要先包含一个头文件。在QT这里,每一个类都有一个对应的同名头文件。比如这里我就包含了 <QLabel>不过,在调用 setText函数的时候发现这里的参数是一个QString类型,这是什么呢?

2024-11-13 01:06:53 1034

原创 认识QT以及QT的环境搭建

Qt ⽀持多种开发⼯具,其中⽐较常⽤的开发⼯具有:Qt Creator、Visual Studio、Eclipse.其中:Qt Creator是官网提供的开发QT的IDE,这种对新手也比较友好,后续我们以Qt Creator演示为主Visual Studio开发QT功能强大,但是前期的配置比较麻烦,作为新手还是不太推荐。Eclipse现在已经停止维护了,不如前两种。关于QT的开发环境需要三个部分:1.一个C++编译器,这里的编译器是指gcc这种,不是指。

2024-11-11 18:15:02 1175

原创 笔试编程算法题笔记(四)(C++代码)

解法:二分查找本题主要考察对二分查找的理解程度,在一次二分查找中,我们需要清楚的知道我们要查找的是以左端点为主还是以右端点为主的,二者在代码上也会存在一些差别。public:// 先找左端点//left可以不用重置// 再找右端点。

2024-11-10 13:11:45 684

原创 软件测试的分类

1:⽩盒测试主要应⽤于单元测试阶段2:先执⾏静态设计⽤例的⽅法,再执⾏动态设计测试⽤例的⽅法3:设计⽤例⼀般使⽤路径测试,重点模块追加使⽤逻辑覆盖⽅法。

2024-11-10 09:18:43 1127

原创 测试用例的设计

什么是测试⽤例?测试⽤例(Test Case)是为了实施测试⽽向被测试的系统提供的⼀组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等要素。比如我们买回来了一个新电视,要进行测试:然而这只是根据生活经验来得出的测试用例,在软件测试中,我们不可能仅凭现场想到的测试用例来完成一次完整的测试。笔试的时候编写测试用例的题目,需要的方式来答题。(会涉及测试用例的要素)示例:而面试的时候回答测试用例,用思维导图的方式一一道来即可。(不会涉及测试用例的要素)

2024-11-09 18:07:39 964

原创 测试概念以及测试bug

需求分为用户需求和软件需求。软件需求可以作为开发和测试工作的依据,而用户需求不一定是合理的,这里的不合理有很多的角度:技术角度上,市场需求上,投入成本和收益比噔噔。

2024-11-08 15:52:08 1107

原创 认识软件测试

测试的场景有很多,日常生活中比如买电脑,网上购物,买电脑的过程中就伴随着测试行为,比如外观测试:比如外观是否霸气。性能测试:比如显卡,CPU,内存是什么类型价格测试:看看这台电脑是否买得起。再到程序也有测试,比如一个关于除法运算的函数,我们要测试这个代码逻辑是否符合预期,有没有对除数不能为0进行了处理。

2024-11-08 00:59:07 568

原创 简单了解前缀树/字典树(Trie树)C++代码

Trie 的形状和单词的插入或删除顺序无关,也就是说对于任意给定的一组单词,Trie 的形状都是唯一的。查找或插入一个长度为 L 的单词,访问 next 数组的次数最多为 L+1,和 Trie 中包含多少个单词无关。Trie 的每个结点中都保留着一个字母表,这是很耗费空间的。如果 Trie 的高度为 n,字母表的大小为 m,最坏的情况是 Trie 中还不存在前缀相同的单词,那空间复杂度就为 O(m * n)。一次建树,多次查询。

2024-11-02 22:47:11 330

原创 C++知识点复习

对于这些问题的回答,可以按照思维导图的结构来组织答案,然后再进行回答。(首先,要回答好这个问题,需要注意问题的层次,不要一上来就说新增了某某关键字和语法,在这里我们可以分为五个层次来跟面试官讲解:语法,std容器,多线程,智能指针,右值引用)(这里可以对照着思维导图跟面试官说,聊到某个方面的细节还需要自行搞清楚) 首先来看动态库和静态库的演示:先创建一个头文件里面定义了方法,但是还未实现。实现两个方法的实现分别在add.cc和del.cc中。 然后在创建一个main程序,来调用这两个函数 接着,再将add.

2024-10-31 21:41:45 724

原创 Redis 缓存 && 分布式锁

这里介绍的只是一个简单的“互斥锁”。这里对redis的学习就告一段落了,如果还想继续深入学习redis可以阅读redis的源码。

2024-10-23 00:12:29 1254

原创 Redis 集群

哨兵 模式, 提⾼了系统的可⽤性. 但是真正⽤来存储数据的还是 master 和 slave 节点. 所有的数据都需要存储在单个 master 和 slave 节点中.如果数据量很⼤, 接近超出了 master / slave 所在机器的物理内存, 就可能出现严重问题了虽然硬件价格在不断降低, ⼀些中⼤⼚的服务器内存已经可以达到 TB 级别了, 但是 1TB 在当前这个 "⼤数据" 时代, 俨然不算什么, 有的时候我们确实需要更⼤的内存空间来保存更多的数据。

2024-10-21 22:03:59 1059

原创 Redis 哨兵机制

我们这里为了演示3个redis-server,3个哨兵节点,本来应该是在6台机器上的,但是我们这里只有一台云服务器来完成这里的环境搭建。在实际工作上,把上述节点放在一个服务器上是没有意义的。由于这些节点比较多,依赖的端口号/配置文件/数据文件都避免冲突,当然如果在不同的主机上配置就比较容易了,在一个主机上的话可以使用docker来解决这个问题。首先为什么要使用docker?我们都知道虚拟机这个东西,它是通过 软件,在电脑上模拟出一些另外的硬件环境,就相当于构造了另一个电脑。

2024-10-20 14:28:15 1087

原创 Redis 事务 && 主从复制

Redis的事务要比MySQL要简单很多。1.弱原子性:Redis 事务不支持回滚。2.不保证一致性:Redis并不会保证事务执行前和执行后的内容是统一的。3.没有持久化:Redis本身就是在内存中存储数据的,这里的事务与持久化无关。4.不存在隔离性:Redis作为单线程的服务器模型,处理请求本质就是串行执行的。

2024-10-19 11:29:16 915

原创 Redis 持久化

RDB 是⼀个紧凑压缩的⼆进制⽂件,代表 Redis 在某个时间点上的数据快照。⾮常适⽤于备份,全量复制等场景。⽐如每 6 ⼩时执⾏ bgsave 备份,并把 RDB ⽂件复制到远程机器或者⽂件系统中如 (hdfs)⽤于灾备。•Redis 加载 RDB 恢复数据远远快于 AOF 的⽅式。•RDB ⽅式数据没办法做到实时持久化 / 秒级持久化。因为 bgsave 每次运⾏都要执⾏ fork 创建⼦进程,属于重量级操作,频繁执⾏成本过⾼。•。

2024-10-16 13:41:11 982

原创 Redis 简单编写C++客户端

我们之前的学习都是通过Redis自带的命令行式的客户端来使用Redis的,我们在执行命令的时候,都是手动执行的。然而这种操作方式并不是日常开发的主要形式。更多的时候,是使用Redis的api来实现定制化的Redis客户端程序,进一步来操作服务器。虽然还有些带有图形化界面的客户端,它们的本质跟命令行式的客户端一样,都是通用性质的,在工作中还是会更希望用到专用的,定制化的客户端程序。

2024-10-14 18:09:19 1079

原创 Redis 其他类型 && 渐进式遍历

我们之前已经学过了Redis最常用的五个类型了,然而Redis还有一些在特定场景下比较好用的类型Redis最关键的五个数据类型:上面的类型是非常常用,很重要的类型。除此之外的其他类型不常用,只是在特定的场景能够发挥用处,所以这里只是做简单描述与介绍。

2024-10-11 01:08:24 982

原创 Redis set类型 && zset类型

有序集合相对于字符串、列表、哈希、集合来说会有⼀些陌⽣。它保留了集合不能有重复成员的特点,但与集合不同的是,有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数(score)与之关联,着使得有序集合中的元素是可以维护有序性的,但这个有序不是⽤下标作为排序依据⽽是⽤这个分数。注意:在有序集合这里,有序指的是升序,而不是顺序,这里的概念与集合那里是不一样的。简单对比以下list set zset。

2024-10-09 23:52:13 1283

原创 Redis list 类型

列表类型 list 相当于 数组或者顺序表list内部的编码方式更接近于 双端队列 ,支持头插 头删 尾插 尾删。需要注意的是,Redis的下标支持负数下标。 比如数组大小为5,那么要访问下标为 -2 的值可以理解为访问 5 - 2 = 3Redis中的数据是有序的,但是注意这里的有序不是指排序数组中的升序或者降序,而是指数据的顺序很关键。比如把元素位置调换之后,得到的新的list与原来的list是不等价的。同样的一个词在不同的上下文中,它的意义可能是不一样的。比如同步这个词在 线程之间和IO之间的意义就不

2024-10-07 21:35:28 762

原创 Redis string类型&&hash类型

⼏乎所有的主流编程语⾔都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组、映射。在 Redis 中,哈希类型是指值本⾝⼜是⼀个键值对结构,形如 key = "key",value = { {注意:哈希类型中的映射关系通常称为 field-value,⽤于区分 Redis 整体的键值对(key-value),注意这⾥的 value 是指 field 对应的值,不是键(key)对应的值,请注意 value 在不同上下⽂的作⽤。

2024-09-30 00:44:17 1271

原创 Redis一些简单通用命令&认识常用数据类型和编码方式&认识Redis单线程模型

这是Redis中两个最为核心的命令。set插入这里的key 和 value都是字符串,我们可以加双引号 或者单引号,或者不加。get查找如果查询的key值不存在,那么会返回一个 nil ,也就是代表空在Redis中命令是不区分大小写的。这就是Redis最核心的命令和它俩的使用方法了,看起来就像是一个网络版的hash map一样。这也是Redis的一个优势,使用简单 学习成本低。

2024-09-26 22:21:34 1184 1

原创 简单了解Redis(初识阶段)

之前说了单机架构模式, 还有服务器的核心资源。当某一时刻,请求的数量太多了,就可能会导致服务器的某个硬件资源不够用了,无论是哪个方面不够用了,都会导致服务器处理请求的时间变长,甚至出错。如果碰到这种情况,怎么处理呢?1.开源:简单粗暴,直接增加更多的硬件资源来解决性能问题。但是需要注意:一台主机能增加的硬件资源是有限的。比如CPU ,内存条,这些取决于主板的扩展能力。当一台主机扩展到极限的时候,那么就只能引入多台主机了。而且不是说新的机器买来就可以直接解决问题,还需要在软件上做出对应的调整和适配。

2024-09-25 00:40:35 949

原创 大部分基础排序复习C++(归并、快排、堆)

在前 0 ~ i - 1 元素有序的情况下,(依次)将第 i 个元素插入前面已经有序的小序列,先使用二分查找找到插入位置的下标index,然后将区间[index + 1,i] 往后移动,再把原来i位置的值插入到index位置,使其有序。注意事项:在合并有序数组的时候,我们需要一个额外的容器,合并完之后再把结果填回到原数组中,对于这个额外的数组,建议使用全局的变量,这样能节省每层创建和销毁的开销,从而提高效率。先让间隔 h 的元素有序,在使得间隔为 h / 2,一直缩小,一直到 h = 1(此时数组有序)。

2024-09-23 12:50:59 837

原创 手动部署并测试内网穿透(ssh 和 nginx)

首先需要一台连接了公网的云服务器,然后我们要访问的内网穿透对象最好是Linux服务器,比如虚拟机,然后我们通过向云服务器发送指令,云服务器再将指定发送给指定对象,让其能够执行命令。总结就是:假设家里的机器就是我们的目标服务器,它首先会跟我们的云服务器进行通信,然后建立NAT转化表,这样我们的云服务器就能和家里的服务器进行通信了,这样我们在外边就可以直接跟我们的云服务器通信,然后在云服务器上通过特定的软件,将我们的请求转发到内网中的机器,这就是内网穿透。

2024-09-19 14:42:42 1856 1

空空如也

空空如也

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

TA关注的人

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