- 博客(56)
- 收藏
- 关注
原创 QString::lastIndexOf使用——获取上级文件路径
QMessageBox::warning(this,"返回","返回失败:已经在最开始的文件夹目录");而函数 lastIndexof('/')就可以获取最后一个 / 的位置,并返回Int。在实现文件查询功能时,想要实现一个返回按键,点击后可以返回到上级文件目录。搭配上remove() 就可以实现获取上级文件目录。因此,我需要得到最后一个"/"前的内容作为路径。else//返回到上一个路径。
2024-05-24 17:48:39 452
原创 QT中C端关闭导致S端崩溃问题
2. **资源释放不当**:确保在程序中使用的资源(如文件、内存等)在不再使用时得到正确的释放。5. **socket操作问题**:如果在客户端关闭连接时,服务器端的QTcpServer对象被析构,而此时socket还没有正确关闭,可能会导致崩溃。7. **TCP连接关闭方式**:了解不同的TCP连接关闭方式,并选择适当的关闭方法。1. **未处理的异常**:程序中可能存在未被正确捕获和处理的异常。4. **Qt版本bug**:有时候,Qt版本可能存在一些已知的bug,导致程序在关闭时崩溃。
2024-05-14 18:24:30 458
原创 使用QT-QSqlQuery::value()遇到的问题
但是我遇到一个问题,代码 qDebug()<<query.value(0).toInt()<<" "<<query.value(1).toInt();所以,要么读取先读取jack的id后query.next(),再读取rose的id,要么修改select语句让其直接读取两个用户id。在实现客户端间好友添加功能时,我通过以下函数想实现数据库对好友信息的保存。后面通过使用GPT才发现,原来是我对.value()的理解是错误的。它里面的数字是访问query所在的那行数据的元素。// 先找到对应名字的ID。
2024-05-12 16:51:39 515
原创 QT-file无法读取text文本中多行内容
所以我们通过将其换成空格的方式,让它能够被stringlist读取,并通过空格将每个元素分开。因为换行跟空格会因为回车换行的缘故导致无法对多行数据正确的读取。
2024-05-07 20:08:50 367
原创 QT-TCP通信
/让服务器端的tcpsocket与客户端的链接(或者说接受链接请求)网上的资料太过于书面化,所以看起来有的让人云里雾里,看不懂C-tcpsockt和S-tcpsocket的关系。//当有客服端链接的地址跟接口与listen的一致时,m_server会发出信号。//在头文件创建了qtcpserver,在这里将他设定为listen状态。//需要先接收到读取信号后,server才能正常读取数据。//寻找输入到ip、port文本编辑框对应的server。//若客户端收到数据。//接收客户端的数据。
2024-05-07 19:53:24 506
原创 QT-删除原文件的多行内容
3.用QStringList接收QStiring的文本,并用QString的.split("\n")识别出文本中的每一行。在removeAt的时候其实就已经对lines进行修改了,这样写导致了删除之后的访问越界,出现了这样的报错。通过寻找路径找到了Line:768是.removeAt的内部函数,并用GPT找到了问题所在和解决方案。实现功能:双击tablewidget中的一行内容,弹出确认对话框并实现删除功能。2.怎么通过点击的方式访问到具体哪些要删除的内容?在实现删除这一功能的过程中,我犯了一个低级错误。
2024-03-30 21:41:42 629
原创 QT中messageBox的使用
想要实现一个注册功能,判断两次输入的密码是否相同,不同则弹出对话框。查阅了资料,很多都用 exec()来实现信息框的停留,如下。但是这会导致按了确定之后将注册窗口一同关闭的情况。最后还是得用warning函数来实现。
2024-03-12 13:37:00 583
原创 除留余数哈希表
void creat_data(vector<int>&v)//将生成的20个随机数存入vector。实验要求:随机生成20个两位整数,使用除留玉树法的哈下函数以及链表法解决哈希冲突,生成哈希表。//将v容器的数据全部储存到hash中,并按余数插入链表。int creat_num()//创造两位数的整数。//创建10个链表,用于储存取余后的整数。
2023-12-23 17:16:56 502
原创 P4715 【深基16.例1】淘汰赛
再来,从题干可以知道,我们所采用的结构体除了需要有树的两个左右节点指针外,还需要两个变量用来储存“能力值”和“编号”在这道题中,我们需要将所有父节点都先赋值为NULL,然后对所有的叶子节点赋值。首先从题干要求入手,我们可以了解到题目要求是二进一,不难想到这是二叉树的题。然后对左右节点进行比较,将大的值赋给父节点,并递归调用该函数。最后,访问根节点的左右子树,判断那个小,输出它的编号即可。
2023-12-05 20:23:11 180
原创 STL容器
vector有“未雨绸缪机制”,即capacity容量要比size要大,每次当size要大于capacity时,它会另外开辟一块空间,并将原有的数据全部移植到新的空间去,这也会造成原来的迭代器失效。有双向访问迭代器,不能像随机访问迭代器一样,通过+n和-n的写法来访问前后元素,但可以通过it++/--的方式来访问相邻元素。用insert(迭代器,位置,数据)会将数据插入到”位置“中去 ,原先“位置”及"位置“之后的元素会向后移。没有迭代器,只能用top()来访问末尾元素,插入也只能从尾插入。
2023-12-05 19:53:10 429
原创 c++四种类型转换
2.保证安全性,只能经行上行转换,且不能对基本类型(int char)和非继承类进行转换的dymatic_cast<转换类型>(转换变量)1.相当于C语言种对变量进行强制类型转换(转换类型),但不能进行无关类转换的static_cast<转换类型>(转换变量)4.不能对基本类型进行转换,但可以对无关类型及上下行转换的reinterpret_cast<转换类型>(转换变量)相反,由于父类对象转换成子类对象给子类指针赋值时,无法让子类指针读到所有的子类数据,所以下行转换是不安全的。
2023-11-13 21:51:33 177
原创 排序-基数排序
排序思路:抽象实现多个桶用来储存所需要排序的基数,再递归的调用到每一次数上(通俗点讲,先按个位进行分类,再按十位进行分类,依次排到最高位,最后将所有分类的数连在一起就是排完的序列)优点:在合适的条件下能实现近乎线性的时间复杂度。缺点:开辟大量的桶可能造成空间上的浪费。
2023-10-26 19:48:47 95
原创 排序-归并排序
A[RightEnd] = TmpA [RightEnd]: /*将有序的TmpA[]复制回A[] */{ /*将有序的A[L] A[R- 1]和A[R] "A[RightEnd]归并成一个有序序列 *//* L=左边起始位置,R=右边起始位置,RightEnd =右边终点位置*/TmpA[Tmp++] = A[R++]: /*将右边元素复制到TmpA */TmpA[Tmp++] = A[R++]: /*直接复制右边剩下的 */TmpA[Tmp++] = A[L++]: /*直接复制左边剩下的*/
2023-10-17 19:59:22 86
原创 选择排序与堆排序
i++)//执行完a[n-2]时a[n-1]必定比a[n-2]小了。j++)//遍历a[i]后面的元素进行比较。//记录后面元素最小值的下标。//储存a[i]后面元素中的最小值。
2023-10-12 16:02:59 55
原创 PTA-是否同一棵二叉搜索树
写了一个多小时的shi山代码,暂时没精力总结和修改了,等以后再优化一下吧、结合了树的构建,遍历输出,指针的传递等知识点。
2023-10-11 22:26:23 109
原创 插入排序进阶——希尔排序
通过学习简单排序我们可以观察到它们的一个共同点就是每次都是比较相邻的两个元素,并对其进行操作。这样每次解决的都是一个逆序对(数组中大小逆序的两个数),若 其平均时间复杂度为N^2。而我们要优化这个排序方法,则需要通过一次操作来解决多个逆序对。最直接的操作便是每次对相隔较远的元素进行操作,这样便可以实现一次操作解决多个逆序对。i++ )//对间隔范围内的每个元素遍历。//这里i=d和i
2023-10-11 19:27:35 67
原创 力扣-两数相加
一开始我把这道题复杂化了,我想着通过逆序链表输出两条链表的值,再将两个链表的值相加之后再将这个值储存。但其实问题不用这么麻烦,只需要简单的对同一位置的链表元素相加,当相加结果大于9时再进位就行。2.两条链表长度不一样:用新节点直接将不等长的节点数值存储起来(考虑进位)1.两条链表长度一样:用新节点直接将相加后的值存储起来(考虑进位)if(flag==1)//若l1 l2都空了但是进位了。while(l1&&l2)//当两条链表都不为空时。//写题思路:将两个链表的节点相加,列入新链表中。
2023-10-07 20:29:06 90
原创 力扣报错: runtime error: member access within null pointer of type ‘struct ListNode‘ [solution.c]
常见的情况是写一个循环如 p=p>next ,但有可能出现了p已经指向了链表结尾元素了,即p=NULL,而程序的循环又没有退出,想要执行p=p>next而导致想访问的空间无效。最基本的写法就是在循环语句里加一个if语句,让循环跳出,或者直接return。这是因为访问了无法访问到的空间。
2023-10-07 19:57:26 810
原创 链表的基础
这样的操作可以方便我们将所有的链表操作统一化,让链表为空时也能正常的使用函数。=NULL)//有可能空间申请失败。链表的存在是为了实现空间内存的动态分配,它的存储是不连续的。当我们要建立一个空链表时,通常是建立一个指针,指向一个空节点。最常规的结构为 数据域+指针域。附上创建空链表的代码。
2023-09-24 15:58:22 52
原创 *二叉树的最值堆
将H[0]设置为填入数据的最大值,那么我们只需要比较每个节点跟填入数据的大小,若比他小则让空的数组空间储存这个值,直观表现为将原来的节点下降一个度,直至出现比填入数据大的值为止(若整棵树的最大节点仍小于所要填入的节点时,因为我们设定了H[0]是最大的数值,所以插入的数最终只能存储到H[1]引入一个概念:不已先后顺序存储数值,而以数的大小进行排序存储的一种特殊队列。我们可以采用数组的结构进行存储,并通过下表来模拟二叉树的结构。我们可以考虑常规的存储方式,一种是数组,一种是链表。2.必须实现堆的大小排序结构。
2023-09-19 15:41:42 65
原创 逆转链表中的元素
2.当old跟new指向同一个节点时,说明k的元素的逆序已完成,再通过new和old及头节点来链接未改变的元素即可。//用tmp来指向下一个需要操作的元素,防止因为逆转后无法找到链表的其他节点。//用于指向逆转元素前的最后一个元素,以便最后实现逆序的链接。//将逆序前的头一个元素和未逆序的元素链接。//让old所指的元素逆转,指向上一个元素new;//*此时已经实现了k个元素的逆序,只需要将前面的元素指向。//逆序后的第一个元素,再将后面没逆序的元素链接起来即可。//指向逆序后的第一个元素。
2023-09-19 13:13:26 80
原创 二叉树搜索树的查找及插入
我们只需要不断比较值的大小,向左/右子树遍历,找到最后的叶节点,比较其大小插入其左/右节点即可。else if (num > bst->data)//若值更大,则找右节点。else if (num < bst->data)//若值更小,则找左节点。当然了,因为插入的操作,我们有可能会使搜索树的结构失调,因此我们将引入平衡二叉树的算法。通过前面的知识我们可以了解到,二叉搜索树遵循 左节点<根节点<右节点 的规律。while (1)//通过循环的方式实现,也可以通过递归的方式实现。下面是用递归实现的伪代码。
2023-09-16 12:04:02 73
原创 二叉树搜索树的删除
/也可以找到右子树中最小的节点,即 tmp=FindMin(bst->right) 这两节点的值都是子树里最接近被删除节点的。if (bst->left == NULL && bst->right == NULL)//没有子节点,直接删除。else if (bst->left&&bst->rigth==NULL)//只有左节点时,直接赋值左节点的值。//释放掉被找到的左子树中最大的节点,这样就能将原来指向该节点的根节点指向空。//这里我们只考虑二叉搜索树,故若节点只有一个,即该节点下面不可能还有节点。
2023-09-16 11:21:59 307
原创 静态链表(数组)表示二叉树
我们将所有节点储存在一个包含特殊数组(数组元素包括:节点数据、两个节点下表)中,将对应左右子节点的下标存放在数组中,没有子节点则设置为-1。这样,当我们遍历完所有节点后发现没有出现的数字所对应的数组元素就是根节点,而且通过储存所有子节点的下标也可以唯一的确定一棵树。我们可以采用静态链表的方式来进行储存,从而直观的找出根节点的位置。上体所述,我们要怎么求出这棵树的根节点呢?
2023-09-14 17:19:12 290
原创 二叉树的遍历
一般的二叉树遍历都是采用递归思想实现的,而递归的本质也是用堆栈的数据存储结构来实现的。因此我们也可以通过堆栈。当我们想要对二叉树的每一层进行遍历时,若采用堆栈式的存储则无法再对子节点经行访问。当我们要输出父节点时,将父节点的子节点都入队,这样就能实现层序遍历。常见的二叉树遍历方式有:先序遍历 中序遍历 后序遍历。因此,我们需要采用队列的存储方式。
2023-09-10 22:35:27 58
原创 二叉树的引入-儿子兄弟表示法
于是我们引入了儿子-兄弟表示法,即一个指针指向第一个子节点,一个指针指向和它平行的兄弟节点。当树的每个节点的度不同时,若采用统一的数据结构存储则会造成大量的空间浪费。这样,将这种存储方式的示意图旋转45°,即可得到二叉树的结构。
2023-09-10 10:53:55 94
原创 树的引入-二分查找
当数组的元素过多时,时间复杂度为O(n),于是我们引入了从中间开始,动态判断元素的方法——二分查找,其时间复杂度为O(log n)当所求元素小于mid所指元素时,right=mid-1;当所求元素大于mid所指元素时,left=mid+1;设立left mid right 三个指针,分别指向数组的前 中 后三个位置的元素。当所求元素等于mid所求元素时,返回mid,即可找到所求元素在数组中的位置。而当我们在这些元素节点上添加或删除元素时,数组的结构不方便我们操作。
2023-09-10 00:00:43 69
原创 洛谷-P5594 【XR-4】模拟赛
if (sum[(p[ik][i]-1)].target == 0)//这里-1是因为数组从0开始算,而日期从1开始算。很典型很常见的方法,可以如果这题觉得有点难理解的话可以参考下这篇博客。//用于记录每天需要做的题目数量。//核心思路:用target来避免同一天出同一套卷时重复计数。//用于避免重复计数。//申请二维数组空间的实质:先申请一个指针数组。//再给每个指针数组的成员分配空间。//实现对每天需做题目的统计。//循环每套题的出题时间。//涉及二维数组的内存分配知识。
2023-09-06 20:22:21 192
原创 洛谷-P2141 [NOIP2014 普及组] 珠心算测验
//最重要的区别就在这。//别问我20000哪来的,问就是试出来的。//将相同的数 改为不存在的-2,并以此作为。//直接相加就可以求得总过有多少个数符合条件。2.建立结构体数组,直接给每个成员多加一个判断数值,若符合条件则将判断数值修改。本题难点在于每个和的数只能被记录一次,因此需判断是否有不同的两个值相加相等。//暴力遍历每个数,并把每个符合条件的数载入数组arr。.//用于标志是否被计数。//遍历arr,统计其不相同的数。
2023-09-05 20:20:02 533
原创 洛谷-P1014 [NOIP1999 普及组] Cantor 表
一开始看跟之前一道没做出来的蓝桥杯的题很像,想着怎么普及-就这么难了。后来才发现这题没那么麻烦,只需要找到规律就好了。分母就用行数+1减去分子数就行了。规律是:分子分母和=行数+1。偶数行是分子是n减去前面总数。奇数行是下一行的总数-n+1。
2023-07-08 12:01:21 179 1
原创 数组&指针在函数传参的知识点
在写洛谷-P5729 【深基5.例7】工艺品制作中,我之所以使用了全局变量是因为一开始出现问题,在qiege函数中传参类型我写成int***导致程序报错。一直习惯性的把数组传参理解成指针导致我一直没有找到问题所在,于是又回去复习了一下。顺便补充几张之前的笔记截图。
2023-06-30 22:38:30 62
原创 C++ 引用
引用的最终目的:在调用函数(方法)时,可以通过(int &a,int &b)的方式达到传地址的效果,函数内部对a,b修改后可以直接改变主函数的值,而不需要使用指针来实现。其中传参类型是char*的地址,所以类型是char**,通过指针的形式对原函数的参数进行修改。注意,引用必须在初始化的时候就被定义,且已经初始化后不能再进行修改。后续中&a则等价于&data,即对data取地址。2是C++的写法,利用了引用区别名,将主函数的str直接取别名为my_str,使其在函数中可以直接对原变量进行修改。
2023-06-30 01:36:26 60
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人