自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux系统编程(六)--基础IO

open函数的第一个参数是pathname,表示要打开或创建的目标文件。若pathname以路径的方式给出,则当需要创建该文件时,就在pathname路径下进行创建。若pathname以文件名的方式给出,则当需要创建该文件时,默认在当前路径下进行创建。(注意当前路径的含义)open函数的第二个参数是flags,表示打开文件的方式。参数选项含义O_RDONLY以只读的方式打开文件O_WRNOLY以只写的方式打开文件O_APPEND以追加的方式打开文件O_RDWR。

2025-04-07 15:24:13 989

原创 QT开发(6)--信号和槽

在Qt中,⽤⼾和控件的每次交互过程称为⼀个事件。⽐如"⽤⼾点击按钮"是⼀个事件,"⽤⼾关 闭窗⼝"也是⼀个事件。每个事件都会发出⼀个信号,例如⽤⼾点击按钮会发出"按钮被点击"的信 号,⽤⼾关闭窗⼝会发出"窗⼝被关闭"的信号。Qt 中的所有控件都具有接收信号的能⼒,⼀个控件还可以接收多个不同的信号。对于接收到的每 个信号,控件都会做出相应的响应动作。例如,按钮所在的窗⼝接收到"按钮被点击"的信号后,会做 出"关闭⾃⼰"的响应动作;

2025-03-22 18:35:42 905

原创 QT开发(5)--查文档方式|认识坐标系

使用move函数可以使它移动。移动的单位是像素点,参考的是父类对象,比如button的父类是Widget,所以它的范围只能在这个窗口里,而Widget的范围是整个屏幕。平面直角坐标系(笛卡尔坐标系),我们数学上的坐标系一般是右手坐标系,而计算机中的坐标系是左手坐标系。方式3:安装软件时有一个QT Asistent,也可以用这个查询。

2025-03-21 18:49:53 265

原创 QT开发(4)--各种方式实现HelloWorld

前面已经写过通过标签实现的了,所以这里就不写了,通过这两个例子,其他的也是同理。

2025-03-21 18:14:17 480

原创 QT开发(3)-- 对象树

我们当前的.cpp文件是以UTF-8编码的,但Qt Creator内置的终端并不是UTF-8方式来显示编码。这里我们new的对象并没有手动delete,但是不会内存泄漏,这是因为这个对象是挂到了对象树上的,以上代码并没有手动delete,但是当我们关掉运行程序后,依然会调用析构函数。虽然这里是乱码,但确实表示了调用析构函数。来处理字符串,并确保正确设置文本编码。所以,在 Qt 程序中,建议使用。对象树就类似于下图结构~

2025-03-21 11:39:34 276

原创 Linux系统编程(五)--进程控制

在linux中fork函数是⾮常重要的函数,它从已存在进程中创建⼀个新进程。新进程为⼦进程,⽽原进程为⽗进程。进程调用fork,当控制转移到内核中的fork代码后,内核做:分配新的内存块和内核数据结构给子进程。将父进程部分数据结构内容拷贝至子进程。添加子进程到系统进程列表当中。fork返回,开始调度器调度。fork之后,父子进程代码共享。例如以下代码:运行结果:这⾥看到了三⾏输出,⼀⾏before,两⾏after。进程43676先打印before消息,然后它有打印after。另⼀个after消

2025-03-21 11:10:41 662

原创 Linux系统编程(四)--进程概念

僵尸进程,孤儿进程,环境变量,进程创建

2025-03-18 17:50:59 758

原创 QT开发--第一个程序--Hellow World

label 对象会在合适的时候被析构释放,虽然没有手动写delete,之所以能够释放,只有是因为这个对象是挂到了对象树上。以上代码new了之后,没有delete,是否会出现内存泄漏呢?写C++程序,一定要时刻注意内存泄漏的问题。label 类中的setText函数是设置文本的,可以Ctrl+鼠标左键点击跳转,观察函数。方法二:通过纯代码的方式,通过编写代码,在界面上创建控件,显示 Hello world。方法一:通过图形化的方式,在界面上创建出一个控件,显示Hello world。下一篇博客讲解对象树。

2025-03-14 11:55:56 178

原创 QT开发--创建项目—认识项目代码

界面文件的格式是xml格式,和html非常类似,具体是什么含义,暂时不需要关注,双击widget.ui就会进入设计界面,左边是控件栏,可以直接长按拖拽,右边是属性栏。第六步:如图,然后下一步,这里有的人版本不一样,如果只有一个debug,勾选一个debug也可以,如果一个都没有,那就是配置环境出现了问题,需要删掉软件重新配置。build文件夹里有我们刚生成的程序:有debug文件和release文件,看你选择在什么环境下进行编译,如果两个都编译过,则里面会生成两个文件夹。第三步:选择qmake然后下一步。

