- 博客(264)
- 收藏
- 关注
原创 C++中的类型转换操作符:static_cast && reinterpret_cast &&const_cast && dynamic_cast
为了能控制向下转型时的越界问题、C++提供了dynamic_cast类型转换操作符,dynamic_cast会在转换前检查是否能转换成功,可以转换就转换、不能转换就返回0
2024-07-01 16:11:47
778
原创 C++的特殊类设计 && 饥饿汉模式
一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供过一个访问它的全局访问点,该实例被所有程序模块共享
2024-06-23 22:55:37
851
原创 C++的智能指针 && RAII
的技术,确保资源的获取与对象的创建同步,资源的释放与对象的销毁同步,从而简化资源管理并帮助避免资源泄漏和异常安全问题。(如内存、文件句柄、网络连接、互斥量等)是一种利用对象生命周期来控制程序资源。
2024-06-20 23:36:07
680
原创 QT:QT中的默认代码 && QT 创建控件的两种方式
delete ui;在Widget构造函数中初始化列表中,使用parent 初始化基类在构造函数中调用的 ui->setupUi 就是用来将 Widget 和 form file 绑定的。
2024-06-14 16:02:41
835
1
原创 C++的异常捕获
3、找到匹配的catch子句并处理后,会继续执行catch子句后的非try...catch块中的内容。(异常是一种运行时错误,可以中断程序的正常流程,常见的异常包括除零错误、文件未找到、网络连接失败等)需要程序员自己去查找对应的错误,如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误。如果异常未被捕获,它会向调用栈的上传递,直到找到一个处理器,如果找不到一个处理器就会使程序终止。,并将控制权转移到预定的异常处理逻辑中。太过强硬,如果发生内存错误,或者除0语法错误等就会直接终止程序。
2024-06-14 15:52:01
997
原创 C++11:右值引用 && 移动语义 &&完美转发
左值引用没有解决的问题(局部对象做返回值时不能使用传引用返回,需要传值返回 + 两次拷贝构造)右值引用解决了(移动构造 + 移动赋值使得传值返回时可以不用经历拷贝,只需要交换资源即可),我们把移动构造和移动赋值叫做右值引用的移动语义
2024-06-11 16:57:20
1210
原创 Leetcode:合并两个有序链表
(其中 n 和 m 分别为两个链表的长度。递归调用 mergeTwoLists 函数时需要消耗栈空间,栈空间的大小取决于递归调用的深度。结束递归调用时 mergeTwoLists 函数最多调用 n+m 次)合并(l1,l2)等价于解决 l1->next = mergeTwoLists(l1->next, l2) 以及l2->next = mergeTwoLists(l1, l2->next)的子问题。
2024-06-08 11:57:08
390
原创 Leetcode:四数之和
(long) nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] 是表达式的类型提升,有一个long则后面的所有运算均提升为long操作。类似于三数之和的解法,但需要多加一些限制,同时为了防止多个数组元素的相加之和出现整型溢出问题还要将整型转为long。(查找前两个数要两次for,查找后两个数因为有双指针同时向里走的缘故,所以只用一层for)(仍然是花费在了排序的额外空间上)
2024-06-06 20:41:50
318
原创 Leetcode:电话号码的字母组合
回溯的原因是用来暂存结果的容器只能push_back,pop_back,如果不pop_back就会使结果不对。所以直接使用一个定长数组暂存结果,就无需回溯,直接赋值即可。
2024-06-06 20:20:15
280
原创 C++11:列表初始化 && 初始化列表initializer_list && decltype关键字
{10, 20, 30, 40, 50}在正常情况下还是列表初始化,但是当{10, 20, 30, 40, 50}要作为函数参数(printList({10, 20, 30, 40, 50}))或者要赋值给一个自定义类型时,编译器会将{10, 20, 30, 40, 50}构造成一个initializer_list类型的匿名对象(initializer_list{10, 20, 30, 40, 50};) ,然后将该对象向某个函数传参(printList({10, 20, 30, 40, 50})
2024-06-06 19:09:57
1932
原创 Leetcode:最长公共前缀
从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀。用第一个字符串与后续的每个字符串进行比较,先获取S1和S2的最长公共前缀,然后将该次比较获得的最长公共前缀再与下一个字符串进行比较更新,直至循环结束。(其中 m 是字符串数组中的字符串的平均长度,n 是字符串的数量。最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次)
2024-06-04 12:32:45
383
原创 Leetcode:罗马数字转整数
通常情况下,罗马数字中小的数字在大的数字的右边。若输入的字符串满足该情况,累加每个字符对应的数值即可。当前位置表示的元素的值 < 下个位置表示的元素的值,就用总数减去当前位置的值。(XXVII 可视作 X+X+V+I+I=10+10+5+1+1=27)若存在小的数字在大的数字的左边的情况,根据规则需要减去小的数字。(XIV 可视作 X−I+V=10−1+5=14),否则总数加上当前位置的值。
2024-06-04 09:09:49
190
1
原创 Leetcode:整数转罗马数字
为了表示一个给定的整数 num,我们寻找不超过 num 的最大符号值,将 num 减去该符号值,然后继续寻找不超过 num 的最大符号值,将该符号拼接在上一个找到的符号之后,循环直至 num 为 0。最后得到的字符串即为 num 的罗马数字表示。(由于 valueSymbols 长度是固定的,且这 13 字符中的每个字符的出现次数均不会超过 3,因此循环次数有一个确定的上限。(由于 valueSymbols 长度是固定的,且这 13 字符中的每个字符的出现次数均不会超过 3,因此循环次数有一个确定的上限。
2024-06-03 16:44:03
574
1
原创 Leetcode:盛最多水的容器
两个指针指向的数字中较小值∗指针之间的距离。循环列举容器的大小,并留下最大的那个容器。这种写法会超出时间限制,无法通过。
2024-06-03 15:08:31
852
1
原创 Leetcode:正则表达式匹配
1、①和②可以总结为一种情况:当p[j]==s[i] 或者 p[j]==. 为真 且dp[i-1][j-1]为真(两个的末尾都匹配了 或者 p的末尾为.时无论s的末尾为什么字符都能匹配),那么dp[i][j]就为真2、③可以总结为:当 dp[i][j-2] 为真或者 (p[j-1] == '.' || p[j-1] == s[i])一个为真且 dp[i-1][j] 为真,则dp[i][j]为真。
2024-06-02 20:13:23
1259
1
原创 C++哈希的应用:位图 && 布隆过滤器 && 哈希切割
有四十个亿未排序的不重复的无符号整数,此时提供一个无符号整数如何快速判断某个无符号整数是否在这40个亿数中?遍历,时间复杂度为O(N)(先)排序 + 二分查找,时间复杂度为O(logN)(不如位图的原因是排好序后如果进行插入删除麻烦,尤其是很多数时在0下标插入,需要挪动大量的数据,删除同样也要挪动大量数据,即排完序后是很好找,但麻烦在插入和删除,因此对于需要快速判断元素是否存在,并且需要频繁进行插入和删除操作的情况,使用位图是一个更好的选择)位图。
2024-06-01 18:23:44
764
原创 Leetcode:字符串转换整数 (atoi)
①忽略字符串开头的空格,直到遇到第一个非空格字符为止。③继续读取数字字符,直到遇到非数字字符为止。(042的0也会读取,出去的时候会消去)符号时,它会识别这是一个负 / 正数。
2024-06-01 15:10:41
369
原创 Leetcode:Z 字形变换
新建二维数组的行数 = r,列数为 =(n / t)* (r - 1) ,即[r,(n / t)* (r - 1)]当我们在矩阵上填写字符时,会先向下填写 r 个字符,然后向右上继续填写 r−2 个字符,最后回到第一行。Z 字形变换的周期 t = r + r − 2 = 2r − 2。,每个周期会占用矩阵上的1 + (r - 2)= r − 1列。总列数 =总周期数 * (r - 1)总周期数 = n(总字符数)/ t。(一个残缺的斜着的v)
2024-05-31 21:54:45
420
原创 Leetcode:最长回文子串
先确定寻找回文字串的边界范围后从两边向中间寻找。1、记录最长回文字串的长度和起始字符的下标。(两层for循环中还有一个while)2、判断回文字串的逻辑与整体逻辑分离。
2024-05-31 20:22:30
269
原创 Leetcode:无重复字符的最长子串
(为了保证[left,rigth)间不会再有重复字符,如果只是left+1可能还会有重复字符)(此时[left,right)中的字符都是不重复的)
2024-05-30 16:00:35
440
原创 <滑动窗口> 长度最小的子数组
滑动窗口利用单调性,规避了很多没有必要的枚举行为,比如上述案例中在确定一个满足条件的子数组长度后,因为是right继续向后走sum一定会增加且一直大于target,这时还继续向后走统计出一个长度为5的子数组{2,3,1,2,4}是没有必要的,前面已经有了一个长度为4的子数组{2,3,1,2},长度为5甚至是6的子数组肯定不会是最终结果,不枚举也罢。(可能是int left和right,可能是是int *left和*right)+ 可以不回退的同向双指针。(一定是递增或递减的情况)
2024-05-29 16:33:08
390
原创 Leetcode:两数相加
逗号表达式允许多个表达式出现在同一条语句中,每个表达式用逗号分割,逗号表达式的值是最后一个表达式的值,所有表达式都会被执行
2024-05-29 14:19:12
329
原创 Leetcode:两数之和
hashtable[nums[i]] = i的作用是将原数组中的i下标处的数字nums[i]作为键,下标i作为值,如果键存在就更新,键不存在就插入
2024-05-28 14:40:55
454
原创 Leetcode:找出峰值
用于向数组尾部插入新元素用于向数组中得某个位置进行插入,需要传入要插入位置得迭代器只能访问和修改已有元素,不能用于插入元素。
2024-05-28 09:45:07
440
原创 C++的哈希 && 哈希表 && 哈希桶
C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可以达到log_2 N,即最差情况下要比较红黑树的高度次: 当树中的结点特别多且有序时,以红黑树为底层结构的多个关联式容器就显得有些不够用了,为此C++11中又提供了4个unordered系列的关联式容器unordered_map、unordered_set、unordered_multimap、unordered_multiset,它们与之前的map、set、multimap、multiset的使用方式基本类
2024-05-27 00:11:26
2287
原创 C++的红黑树
每一次的调整都可能导致另一次红黑树性质的被破坏cur和parent均为红色是由“新增”或“向上调整”两种原因导致的,因此无论是这两种的哪一种,只有当cur和parent均不为红时才不需要继续调整(循环)红黑树是否调整取决于cur和parent是否均为红,怎么调整取决于叔叔u的情况 + cur是p的哪个孩子
2024-05-23 21:41:17
954
原创 C++的AVL树
因为插入时该结点的bf肯定为0,但是该结点的插入可能会使它的祖先结点的bf产生变化,当某个祖先结点的bf变为2时就需要以该祖先结点为基础进行旋转,通过上述案例我们可以得知不论是RR左旋还是LL右旋,完成插入后和完成旋转后两个状态时,新插入结点的bf第一为0,所以在完成旋转后不需要对该值进行更新从宏观上来看它一直没变。插入新结点必然会导致其父结点的bf产生变化,并可能会导致它的爷爷结点甚至更向上的某个祖先结点的bf发生变化,当某个祖先结点的bf == 2或-2时需要以该祖先结点为基础进行旋转。
2024-05-21 09:21:53
1016
原创 C++的仿函数 && lmabda表达式 && 偏函数
1、仿函数(Functor)又称为函数对象(Function Object)是一个能行使函数功能的类2、每个作为仿函数的类,都必须重载一个或多个函数调用运算符(),这能使得我们几乎可以像调用普通函数那样调用仿函数3、调用仿函数,实际上就是通过类对象调用重载后的(),类对象可以有名也可以是匿名补充:如果编程者要将某种“操作”当做算法的参数,一般有两种方法:将该“操作”设计为一个函数,再将函数指针当做算法的一个参数。将该“操作”设计为一个仿函数,再实例化它的对象,并以此对象作为算法的一个参数。
2024-05-17 15:57:55
453
原创 C++的map和set
multiset的find方法默认查找的是中序的第一个,查找值为x的结点,查找到x的结点后,这个结点的左子树没有值为x结点,它就是中序的第一个值为x的结点。不仅仅是存储数据,一般还可以查找数据,存储的数据和数据间有很强的关联性。单纯的存储数据,存储的数据和数据之间关联度低。
2024-05-17 15:25:14
535
原创 Linux的信号保存 && 信号处理
1、实际执行信号的处理动作(默认、忽略、自定义捕捉)称为信号递达2、信号从产生到递达之间的状态叫做信号未决(pending)3、进程可以选择阻塞(block)某个信号4、阻塞一个信号,那么对应的信号一旦产生,永不递达,一直未,直到主动解除阻塞5、信号的阻塞和未决无关(未决只是要做未做,阻塞是永远不做除非唤醒)6、两张位图 + 一张函数指针数组 = 进程识别信号
2024-05-17 11:49:40
273
原创 Linux的信号量 && PV操作 && 加解锁 && 信号的产生
为了让信号量可以向共享内存一样让不同的进程看到,从而申请与释放,因此信号量也必须是一个共享资源,而作为一个共享资源,信号量除了要保证临界资源的安全外还要保护自己的安全,3、进程对于资源的访问,本质上是通过代码访问的,但并不是所有的代码都会去访问共享资源,即进程中的代码 = 会访问共享资源的代码 + 不会访问共享资源的代码。(A进程申请一个全局生命周期的信号量,那么其它与A进程没有“血缘”关系的进程就不可能看到这个信号量,更别提当其它进程访问临界资源时该信号量能干什么事了)用于释放信号量,将信号量的值加1。
2024-05-16 21:53:11
616
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人