- 博客(87)
- 收藏
- 关注
原创 c++ 右值引用&移动构造函数
本文展示了C++移动语义的实现与测试。通过自定义MyStr类,演示了移动构造函数和移动赋值运算符的实现方法:1) 移动构造函数通过接管资源指针避免深拷贝,并将原对象置空;2) 移动赋值运算符先释放当前资源再接管新资源。测试代码验证了右值引用、std::move强制转移和函数返回值优化等情况,展示了资源所有权转移过程。输出结果证实移动语义成功实现,有效避免了不必要的资源复制,提高了程序效率。
2025-06-14 22:22:06
70
原创 LeeCode 73. 矩阵置零
摘要:本文介绍了一个将矩阵中零元素所在行和列全部置零的算法。使用两个辅助数组zeroRows和zeroRols标记需要置零的行列,空间复杂度为O(m+n)。算法首先遍历矩阵记录零元素位置,然后根据标记数组更新矩阵。测试案例展示了3x3矩阵的处理过程,输出结果为[[1,0,1],[0,0,0],[1,0,1]]。该解法满足原地操作要求,但仍有优化空间可达到常数空间复杂度。
2025-06-14 14:52:36
170
原创 c++ std::function
摘要:该代码演示了C++中std::function的多种用法。通过定义接收两个int参数并返回int的函数对象,展示了如何绑定普通函数(addFunc)、lambda表达式({return a-b;})、类成员函数(Calculator::sub)、静态成员函数(Calculator::staticFuncAdd)以及仿函数(Divider::operator())等不同可调用对象。测试结果显示:9526+1=9527,9528-1=9527,0-1=-1,1+1=2,10/3=3。代码成功验证了std:
2025-06-13 21:25:32
413
原创 c++ std::invoke
本文展示了C++中invoke函数的多态调用能力,通过代码示例演示了多种调用方式:1)调用普通函数getMinAndMax比较数值;2)调用MyStru类的成员函数和静态方法;3)使用lambda表达式输出字符串;4)通过智能指针调用;5)修改类成员变量;6)调用仿函数Functor。测试结果成功打印"ok",验证了invoke函数在统一调用语法方面的灵活性,能处理函数指针、成员函数、lambda等多种可调用对象。
2025-06-11 21:18:23
244
原创 c++ std::pair
本文展示了C++中std::pair的多种应用场景:1)作为函数返回值返回多个数据,可嵌套使用;2)作为map的键值对元素,演示了三种插入方式;3)在vector中存储多个属性并实现不同排序(默认按first升序或自定义按second降序);4)配合STL算法find_if实现条件查询。测试代码包含获取最小值/最大值、存储武功名称及武力值等示例,展示了pair在数据组合、排序和筛选方面的灵活性。输出结果验证了各项功能的正确性。
2025-06-08 17:37:35
340
原创 c++ decltype关键字
摘要:本文介绍了C++11的decltype关键字用于类型推导的多种用法。通过示例展示了:1)基本变量类型推导;2)表达式类型推导(不实际计算表达式);3)函数返回类型推导;4)引用类型推导;5)在模板编程中的应用,包括函数模板返回类型推导和类模板成员类型推导。特别演示了如何用decltype推导容器迭代器类型,并实现迭代器操作。这些用法体现了decltype在编译期类型推导上的灵活性,为现代C++模板元编程提供了重要支持。
2025-06-08 15:49:13
175
原创 c++ 静态成员变量
摘要:该代码展示了一个Student类的实现,包含name和score成员变量以及一个静态变量totalScore。构造函数累加学生分数到总成绩,析构函数输出销毁信息,print()方法显示学生信息和总分。测试代码创建两个学生对象并输出结果,验证了静态成员变量属于类且在全局数据区分配内存的特性。程序最终输出学生信息和总分为140分(60+80)。
2025-06-07 18:16:35
281
原创 c++ 单例模式
摘要:该代码实现了C++11线程安全的单例模式,通过静态局部变量方式确保唯一实例。MySingleton类将构造函数设为私有并禁用拷贝操作,提供静态getInstance()方法获取实例。成员函数包括设置/打印年龄值和析构函数。测试代码验证了单例特性,同一实例在不同引用下保持数据一致性,正确输出设置的值9527。实现符合预期,展示了现代C++单例模式的推荐写法。
2025-06-07 17:29:52
510
原创 c++ 赋值函数和拷贝构造函数的调用时机
摘要:测试代码展示了C++中拷贝构造函数和赋值运算符的区别。拷贝构造函数在对象初始化(如Dog d3(d2))或Dog d4=d3时调用,用于创建新对象;赋值运算符(如d1=d2)用于已存在对象的赋值操作。关键区别在于:拷贝构造函数创建并初始化新对象,而赋值运算符修改已有对象的值。调用时机还包括值传递参数、返回对象和异常处理时(拷贝构造),以及对象已存在时的赋值操作。
2025-06-02 21:13:54
251
原创 java Semaphore
摘要:Java Semaphore(信号量)用于控制并发线程访问资源的数量。示例模拟6人使用2个坑位的厕所场景,通过Semaphore(2)限制同时使用人数。线程获取许可(acquire)后占用资源,使用完毕释放许可(release)。测试结果显示资源访问有序,符合并发控制预期。(135字)
2025-06-02 17:59:49
213
原创 java CountDownLatch
CountDownLatch是Java中用于线程同步的工具类,它允许一个或多个线程等待其他线程完成操作后再执行。核心机制是通过计数器实现:初始化时设定线程数量,每个线程完成时调用countDown()减少计数,当计数器归零时唤醒等待线程。示例展示了5个线程并发执行,主线程通过await()等待它们全部完成。CountDownLatch是一次性工具,不可重置。与CyclicBarrier不同,后者支持重复使用。该工具适用于需要等待多个前置任务完成的场景,如批量任务处理或初始化操作。
2025-06-01 22:48:24
225
原创 LeeCode 102.二叉树的层序遍历
本文介绍了二叉树的层序遍历实现方法。通过使用队列数据结构,首先将根节点入队,然后循环处理每一层的节点:记录当前层节点数,依次取出节点并将值存入结果,同时将子节点入队。代码包含TreeNode结构定义和Solution类的levelOrder函数实现,使用队列逐层遍历并保存节点值。测试代码展示了构建二叉树和打印层序结果的过程。文章还指出一个常见错误:直接使用队列front()的引用可能导致悬空指针问题,应改为值拷贝方式获取节点。
2025-06-01 13:35:08
285
原创 c++ 类型转换函数
摘要:代码演示了C++类型转换函数的用法。Distance类通过定义operator int()实现自动类型转换,将meters成员变量转为int。测试中,Distance对象与整数10相加时自动调用转换函数,输出"调用了类型转换函数",最终打印结果9527。该机制实现了类类型与基本类型间的隐式转换。
2025-06-01 12:08:07
181
原创 c++ 异常处理
本文摘要:代码演示了C++异常处理机制。首先自定义MyException类继承std::exception,利用using继承父类构造函数。接着定义Divide结构体重载()运算符,当除数为0时抛出异常。测试中尝试计算10/0,捕获MyException异常并输出"不能除0"的错误信息,同时展示了catch(...)处理未知异常的用法。该示例完整展示了异常定义、抛出和捕获的全过程。
2025-06-01 11:40:53
142
原创 LeeCode 98. 验证二叉搜索树
摘要:本文介绍了如何验证一个二叉树是否为有效的二叉搜索树(BST)。根据BST定义,节点的左子树值必须小于当前节点,右子树值必须大于当前节点,且所有子树也必须是BST。解决方案采用中序遍历将节点值存入数组,然后检查数组是否为严格升序排列。测试案例验证了该方法,当输入树为[1,2,3]时返回true,符合BST特性。时间复杂度为O(n),空间复杂度为O(n)。
2025-05-31 22:15:08
303
原创 c++ typeid运算符
摘要:typeid运算符用于获取类型信息,返回不可拷贝的type_info对象,提供了name()、raw_name()和hash_code()等成员方法。测试显示,它能获取变量、类型、字面量、对象、结构体和表达式的类型信息。typeid支持类型比较,包括基本类型(int、char等)和类类型(包括继承关系),比较结果准确反映类型关系。需要注意的是,指针类型和其指向的类型会被区分,多态情况下会识别实际指向的对象类型。
2025-05-31 21:29:31
245
原创 c++ 模板
摘要:本文展示了C++模板的基本用法,包含一个函数模板my_max用于比较最大值和一个类模板MyStack实现栈结构。测试代码演示了模板的使用:调用my_max比较整数,创建MyStack实例并进行入栈出栈操作。注意模板通常定义在头文件中,模板参数T的作用域仅限于定义它的模板。输出结果验证了模板功能的正确性。
2025-05-30 21:55:42
273
原创 c++ 类型转换
摘要:测试代码演示了C++中向上转型(派生类赋值给基类)的行为。当Sub类对象转为Base类后,调用的是基类的print()方法。使用static_cast将base指针转回Sub*后,仍调用基类方法,且子类成员变量age值丢失(显示随机数)。这表明向上转型会丢失派生类特有信息,即使强制转回也无法恢复原有数据和行为。
2025-05-30 20:47:24
238
原创 LeeCode 94. 二叉树的中序遍历
本文介绍了二叉树的中序遍历实现。中序遍历顺序为左子树-根节点-右子树。给出了递归解法代码:当节点非空时,递归遍历左子树,保存节点值,再递归遍历右子树。测试示例展示了构建简单二叉树(1→2←3)并输出遍历结果[1,3,2]。文章提示树节点数范围为[0,100],节点值在-100到100之间,并建议尝试用迭代算法实现作为进阶练习。代码通过leetcode测试,验证了正确性。
2025-05-28 21:30:43
210
原创 c++ 拷贝构造函数
摘要:测试类拷贝构造函数的深浅拷贝问题。默认拷贝构造函数(浅拷贝)会导致指针成员指向同一地址,析构时重复释放内存报错。自定义拷贝构造函数实现深拷贝,为字符串分配新内存并复制内容,使不同对象拥有独立字符串副本,解决了重复释放问题。演示了值类型成员(int)自动值拷贝而指针类型需要手动深拷贝的必要性,确保了析构安全。
2025-05-28 20:53:56
222
原创 java 动态代理
这篇文章演示了Java动态代理的实现。通过Proxy类和InvocationHandler接口,作者创建了一个日志代理,在不修改原始IUserService实现的情况下,为方法调用添加了执行时间统计功能。示例展示了动态代理的两个关键应用:1)方法拦截处理;2)业务无侵入增强(如日志、性能监控)。文章指出动态代理有利于业务解耦,但会带来反射性能损耗。
2025-05-25 20:23:18
184
原创 LeeCode 110. 平衡二叉树
【摘要】判断二叉树是否为平衡二叉树(每个节点的左右子树高度差不超过1)。通过递归计算子树高度,比较左右子树高度差。若所有节点都满足高度差≤1的条件,则返回true。示例代码实现了该算法,通过getHeight()获取节点高度,isBalanced()递归检查平衡性。时间复杂度O(n^2),空间复杂度O(n)。测试用例验证了算法的正确性。
2025-05-24 21:11:06
135
原创 c++ constexpr关键字
constexpr是C++中的关键字,用于指示编译器在编译时计算表达式的值,确保其值在编译时即可确定。它可以修饰变量和函数,要求函数在编译时能够求值,且参数必须是编译时常量。例如,constexpr int size = 9527;声明了一个编译时常量。constexpr函数如factorial可以在编译时递归计算阶乘,结果可用于数组大小等编译时场景。与const不同,const仅保证运行时不可修改,而constexpr则强制编译时求值,提升性能并确保代码的确定性。
2025-05-23 20:40:50
252
原创 LeeCode.290 单词规律
给定一个模式 pattern 和一个字符串 s,判断 s 是否遵循 pattern 的规律。规律要求 pattern 中的每个字符与 s 中的每个单词之间必须存在双向的一一对应关系。例如,pattern = "abba" 和 s = "dog cat cat dog" 匹配,因为 a 对应 dog,b 对应 cat。如果 s 中的单词与 pattern 的字符不匹配,则返回 false。通过使用两个哈希表分别记录字符到单词和单词到字符的映射,可以确保双向对应关系的唯一
2025-05-21 20:16:13
184
原创 LeeCode 101.对称二叉树
要检查一个二叉树是否轴对称,可以通过递归或迭代的方法实现。本文提供了一个基于迭代的解决方案,使用队列来逐层比较树的节点。具体步骤如下:首先将根节点的左右子节点加入队列,然后依次取出队列中的两个节点进行比较。如果两个节点都为空,则继续;如果其中一个为空或节点值不相等,则树不对称。接着将左节点的左子节点与右节点的右子节点、左节点的右子节点与右节点的左子节点依次加入队列,继续比较。最终,如果队列为空且所有节点都匹配,则树是对称的。该方法的时间复杂度为O(n),空间复杂度为O(n),适用于节点数在1到1000之间的
2025-05-18 21:44:45
196
原创 c++ 仿函数
文章摘要:示例代码展示了如何使用C++中的仿函数(Functor)。通过定义一个结构体MyStruct并重载()运算符,可以创建一个仿函数Sum。仿函数可以像普通函数一样被调用,代码中sum(9528, -1)即实现了两个整数的相加操作,并输出结果。仿函数的核心在于重载()运算符,使其具备函数调用的行为。
2025-05-17 20:57:29
288
原创 c++ 运算符重载
头文件MyVec.h定义了一个二维向量类MyVec,包含两个私有成员变量x和y。类中重载了加法运算符+、减法运算符-、输出运算符<<和下标运算符[]。源文件MyVec.cpp实现了这些运算符重载,其中加法运算符返回两个向量的和,减法运算符返回两个向量的差,输出运算符用于格式化输出向量,下标运算符用于访问向量的元素。测试代码展示了如何使用这些重载运算符,包括向量的加法、输出和元素访问。最终输出结果为(5,2),表示向量v3的x和y值分别为5和2。
2025-05-17 16:53:15
274
原创 c++ 友元函数
该代码展示了C++中友元函数的使用。头文件TestCls1.h定义了一个类TestCls1,其中包含两个私有成员变量x和y,以及两个公有成员函数setX和setY用于设置这些变量。此外,声明了一个友元函数printTestCls1,该函数可以访问TestCls1的私有成员。源文件TestCls1.cpp中实现了printTestCls1函数,用于打印TestCls1对象的私有成员。测试代码中创建了一个TestCls1对象,并通过友元函数打印其私有成员的值。友元函数不是类的成员函数,因此没有this指针,但可
2025-05-17 16:15:05
262
原创 c++ 类的语法4
文章通过代码示例测试了C++中的析构函数、虚函数和纯虚函数的行为。首先,定义了一个包含构造函数、析构函数、虚函数和纯虚函数的父类Parent,以及一个继承自Parent的子类Child。子类Child重写了父类的虚函数和纯虚函数,并在构造函数中初始化了子类的成员变量。通过创建Child对象并调用其方法,展示了虚函数和纯虚函数的多态性。最后,文章指出析构函数的调用顺序与构造函数相反,并类比了纯虚函数与Java中的抽象方法的相似性。
2025-05-16 21:35:03
224
原创 c++ 类的语法3
在C++中,如果类没有显式定义构造函数,编译器会自动生成一个默认构造函数。然而,当类中包含无法默认构造的成员变量时,编译器将无法生成默认构造函数,导致编译错误。例如,在testClass3中,Demo类没有显式定义构造函数,编译器为其生成了默认构造函数,但未初始化的局部变量demo1会导致错误。在testClass4中,Demo类没有默认构造函数,因此Parent类无法生成默认构造函数,必须通过初始化列表显式初始化成员变量demo,才能成功编译。这表明,当类成员无法默认构造时,必须显式定义构造函数并初始化成
2025-05-16 20:03:23
360
原创 c++ 类的语法2
本文通过两个示例演示了C++中类继承的访问权限和构造函数调用机制。在第一个示例中,子类PublicExtend通过public继承父类Base,子类可以访问父类的public和protected成员,但无法直接访问private成员,需通过父类的getZ函数获取。子类实例化时自动调用了父类的无参构造函数。第二个示例中,子类和父类都有无参构造函数,子类构造函数未显式调用父类构造函数时,编译器会自动调用父类的默认无参构造函数。总结:子类继承时,成员变量的访问权限取决于继承方式,子类实例化时会自动调用父类的默认构
2025-05-11 21:16:00
263
原创 LeeCode100. 相同的树
要判断两棵二叉树是否相同,可以通过递归的方式比较它们的结构和节点值。首先,如果两个节点都为空,则它们相同;如果其中一个为空而另一个不为空,则它们不同。如果两个节点都不为空,则比较它们的值,并递归地比较它们的左子树和右子树。如果所有比较都通过,则两棵树相同。代码实现中,isSameTree函数通过递归调用自身来完成这一过程。测试代码展示了如何使用该函数来比较两棵树,并输出结果。
2025-05-10 20:51:13
216
原创 java volatile关键字
volatile是Java中用于确保多线程环境下变量可见性和禁止指令重排序的关键字。未加volatile修饰的普通变量在多线程环境中可能存在可见性问题,即一个线程对变量的修改可能无法被其他线程及时感知。通过代码示例可以看出,未加volatile修饰的变量intVal在线程1中可能永远无法检测到线程2对其值的修改。而加上volatile修饰后,线程1能立即感知到intVal值的变化。需要注意的是,volatile适用于单变量状态标记,但不能保证复合操作(如自增)的原子性,需结合同步机制或原子类使用。
2025-05-09 20:56:52
310
原创 java CyclicBarrier
另外, java的并发工具类还有CountDownLatch 、Semaphore。CountDownLatch为计数器闭锁,等待多个任务完成(如主线程等待子任务全部结束)。Semaphore为信号量,控制同时访问资源的线程数量(如限流场景),当信号量设置为1时可以代替同步锁。CyclicBarrier是一种在多线程编程中使用的同步机制,协调多个线程之间的执行。CyclicBarrier的字面意思是“循环屏障”,意味着当所有线程都到达这个屏障时,它们会一起继续执行。
2025-05-07 21:17:43
221
原创 java ReentrantLock
另外,还可以和条件变量(Condition)配合,实现线程间协调,可代替wait()/notify() ,代码略。可以替代 synchronized .
2025-05-07 20:22:11
240
原创 java CompletableFuture 异步编程工具用法2
该工具类适用于并行任务或流水线任务,还可以设置任务超时的处理。但需尽量避免阻塞(用thenAccept代替get方法)。另外,不适合高并发场景,防止默认线程池资源竞争。CompletableFuture 用于简化多线程任务的编排和结果处理.
2025-05-07 19:50:07
215
原创 java Optional
静态方法of ,生成Optional对象, 但这个value不能为空,因为构造器判断value为空直接抛异常。7、flatMap方法,同map,但会检查转化后的数据是否为空,转化为null会抛异常。4、ifPresentOrElse方法, 值非空时执行一个操作,否则执行另一个操作。1、get方法,value确定非空再调用该方法,可以强制开发处理空值。10、orElseGet ,获取值,值为null则生成一个值。5、filter 方法,判断值是否满足一个条件。支持链式调用,可与方法引用配合使用,比较方便,
2025-04-27 21:44:02
225
原创 java函数式接口与方法引用
典型的内置函数式接口有Runnable、Consumer、Supplier、Function、Predicate。也可以自定义函数式接口。函数式接口可以和方法引用配合起来使用。这里拿Runnable接口为例写几个测试代码看怎么用的。函数式接口指的是,一个interface, 只含有一个抽象方法。函数式接口可以加上@FunctionalInterface注解,加上这个注解后编译器会检查接口是否满足函数式接口的规范,不满足规范则直接编译不过。
2025-04-26 20:48:33
196
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人