2025-03-14 11:11:34 170

原创 基础算法--位运算

操作符名称符号作用左移操作符<<左移又移操作符>>右移按位或有1是1按位与有0是0按位异或相同为0相异为1/无进位相加按位取反二进制位取反给一个数n,确定它的二进制表示中的第x位是0还是1(n>>x)&n将一个数n的二进制表示第x位修改成1n|(1>>x)将一个数n的二进制表示第x位修改成0n&(~(1>>x)位图思想位图篇博客提取一个数(n)二进制表示中最右侧的1(lowbit)n&(-n)去掉一个数(n)二进制表示中最右侧的1(lowbit)n&(n-1)

2025-03-10 19:25:43 740

原创 C++进阶(八)--C+11

在2003年C++标准委员会提交了一份技术勘误表(简称TC1),使得C++03这个名字取代了C++98成为C++11之前的最新C++标准名称。但由于C++03主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把这两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准姗姗来迟。

2025-03-06 18:33:15 918

原创 C++进阶(七)--STL--bitset(位图)的介绍与基本功能模拟实现

实际在这个问题当中,我们只需要判断一个数在或是不在,即只有两种状态,那么我们可以用一个比特位来表示数据是否存在,如果比特位为1则表示存在,比特位为0则表示不存在。无符号整数总共有232个,因此记录这些数字就需要232个比特位,也就是512M的内存空间,内存消耗大大减少。方式一: 构造一个16位的位图,所有位都初始化为0。方式二: 构造一个16位的位图,根据所给值初始化位图的前n位。方式三: 构造一个16位的位图,根据字符串中的0/1序列初始化位图的前n位。位图的优缺点:优点:增删查改快,节省空间。

2025-03-05 16:13:44 710

原创 前缀和算法

前缀和算法是一种简单而高效的算法思想,通过预先计算并存储部分结果,可以在后续查询中快速得到答案。它在处理数组和矩阵的求和问题中非常实用,特别是在需要大量查询的情况下。掌握前缀和算法的基本原理和实现方法,可以帮助你在解决相关问题时更加高效。

2025-03-04 19:32:23 815

原创 Linux系统编程(三)--Linux环境基础开发工具

本篇博客主要介绍如何在Linux环境下进行开发,写代码,进行编译器的安装。在Linux下安装软件,⼀个通常的办法是下载到程序的源代码,并进⾏编译,得到可执⾏程序.但是这样太⿇烦了,于是有些⼈把⼀些常⽤的软件提前编译好,做成软件包(可以理解成windows上的安装程序)放在⼀个服务器上,通过包管理器可以很⽅便的获取到这个编译好的软件包,直接进⾏安装.软件包和软件包管理器,就好⽐"App"和"应⽤商店"这样的关系.

2025-03-03 19:30:36 812

原创 Linux系统编程(二)--Shell运行原理和Linux权限管理

但实际上你会发现,你所创建出来的文件和目录的权限值往往不是我们所翻译出来的值,原因就是创建文件和目录的时候还要受到umask的影响,假设默认权限是mask,则实际创建出来的文件权限是:mask&(~umask)对⽐windowsGUI,我们操作windows不是直接操作windows内核,⽽是通过图形接⼝,点击,从⽽完成我们的操作(⽐如进⼊D盘的操作,我们通常是双击D盘盘符.或者运⾏起来⼀个应⽤程序)。shell 对于Linux,有相同的作⽤,主要是对我们的指令进⾏解析,解析指令给Linux内核。

2025-02-23 19:32:14 928

原创 unordered_map和unordered_set的模拟实现

模拟实现进行编译时极有可能会出现大范围的模板报错,这时及其正常的,调整好心态,寻找bug,模拟实现unordered_map和unordered_ser的思想并不难,但写出来可能会有一堆报错,刚开始运用模板编程的途中会出现一些极小的Bug,我也找了好久,可能只是一个const的权限放的或者缩小,或者是迭代器的返回参数不匹配,模板不匹配,这些都是常有的,需要在运用中解决错误,提高大家模板编程的能力,接下来,我会附加全部代码,当下代码是可以运行的,可能也有一些小问题,欢迎大家评论区指出,一起学习。

2025-02-19 17:43:49 721

原创 基础算法--二分查找

二分查找,也叫折半查找,是一种专门为有序数组量身定制的查找算法。想象一下,你走进了一家按编号顺序排列书籍的图书馆,要找某一本书,要是从第一本开始逐本翻找,那可得费不少时间。二分查找可就机灵多了,它先把书架一分为二,看看目标书籍在左边还是右边,然后果断舍弃不需要的那半边,接着在剩下的半边里继续对半分、再找,如此循环,快速锁定目标。

2025-02-12 16:53:23 732

原创 哈希表实现(C++实现)

为了避免出现这种极端情况,当桶当中的元素个数超过一定长度,有些地方就会选择将该桶中的单链表结构换成红黑树结构,比如在JAVA中比较新一点的版本中,当桶当中的数据个数超过8时,就会将该桶当中的单链表结构换成红黑树结构,而当该桶当中的数据个数减少到8或8以下时,又会将该桶当中的红黑树结构换回单链表结构。与闭散列的哈希表不同的是,在实现开散列的哈希表时,我们不用为哈希表中的每个位置设置一个状态字段,因为在开散列的哈希表中,我们将哈希地址相同的元素都放到了同一个哈希桶中,并不需要经过探测寻找所谓的“下一个位置”。

2025-02-11 19:38:47 714 5

原创 C++(进阶六)--STL--unordered_map和unordered_set

1. unordered_set 是以不特定顺序存储唯一元素的容器,并允许根据其值快速检索单个元素。2. 在unordered_set中,元素的值同时是其键,它唯一地标识它。键是不可变的,因此,unordered_set中的元素不能在容器中修改一次,但是,它们可以插入和删除。3. 在内部,unordered_set中的元素不按任何特定顺序排序,而是根据其哈希值组织到桶中,以便直接通过其值快速访问各个元素(平均平均时间复杂度恒定)。

2025-02-09 13:40:15 690 2

原创 C++(进阶五)--STL--用一颗红黑树封装map和set

需要注意的是,反向迭代器只接收了一个模板参数,即正向迭代器的类型,也就是说,反向迭代器不知道结点的引用类型和结点的指针类型,因此我们需要在正向迭代器当中对这两个类型进行typedef,这样反向迭代器才能通过正向迭代器获取结点的引用类型和结点的指针类型。实际上,上述所实现的迭代器是有缺陷的,因为理论上我们对end()位置的正向迭代器进行--操作后,应该得到最后一个结点的正向迭代器,但我们实现end()时,是直接返回由nullptr构造得到的正向迭代器的,因此上述实现的代码无法完成此操作。

2025-02-07 12:46:27 996 1

原创 红黑树(C++实现)

我们这里直接实现KV模型的红黑树,为了方便后序的旋转操作,将红黑树的结点定义为三叉链结构,除此之外还新加入了一个成员变量,用于表示结点的颜色。//三叉链//存储的键值对//结点的颜色int _col;//红/黑//构造函数, _kv(kv){}在这里我们可以使用枚举来定义结点的颜色,这样可以增加代码的可读性和可维护性,并且便于后序的调试操作。//枚举定义结点的颜色RED,BLACK为什么构造结点时,默认将结点的颜色设置为红色?

2025-02-05 13:57:11 802 2

原创 AVL树(C++实现)

我们这里直接实现KV模型的AVL树,为了方便后续的操作,这里将AVL树中的结点定义为三叉链结构,并在每个结点当中引入平衡因子(右子树高度-左子树高度)。除此之外,还需编写一个构造新结点的构造函数,由于新构造结点的左右子树均为空树,于是将新构造结点的平衡因子初始设置为0即可。//三叉链//存储的键值对//平衡因子(balancefactor)int_bf;//右子树高度-左子树高度//构造函数,_kv(kv),_bf(0){}

2025-01-19 17:13:41 1084 4

原创 C++进阶(四)--set和map的介绍与使用

set类的模板参数• T就是set底层关键字的类型• set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模版参数• set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参 数。• ⼀般情况下,我们都不需要传后两个模版参数。1.存储特性:set是按照一定次序存储元素的容器,它会自动对元素进行排序。例如,对于存储整数的set,元素会按照升序排列;对于存储自定义对象的set,需要定义相应的比较函数(仿函数)。

2025-01-15 15:13:04 815 4

原创 二叉搜索树

找N左⼦树的值最⼤结点R(最右结点)或者N右⼦树的值最⼩结点R(最左结点)替代N,因为这两个结点中任意⼀个,放到N的位置,都满⾜⼆叉搜索树的规则。替代N的意思就是N和R的两个结点的值交换,转⽽变成删除R结 点,R结点符合情况2或情况3,可以直接删除。为了在实现其他接口的过程中方便随时检查,最好实现一个二叉搜索树的中序遍历接口,当我们对二叉搜索树进行一次操作后,可以调用中序遍历接口对二叉搜索树进行遍历,若二叉搜索树进行操作后的遍历结果仍为升序,则可以初步判断所实现的接口是正确。

2025-01-11 21:36:27 1005 2

原创 基础算法--滑动窗口

但是如果继续像方法一一样,重新开始统计第二个元素(left2)往后的和,势必会有大量重复的计算(因为我们在求第一段区间的时候,已经算出很多元素的和了,这些和是可以在计算下次区间和的时候用上的)。滑动窗口的套路都差不多,但是这里如果用count优化时,需要处理好count的数量,不像之前,我们的hash[out]<=hash[out],count--即可,因为这里我们出窗口的时候,窗口内的有效字母是可以重复的,需要特别注意一下。⽆ ⾮就是之前处理的对象是⼀个⼀个的字符,我们这⾥处理的对象是⼀个⼀个的单词。

2024-12-31 11:30:01 959 2

原创 C++进阶(三)--多态

通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态),这⾥我们重点讲运⾏时多态,编译时多态(静态多态)和运⾏时多态(动态多态编译时 多态(静态多态)主要就是我们前⾯讲的函数重载和函数模板,他们传不同类型的参数就可以调⽤不同的 函数,通过参数不同达到多种形态,之所以叫编译时多态,是因为他们实参传给形参的参数匹配是在 编译时完成的,我们把编译时⼀般归为静态,运⾏时归为动态。public:// 调用 int add(int, int)

2024-12-30 13:33:15 647 1

原创 Linux系统编程(一)--基础指令

在 Linux 系统的世界里,熟练掌握基础指令就像是手握一把万能钥匙,能轻松开启各种高效运维与开发的大门。所以,这篇博客我们来了解一些常用且关键的 Linux 基础指令。

2024-12-29 15:14:02 837 1

原创 C++进阶(二)--继承

继承(inheritance)机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段,它允许我们在保持原有 类特性的基础上进⾏扩展,增加⽅法(成员函数)和属性(成员变量),这样产⽣新的类,称派⽣类。继承呈现了⾯向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的 复⽤,继承是类设计层次的复⽤。

2024-12-24 22:55:29 855

原创 基础算法--双指针

解法一:暴力解法时间复杂度:O(N^2)算法思路:两层for循环即可列出所有两个数字的组合,判断是否等于目标值算法流程:两层 for 循环: 外层 for 循环依次枚举第⼀个数 a;内层 for 循环依次枚举第⼆个数 b ,让它与 a 匹配;ps :这⾥有个魔⻤细节:我们挑选第⼆个数的时候,可以不从第⼀个数开始选,因为 a 前 ⾯的数我们都已经在之前考虑过了;因此,我们可以从 a 往后的数开始列举。然后将挑选的两个数相加,判断是否符合⽬标值。会超时解法二:双指针时间复杂度:O(N)

2024-12-09 22:29:32 1068

原创 C++进阶(一)--模板进阶

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有 目标文件链接起来形成单一的可执行文件的过程称为分离编译模式模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。增强了代码的灵活性。模板会导致代码膨胀问题,也会导致编译时间变长。出现模板编译错误时,错误信息非常凌乱,不易定位错误。本篇博客到此结束,欢迎评论区留言~

2024-12-03 23:08:22 701

原创 C++初阶(十九)--STL--priority_queue的使用及模拟实现

priority_queue的介绍优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中的元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。注意: 默认情况下priority_queue是大堆。使用vector作为底层容器,内部构造大堆结构。使用vector作为底层容器,内部构造小堆结构。不指定底层容器和内部需要构造的堆结构。在C++中,仿函数是一种使用对象来模拟函数的技术。

2024-12-03 10:31:39 914

原创 C++初阶(十八)--STL--stack和queue的模拟实现

容器适配器(Container Adapter)是一种设计模式,在 C++ 的标准模板库(STL)中,它是一种特殊的容器。容器适配器本质上是对已有容器进行包装,提供了一种受限的、特定用途的接口,以适应特定的编程需求。STL中的栈和队列适配器通常是基于deque实现的,deque是一个双端队列,它的底层实现较为巧妙,感兴趣的可以自己去看一下,这里就不做讲解了。在stack的类模板声明中我们可以看到有两个参数,第一个是stack中所存储的元素类型,第二个是指定使用的容器类型,默认情况下是deque。

2024-12-02 18:00:55 424

原创 C++初阶(十七)--STL--stack和queue详解及使用

在 STL 中,stack是一个容器适配器,它默认使用deque作为底层容器来实现。当然,我们也可以指定使用vector或listint main()//使用默认的适配器// 使用 vector 作为底层容器的 stack// 使用 list 作为底层容器的 stackreturn 0;在 STL 中,queue是一个容器适配器,它默认使用deque作为底层容器来实现。当然,我们也可以指定使用vector或list//默认容器//特定适配器。

2024-12-01 21:31:51 340

原创 C++初阶(十六)--STL--list的模拟实现

本篇博客会使用较多的模板编程,模拟实现迭代器,加深对模板编程的理解,这里只实现常用接口的模拟,部分不是很常用的接口用到时在翻阅手册即可,大多接口的使用在中均已提到。所以本篇博客的重点在迭代器的模拟,因为已经在C语言中的数据结构讲解过了。本次我们需要实现三个类,我们经常说list在底层实现时就是一个链表,更准确来说,list实际上是一个带头双向循环链表。因此我们要实现一个list肯定要实现一个结点类,这个结点里面存放着的信息有数据,前一个结点的地址和后一个结点的地址。

2024-11-28 16:12:40 875

原创 C++初阶(十五)--STL--list 的深度解析与全面应用

C++ 的标准模板库(STL)中的list是一个功能强大且灵活的双向链表容器,它提供了众多接口函数来满足各种编程需求。在本篇博客中,我们将深入探讨list的所有成员函数,包括一些相对不太常用但在特定场景下非常有用的函数,我们这里只探讨基本的使用,不探讨底层原理,下一篇博客,我们将会模拟实现list。

2024-11-24 17:08:00 926

原创 C++初阶(十四)--STL--vector的模拟实现

reserve函数的实现思路也是很简单的,先判断所给n是否大于当前容器的最大容量(否则无需进行任何操作),操作时直接开辟一块可以容纳n个数据的空间,然后将原容器当中的有效数据拷贝到该空间,之后将原容器存储数据的空间释放,并将新开辟的空间交给该容器维护,最好更新容器当中各个成员变量的值即可。其次,vector还支持使用一段迭代器区间进行对象的构造。对容器进行析构时,首先判断该容器是否为空容器,若为空容器,则无需进行析构操作,若不为空,则先释放容器存储数据的空间,然后将容器的各个成员变量设置为空指针即可。

2024-11-23 17:54:05 970

原创 C++初阶(十三)--STL--vector的使用

1、vector是表示可变大小数组的序列容器。2、vector就像数组一样,也采用的连续空间来存储元素,这也意味着可以采用下标对vector的元素进行访问。3、vector与普通数组不同的是,vector的大小是可以动态改变的。4、当vector需要重新分配大小时,其做法是,分配一个新的数组,然后将全部元素移到这个数组当中,并释放原来的数组空间。5、vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因此存储空间比实际需要的存储空间一般更大。

2024-11-20 18:11:42 1019

原创 C++初阶(十二)--STL--string类模拟实现

在上一篇中我们了解了string类的各类接口的使用,但是我们作为程序员不仅仅只是会用,还得,因此接下来的内容将一步步的讲解如何模拟实现。

2024-11-11 17:56:47 935

原创 C++初阶(十一)--STL--string类

在 C++ 中,string类是用于处理字符串的标准类。它提供了一种方便、灵活且功能强大的方式来操作字符序列,相较于传统的 C 风格字符数组,string类隐藏了许多底层的内存管理细节,让程序员能够更专注于字符串本身的处理逻辑。string类string();//构造一个空字符串//复制s所指的字符序列//复制s所指字符序列的前n个字符//生成n个c字符的字符串//生成str的复制品//复制str中从字符位置pos开始并跨越len个字符的部分string s1;//构造空字符串。

2024-11-07 17:44:38 673

原创 C++初阶(十)--初识STL

STL 是 C++ 标准库的一部分,它提供了一系列通用的模板类和函数模板,这些模板都是经过精心设计和优化的,可以用来处理各种常见的编程任务,比如数据存储(像数组、链表、树这些结构相关的事儿)、数据处理(排序、查找等操作)以及算法实现等。简单说呢,就是别人已经帮咱们把很多常用的、好用的代码模板都准备好了,咱们只要知道怎么用就行了。

2024-11-05 14:45:43 625

空空如也

空空如也

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

TA关注的人

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