- 博客(95)
- 收藏
- 关注
原创 HDFS读写操作原理
在 Hadoop 分布式文件系统(HDFS)中,读取数据的过程涉及多个组件的协同工作,包括客户端、NameNode 和 DataNode。为了确保数据的高可用性和容错性,HDFS 采用了分布式存储和副本机制。
2025-01-08 19:55:08
1068
原创 QT——多线程操作
① 重写线程的run函数,在run函数里面每隔1秒循环向主窗口发送信号,主窗口写好槽函数处理就好了(实现效果每隔1秒接受信号后,在槽函数里面向文本编辑器添加 “hello world”) 想要重写线程的run函数,我们就需要自己写一个 myThread类,继承QThread类,才能重写run函数。,而不是实际的计算操作。界面开发中有密集型开发,可以采用多线程操作,但是子线程不能直接操作ui界面中的空间,可以在子线程中进行计算,计算完成后,传递信号到主线程中,主线程接收到相应信号执行控制ui界面的操作。
2024-09-25 10:22:12
946
原创 C++——异常处理机制(try/catch/throw)
C++ 中的异常处理机制允许开发者编写健壮的应用程序,能够在遇到错误时优雅地处理这些问题。通过使用 try、catch 和 throw 关键字,可以有效地管理和处理程序中的异常情况。合理地使用异常处理机制,可以提高程序的健壮性和可维护性。
2024-09-16 22:18:28
710
原创 C语言——错误处理机制errno
在 C 语言中,errno 是一个全局变量,用于存储最近发生的错误的编号。通过检查 errno 的值以及使用相关的错误处理函数(如 perror(), strerror()),可以有效地进行错误处理和调试。合理的错误处理机制能够提高程序的健壮性和用户的体验。
2024-09-16 15:28:55
1340
原创 C/C++内存管理——内存泄漏/内存碎片
内存泄漏通常发生在动态分配的内存上,如果这部分内存没有被正确释放,随着时间的推移,越来越多的内存将被占用,最终可能导致程序运行缓慢或者崩溃。直接点说:只需在构造函数中设置好内存分配的代码,并在析构函数中设置好内存释放的代码,后面创建对象,系统自动调用构造函数和析构函数,无序程序员特别留意程序内存安全性,方便后续程序编写。C++11 引入了智能指针,如 std::unique_ptr 和 std::shared_ptr,它们可以在对象不再使用时自动释放内存,从而避免内存泄漏。
2024-09-15 16:34:20
2711
原创 C/C++内存管理——new/delete详解
栈:静态分配内存,栈内存在编译时,由系统自动分配,在函数分配时自动分配,在函数返回时自动释放。另外,栈内存通常是连续的一块内存空间,由系统自动管理。堆:动态分配内存,堆内存是由程序员使用malloc或new手动分配,并使用delete或free释放内存。另外,堆内存通常不连续。
2024-09-14 17:25:23
1255
原创 C++——unordered_map
std::unordered_map 是一个基于哈希表实现的关联容器,非常适合需要快速查找键值对的应用场景。它提供了无序存储、快速查找、插入和删除等功能,并且允许用户自定义哈希函数和等价函数来优化性能。在使用时需要注意哈希冲突和迭代器失效等问题。
2024-09-14 07:00:00
1027
原创 C++——static应用全解
static的作用主要分为:静态全局变量:作用域限制在声明的文件内。静态局部变量:作用域限制在声明的函数内,每次调用该函数,该变量无需初始化,直接在上次函数结束后的状态下继续进行运算。静态全局变量和局部变量的周期都是整个程序。静态成员变量:属于类本身,而不是类对象,必须在类外定义并初始化,所有该类的对象共用一个静态成员变量。静态成员函数:属于类本身,而不是类对象,必须在类外定义并初始化,该函数只能处理该类的静态成员变量,不能处理非静态成员变量。
2024-09-12 17:53:37
759
原创 C++——STL中的迭代器(Iterator)补充
STL(Standard Template Library)中的迭代器(Iterator)是用于遍历容器中的元素的一种工具。这类迭代器可以进行递增(++)操作,但不支持递减(--)操作。双向迭代器支持递增(++)和递减(--)操作,并且可以解引用(*)和比较(==,!这类迭代器可以进行递增(++)操作,但不支持递减(--)操作。前向迭代器支持递增(++)操作,并且可以解引用(*)和比较(==,!随机访问迭代器支持所有上述操作,并且还支持随机访问([], +=, -=)。运行结果:适用于单向遍历数据源。
2024-09-12 16:05:06
865
原创 C++——虚函数
虚函数表(VTable):用来存储类中所有虚函数的地址。虚函数指针(VPtr):实例化对象指向所属类虚函数表的指针。通过基类指针调用虚函数:程序会通过基类指针获取对象的VPtr,进而找到对应类的虚函数表中相应的条目,调用正确的虚函数实现。纯虚函数:虚函数的一种特殊形式,和普通虚函数不同,它只在类中声明但不具体实现,迫使派生类重写该虚函数并提供具体实现。抽象类:包含至少一种纯虚函数的类,不能实例化对象,只能作为基类被其他类继承。
2024-09-11 17:00:37
2624
原创 C++——初始化成员列表
需要初始化列表成员的情况主要分为:1、派生类成员需要调用基类的构造函数2、类成员变量是常量。3、列表成员存在引用变量。4、列表成员中存在指针变量5、列表成员中存在需要特殊初始化的成员6、存在多个成员变量。
2024-09-10 16:06:07
751
原创 C/C++——野指针处理
在C++中,“野指针”(dangling pointer)指的是指向已释放或无效内存的指针。使用智能指针(如 std::unique_ptr、std::shared_ptr 和 std::weak_ptr)可以自动管理内存,避免野指针的问题。如果后续创建对象或者程序执行结束后,会自动使用构造和析构函数,合理分配和释放指针内存。当释放掉分配的动态内存后,将指针设置为nullptr,防止后续意外再次使用该指针。析构函数:在析构函数中,释放动态分配的内存,并将指针置空。4、避免返回局部变量的地址。
2024-09-10 14:51:38
797
原创 C++——重写、重载、隐藏
重写:主要是派生类重写基类的虚函数,后续在调用派生类的虚函数,实现不同的类对统一接口的不同处理机制。重载:在同一个作用域内,通过对同名函数的形参进行修改(形参的数量、类型和顺序),实现多个同名函数的不同处理机制。隐藏:派生类重新定义基类的非虚函数,后续派生类创建对象,默认调用派生类中重新定义的非虚函数,而隐藏基类的非虚函数。
2024-09-09 17:37:09
898
原创 C语言——strcpy、sprintf与memcpy
该函数和printf()函数有很多相似之处,例如printf()将不同类型的数据格式化到终端,而sprintf()函数是将不同类型的数据格式化到字符串中。另外,和strcpy()函数一样,该函数也不会对目标缓冲区进行检查,容易造成溢出。它是一种非常通用的内存复制函数,不仅限于复制字符串,还可以复制任何类型的内存块。3. 未定义行为:程序可能会继续运行,但结果不可预测,可能会输出错误的结果或导致其他未预料的行为。如果memcpy复制字符串,要复制的字节数超过原内存块本身的内存数,会怎么样?
2024-09-09 12:31:15
1303
原创 网络字节序
运行结果:由于本计算机是小端存储字节(Intel x86 架构通常采用小端序(Little-Endian)),所以网络字节序和本机字节序是相反的。htons和htonl函数用于将主机字节序转换为网络字节序。ntohs和htonl函数用于将主机字节序转换为网络字节序。作用:用于将16位整数从主机字节序转换为网络字节序。作用:用于将32位整数从主机字节序转换为网络字节序。作用:用于将16位整数从网络字节序转换为主机字节序。
2024-09-07 18:35:12
613
原创 排序算法——归并排序
归并排序(Merge Sort)是一种分治策略的排序算法,它通过将数组分成两半,递归地对每一半进行排序,然后再将排序好的两半合并成一个有序数组。归并排序的时间复杂度在最好、平均和最坏情况下均为O(n log n),并且是稳定的排序算法。
2024-08-12 14:28:10
357
1
原创 排序算法——插入排序
直接插入排序(Insertion Sort)是一种简单的排序算法,它的工作原理类似于人们手动排序卡片的方式。该算法通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
2024-08-10 23:32:27
435
原创 排序算法——简单选择排序
简单选择排序是一种基本的排序算法,其原理是每次从未排序的元素中选择最小(或最大)的元素,然后与未排序部分的第一个元素交换位置,直到所有元素都被排序。
2024-08-10 16:10:08
474
原创 查找算法——二分查找
二分查找是一种在有序数组中查找特定元素的算法。它的基本思想是通过比较数组中间元素和目标值的大小关系,来确定目标值在数组的哪一部分,然后不断缩小查找范围直到找到目标值或者确定目标值不存在为止。
2024-08-09 17:20:55
282
原创 数据结构——二叉树性质
这个性质很好记忆,观察一下图6-5-5。第一层是根结点,只有一个,所以2^(1-1)=2^0=1。第二层有两个,2^(2-1)=2=2。第三层有四个,2^(3-1)=2^2=4。第四层有八个,2^(4-1)=2^3=8。通过数据归纳法的论证,可以很容易得出在二叉树的第i层上至多有2^(i-1)个结点(i≥1)的结论。
2024-07-23 12:24:57
653
原创 数据结构——二叉树定义
二叉树是一种树形数据结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。每个子节点本身又可以是一个二叉树。二叉树在计算机科学中有着广泛的应用,例如在搜索算法、排序算法等领域二叉树(Binary Tree)是n(n≥0)个结点的有限集合,该集合 或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交 的、分别称为根结点的左子树和右子树的二叉树组成。
2024-07-23 10:54:57
511
原创 数据结构——队列(链式结构)
队列的链式存储结构是一种用链表实现的队列,它不像顺序存储结构那样需要预先分配固定大小的空间。链式存储结构的队列由节点组成,每个节点包括数据和指向下一个节点的指针。队列的链式存储结构可以动态地分配内存,更灵活地处理数据。在链式存储结构中,入队和出队操作会改变节点之间的指针关系,而不需要像顺序存储结构那样频繁地移动数据。这使得链式存储结构适用于需要频繁插入和删除操作的场景。空队列时,front和rear都指向头结点。
2024-07-22 01:54:50
754
原创 数据结构——队列(顺序结构)
入队在队列的末尾插入新元素,出队则是从队列的头部移除元素。循环队列是一种特殊的队列数据结构,它允许在队列头尾相接的情况下进行元素的入队和出队操作。
2024-07-22 01:33:20
585
原创 数据结构——栈(链式结构)
栈的链式存储结构是指使用链表来实现栈这种数据结构。在链式存储结构中,栈的每个元素被封装成一个节点,节点之间通过指针相连,形成一个链表。栈顶元素对应链表的头部,栈底元素对应链表的尾部。这种结构可以动态地分配和管理存储空间,适合于需要频繁插入和删除操作的场景。如果一个栈存在频繁进栈和出栈操作,可以考虑链式结构。的栈底开始向栈顶打印元素。
2024-07-21 01:34:40
1222
原创 数据结构——栈(顺序结构)
栈是一种数据结构,它是一种只能在一端进行插入和删除操作的特殊线性表。这一端被称为栈顶,另一端被称为栈底。栈按照后进先出(LIFO)的原则进行操作(类似与手枪装弹后射出子弹的顺序)。在计算机科学中,栈被广泛应用于函数调用、表达式求值、内存管理等方面。,不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。
2024-07-21 00:40:10
938
原创 数据结构——线性表(循环链表)
将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一 个环,这种头尾相接的单链表称为单循环链表,简称循环链表(circular linked list)。循环链表解决了一个很麻烦的问题。如何从当中一 个结点出发,访问到链表的全部结点。为了使空链表与非空链表处理一致,我们通常设一个头结点,当然,这并不是说循环链表一定要头结点,这需要注意。
2024-07-17 17:11:32
527
原创 数据结构——线性表(单链表)
线性表的链式存储结构定义是指使用指针将线性表中的元素按照其逻辑次序依次存储在存储空间中,通过指针来表示数据元素之间的逻辑关系。具体来说,链式存储结构由数据域和指针域组成,数据域存储数据元素的数值,指针域存储下一个元素的地址。而头节点是在链表的头部额外增加的一个节点,它不存储实际数据,只是为了方便对链表的操作而设置的。当list->next不为空时,就遍历链表,让p的指针向后移动,不断指向下一个结点,打印list->data。2.当j
2024-07-16 19:41:13
1209
原创 Linux常见操作问题
etc/passwd文件是Linux操作系统中存储用户账户信息的文本文件,包含了系统中所有用户的基本信息,比如用户名、用户ID、用户组ID、用户家目录路径。
2024-06-27 00:05:50
804
原创 QT——MySQL数据库联用
要使用ODBC,首先需要安装相应的ODBC驱动程序,然后在系统中配置ODBC数据源。接着,可以通过编程语言(如C++、Java等)或者数据库工具(如SQL Server Management Studio)来连接和操作数据库。下载地址:Oracle官网下载地址: https://dev.mysql.com/downloads/connector/odbc/在.pro文件中,找到QT这一行,在后面加上sql模块。3)接下来,设置数据库连接的相关信息,比如主机名、用户名、密码、数据库名等,
2024-06-18 07:00:00
715
原创 QT——事件
mousePressEvent(鼠标按下事件)、mouseReleaseEvent(鼠标释放事件)、mouseMoveEvent(鼠标移动事件)、mouseDoubleClickEvent(鼠标双击事件)等。所有事件,只能在主窗口中被捕获,子窗口无法自动捕获事件(排除焦点在子窗口身上的时候,之后再说这个问题) 这个时候,就要将事件从主窗口派发给子窗口 但是事件派发这个事情,要么一个不派发,要派发就所有事件一起派发,所以子窗口就需要写一个事件过滤器,将自己不需要的事件过滤掉,只留下自己需要的事件。
2024-06-13 15:18:39
1505
原创 QT——信号和槽
Qt中的槽函数(Slot)是与信号(Signal)对应的概念,用于接收信号并执行特定的操作。使用时,与类的成员函数一样。信号成员会在满足一定条件时某个对象自动触发该对象的信号(触发条件可以通过QT帮助文档进行查看每个类中标示了signals的栏位),触发后程序会调用与信号相连接的槽函数。注:在用户平常的界面设计都基于QWidget类,当然该类是QObject的子类,因此也可以使用connect()函数。当sender对象的signal信号触发时,receiver对象的method函数会自动调用。
2024-06-13 10:37:55
790
原创 QT——设计概述
Qt是一个的 C++ 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command User Interface,CUI)程序。
2024-06-12 20:37:47
1225
原创 C语言——预编译处理
其中,HEADER_FILE_NAME_H 可以是任意不重复的名称,用于标识这个头文件。这样,在每次引用这个头文件时,编译器会先检查是否已经定义了该名称,如果没有,则继续编译头文件中的内容;如果已经定义了,则跳过不再重复编译。这样可以确保头文件中的内容只被编译一次,避免了重复定义的问题。当一个头文件被多个源文件引用时,可以使用#ifndef/define/endif 结构确保其中的代码只会被编译一次,避免出现重定义的错误。所以,按照编程需求,如果是系统提供的库,就直接使用#include ;
2024-06-11 07:00:00
1255
原创 C语言——字符数组
语言字符数组的定义是指在C语言中可以使用一组连续的字符来存储和处理字符串。在定义字符数组时,需要指定数组的大小,并且可以初始化数组的内容。赋值“0123456789”有11个字节的数据大小(包括'\0'),超过szstr数组内存存储空间,出现段错误。
2024-06-10 14:54:43
686
原创 C语言——使用函数创建动态内存
malloc函数的原型为:void* malloc(size_t size),其中size是要分配的内存大小,单位为字节。ptr是指向分配的内存空间的指针,cast-type是要转换的指针类型,n是要分配的元素个数,element_size是每个元素的大小。是之前通过malloc、calloc或realloc函数分配的内存空间的指针,代码示例:如果要分配一个包含5个整型数据的数组,并将每个元素初始化为0。realloc函数用于重新分配之前动态分配的内存空间的大小。是重新分配后的内存大小。
2024-06-10 07:00:00
943
原创 C语言——函数指针
指针数组和函数指针相结合。指针数组指向不同的函数,通过引用数组中的指针元素,实现一个数组函数控制多个函数的功能。函数指针是指向函数的指针变量,可以用来动态调用不同的函数。定义一个指向函数的指针,该函数有一个整型参数并返。
2024-06-08 00:29:51
458
原创 C语言——指针补充
d打印就是将内存中的补码转换成原码打印(输出十进制)。%p打印就是将内存中补码当成原码打印(输出十六进制)。在这个示例中,定义了一个整型变量。一、指针数组和数组指针的区别。
2024-06-07 10:52:47
933
原创 数据库—— MySQL数据库字段约束
主键约束(Primary Key Constraint):保证字段值的唯一性,每个表只能有一个主键。外键约束(Foreign Key Constraint):用于建立表与表之间的关联关系,确保一个表中的外键值必须在另一张表中存在。唯一约束(Unique Constraint):确保字段值的唯一性,但允许空值。非空约束(Not Null Constraint):确保字段不接受空值。默认值约束(Default Constraint):指定字段的默认值,当插入数据时如果未指定该字段的值,则自动使用默认值。
2024-05-19 16:21:42
1217
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人