自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

shark_dev的博客

代码无捷径,唯有多练多思考!

  • 博客(58)
  • 收藏
  • 关注

原创 Qt 开发常用控件

本文系统介绍了Qt框架中的常用控件分类及其功能:一、布局控件(垂直/水平/网格/表单布局及间隔控件);二、按钮与容器控件(各类按钮、组合框、滚动区域等);三、视图控件(列表/树形/表格视图);四、输入控件(文本框、数值框、日期选择等);五、显示控件(标签、进度条、图形视图等)。完整涵盖了Qt界面开发中布局管理、用户交互、数据显示等核心功能模块,为Qt应用程序开发提供了全面的控件参考。

2025-11-24 20:32:43 103

原创 C++ 新特性——多线程:std::thread

C++11的std::thread提供了跨平台多线程支持,通过构造函数传入线程函数(普通函数、Lambda或可调用对象)即可创建线程。关键同步方法包括join()(等待线程完成)和detach()(分离线程独立运行)。示例展示了带参数线程函数的创建、耗时操作模拟(sleep_for)以及join/detach的区别:join会阻塞主线程等待,detach则让线程后台运行。使用时需注意,分离线程不能再次join,且要避免访问已销毁对象。建议对需等待的线程使用join,独立任务使用detach。

2025-10-28 11:05:50 313

原创 C++ 新特性——异常处理:exception(头文件 stdexcept)

本文介绍了C++中的异常处理机制,重点讲解了标准异常类如std::exception、bad_cast等的作用。通过dynamic_cast类型转换案例,展示了try-catch块捕获bad_cast异常的具体实现,包括基类与派生类的定义、异常抛出和捕获过程。文章还说明了what()方法获取异常信息的方式,总结了异常处理在保证程序健壮性方面的重要性。该示例帮助理解C++中类型转换时的异常处理机制。

2025-10-28 11:00:26 279

原创 C++ 新特性——条件变量 condition_variable

摘要:C++11的std::condition_variable用于线程同步,结合mutex实现条件等待。当条件不满足时线程阻塞,条件满足时通过notify_all()唤醒。典型应用场景包括生产者-消费者模型。示例展示了5个线程等待ready标志为true后执行的过程。线程生命周期管理需通过join()(阻塞等待)或detach()(后台运行)处理,二者只能选其一且在销毁前必须调用。条件变量机制避免了忙等待,提高了多线程程序效率。

2025-10-28 10:55:07 336

原创 C++ 新特性——std::atomic_flag 应用

std::atomic_flag是C++11提供的免锁原子布尔类型,专为简单同步场景设计。它仅支持test_and_set和clear操作,常用于高效实现自旋锁。示例展示了如何用其构建线程安全临界区:通过test_and_set获取锁(自旋等待),clear释放锁。相比传统互斥锁,std::atomic_flag在低竞争场景性能更优,但功能有限,仅适合基础同步需求。使用时需配合memory_order控制操作顺序,复杂场景建议使用std::mutex等更强大的同步机制。

2025-10-28 10:47:59 353

原创 C++ 新特性——函数对象(Function Object)

C++函数对象是指重载了operator()的类实例,可以像函数一样调用。相比普通函数,它能保存状态;相比函数指针,执行效率更高。示例展示了如何通过函数对象为set容器定义自定义排序规则:定义TestA类存储人员姓名信息,TestB类重载operator()实现按姓氏和名字排序。当TestA对象插入以TestB为排序准则的set容器时,会自动按指定规则排序输出。函数对象结合了数据与行为,在STL操作中提供了比普通函数更灵活高效的解决方案。

2025-10-28 10:39:32 271

原创 C++ 新特性——std::unordered_map 使用详解

摘要:std::unordered_map是C++中的哈希表实现,支持快速查找(O(1))和插入操作。相比std::map,它不维护元素顺序,但具有更高性能。主要操作包括insert/find/erase等,通过键值对存储数据。适合需要快速访问但无需排序的场景,缺点是可能产生哈希冲突并消耗额外内存。示例展示了初始化、合并和遍历unordered_map的基本用法。

2025-10-28 09:37:16 412

原创 C++ 新特性——std::unordered_set 使用详解

C++标准库中的std::unordered_set和std::set是两种不同的集合容器。unordered_set基于哈希表实现,提供O(1)平均时间复杂度的查找和插入,但不保持元素顺序;而set基于平衡二叉搜索树实现,保持元素有序,但查找和插入的时间复杂度为O(logn)。选择依据主要取决于是否需要有序数据:无序高效查找选unordered_set,有序数据需求则选set。代码示例展示了二者在元素存储和输出顺序上的差异。

2025-10-28 09:24:53 341

原创 C++ 新特性——共享内存(Windows 版)

共享内存是Windows系统下高效的进程间通信方式,通过文件映射对象实现物理内存共享。服务端使用CreateFileMapping创建命名内存区域,MapViewOfFile映射到进程地址空间并写入数据;客户端通过OpenFileMapping打开同名对象读取数据。关键API包括创建/打开映射对象、内存映射/解映射和句柄关闭。相比管道和消息队列,共享内存避免了数据拷贝,性能更高,但需要额外同步机制保证数据一致性,适用于需要高速数据共享的场景。

2025-10-28 09:14:18 743

原创 C++ 新特性——关键字nullptr 与 constexpr

C++11引入nullptr和constexpr两个重要特性,分别用于解决空指针二义性和编译期常量问题。nullptr作为专门表示空指针的关键字,解决了NULL在函数重载时的歧义问题;constexpr则允许在编译期计算常量值和执行函数,提高程序效率。这两个特性使C++代码更安全、高效,是现代C++编程的重要工具。实际应用中,建议用nullptr替代NULL,并合理使用constexpr优化性能。

2025-10-28 08:39:20 272

原创 C++ 新特性—— 智能指针(shared_ptr/unique_ptr/weak_ptr)

C++11智能指针(<memory>头文件)提供自动内存管理:1. unique_ptr:独占所有权,不可拷贝但可移动,适用于单一所有权场景;2. shared_ptr:共享所有权,通过引用计数管理内存,适合多对象共享资源;3. weak_ptr:不增加引用计数,配合shared_ptr解决循环引用问题;4. make_shared:推荐创建shared_ptr的方式,效率更高且更安全。三种智能指针分别对应不同资源管理需求,能有效防止内存泄漏。

2025-10-26 22:57:20 568

原创 C++ 新特性——正则表达式

正则表达式是用于匹配文本模式的强大工具,广泛应用于字符串检索和替换操作。它由普通字符(字母、数字)和具有特殊含义的元字符(如^$.等)组成。掌握元字符的功能是使用正则的关键,例如"."匹配任意单字符,""表示前导字符重复任意次。文章详细介绍了各类元字符的含义,并提供了数字、字符、特殊格式(如邮箱、URL、身份证等)的常用校验表达式。通过等价简写规则(如\d等价于[0-9])可简化表达式编写。实际应用中建议先测试简单规则再逐步完善,核心要义是理解"字符+限定符

2025-10-23 21:54:33 1143

原创 C++ 新特性——垃圾回收机制

C++未内置垃圾回收机制的主要原因是出于性能控制和内存管理的灵活性考虑。本文分析了C++采用手动内存管理而非自动回收的原因:减少系统开销、避免额外内存消耗、提供替代方案(如智能指针和RAII)以及类型系统限制。同时介绍了三种经典垃圾回收算法:引用计数(简单但存在循环引用问题)、标记-清除(可处理复杂对象图但需暂停程序)和节点拷贝(避免碎片但需额外内存)。虽然C++没有原生GC,但通过智能指针等技术仍能有效管理内存。

2025-10-17 22:21:53 637

原创 C++ 新特性——容器(array/forword_list/tuple)

摘要:C++11引入了三种新容器:array(固定大小数组)、forward_list(单向链表)和tuple(异构数据容器)。array提供类型安全的固定数组操作;forward_list针对高效内存和头部操作优化;tuple支持存储不同类型元素。文章通过代码示例详细介绍了三种容器的定义、特点及常用方法,并建议根据实际需求(固定大小/频繁插入/混合类型)选择合适的容器类型。

2025-10-17 21:53:34 532

原创 C++ 新特性构造函数全解析(含示例与调用时机)

C++中的构造函数是类初始化的核心机制,主要包括六种类型:1)默认构造函数(无参或全默认参数);2)带参构造函数(自定义初始化);3)拷贝构造函数(对象复制);4)移动构造函数(C++11,资源转移);5)转换构造函数(类型转换);6)委托构造函数(C++11,复用其他构造)。此外还有继承构造函数(派生类复用基类构造)。构造函数选择遵循完全匹配优先原则,应与析构函数配对使用管理资源。最佳实践建议使用初始化列表、explicit关键字,并合理运用现代C++特性提升代码安全性和可维护性。

2025-10-17 21:26:45 932

原创 C++ 新特性——Lambda 表达式

C++11中的Lambda表达式是一种创建匿名函数的便捷方式,语法为捕获列表mutable->返回类型{函数体}。它支持捕获外部变量(值或引用)、自动返回类型推导(C++14)和使用mutable修改捕获变量。示例展示了用Lambda表达式排序vector,相比传统函数更简洁高效。Lambda表达式能提升代码可读性,减少冗余,是STL算法等场景的理想选择,已成为现代C++编程的重要技能。

2025-10-17 20:00:21 250

原创 C++ 新特性——范围 for 循环

C++11引入的范围for循环(range-based for loop)是一种简化遍历操作的语法糖,适用于数组、STL容器、字符串及支持begin()/end()的自定义序列。其基本语法为"for(声明变量:序列)",可使用auto自动推导类型,建议配合const&避免拷贝开销。相比传统for循环,范围for循环具有语法简洁、安全不越界、通用性强等优势,能显著提升代码可读性和编写效率,是现代C++编程中遍历操作的首选方式。

2025-10-17 19:33:08 261

原创 C++ 新特性——类型推导(auto / decltype)

摘要:C++11引入的auto和decltype类型推导特性可自动推断变量类型。auto根据初始化值推导类型(需初始化),decltype分析表达式类型而不执行计算。二者区别在于:auto执行表达式推导,decltype仅分析类型;auto简化变量定义,decltype适用于函数返回值等场景。综合使用能提升模板编程效率,使代码更简洁可维护。注意事项包括auto忽略const/引用修饰、不能用于函数参数等限制。

2025-10-17 19:22:43 263

原创 C++ 指针与引用详解

C++中指针和引用是两种重要的间接访问变量方式。引用是变量的别名,必须初始化且不可更改绑定对象,直接操作原变量;而指针存储地址,可变更指向对象。引用常用于函数参数传递避免拷贝开销,也可作为返回值(需注意生命周期)。两者关键区别在于:引用直接访问变量,指针间接访问;引用不可重绑定,指针可变更指向;引用必须初始化。此外,还介绍了常量引用和三种const指针(常指针、指向常量的指针、常指针常量)的特性及用法差异。掌握这些概念对C++高效编程至关重要。

2025-09-29 22:05:53 653

原创 内联函数(inline)详解

内联函数是C++的优化技术,通过将函数代码直接插入调用位置来减少函数调用开销,提高执行效率。使用inline关键字定义,适用于小而频繁调用的函数。优点包括减少调用时间、提升效率,但可能增加代码体积。编译器根据函数复杂度决定是否内联。适用于简单、无副作用的函数,避免用于复杂或大体积函数。合理使用内联能优化性能,但需权衡代码膨胀问题。

2025-09-29 21:47:52 988

原创 C/C++ 指针详解与各种指针定义

本文系统讲解了C/C++指针的概念与应用,从基础定义到复杂用法逐步深入。主要内容包括:指针的基本概念与作用;各种指针类型的声明方法(如指针数组、数组指针、函数指针等);指针与数组的关系,特别是二维数组的指针运算;函数指针在qsort等场景的实际应用;多级指针的使用场景。文章通过大量示例和规律总结,帮助读者掌握指针这一核心概念,强调理解指针的关键在于从变量名往外读并结合括号优先级,同时提供了二维数组地址运算表等实用工具。

2025-09-28 21:37:12 1156

原创 C/C++ 数据类型选择笔记:int、long long、char、string、float、double

本文系统总结了C/C++常用数据类型的特性和适用场景。int适合常规整数运算(±21亿),longlong用于大整数(±9.2e18)。char可处理字符或小整数(1字节),string用于文本处理。float(4字节/7位精度)适合内存敏感场景,而double(8字节/15位精度)是默认推荐的浮点类型。文章还提供了类型速查表,包括字节数、位数、取值范围和注意事项,帮助开发者根据实际需求选择合适的数据类型,提升代码质量。

2025-09-27 21:26:44 675

原创 C/C++ 常见大数与整数范围详解 —— 0x3f3f3f3f、INT_MAX 与整型边界

本文系统介绍了C/C++中表示无穷大和边界值的常用方法。重点讲解了0x3f3f3f3f作为算法竞赛中"无穷大"常量的优势:数值适中(≈1e9)、相加不会溢出、可用memset快速初始化,适合图论和动态规划算法。同时对比了INT_MAX等标准常量,指出其容易溢出的缺点。文章还提供了常见整型取值范围对照表,强调使用<climits>宏或std::numeric_limits确保跨平台安全。最后建议在算法竞赛中使用0x3f3f3f3f,工程开发中则推荐标准库常量。

2025-09-23 10:24:11 544

原创 C++ 中 abs 函数详解与扩展

本文介绍了C++中计算绝对值的不同方法:整数用<cstdlib>的abs,浮点数用<cmath>的fabs系列。C++11后推荐统一使用std::abs。重点指出了常见错误:混淆abs/fabs、INT_MIN溢出风险、命名空间污染等,并给出使用建议:现代C++优先用std::abs,处理边界值时需谨慎。最后总结了各版本差异,强调统一使用std::abs可避免多数问题。

2025-09-23 10:15:58 768

原创 C++ STL 算法函数 —— next_permutation 与 prev_permutation 详解与应用

C++标准库中的next_permutation和prev_permutation函数用于生成字典序排列。next_permutation按升序生成下一个排列,若已到最大排列则返回false并重置为最小排列;prev_permutation则相反。两者时间复杂度为O(n),常用于全排列生成、搜索优化和栈模拟等问题。使用示例展示了如何遍历所有排列,包括火车进栈等应用场景。相比手写回溯算法,这两个函数能更简洁高效地实现排列枚举。

2025-09-21 15:50:31 450

原创 C语言技巧 | while(~scanf(“%d“,&val)) 循环写法详解

摘要:本文解释了C语言中while(~scanf("%d",&val))这种常见但看似神秘的循环写法。scanf()在成功读取时返回1,遇到EOF返回-1;~运算符对返回值取反,使-1变为0从而终止循环。这种写法等价于while(scanf(...)!=EOF),是一种简洁的持续读取输入直到文件结束的方式。不同平台触发EOF的按键组合不同(Linux/macOS按Ctrl+D,Windows按Ctrl+Z加回车)。该写法通过位运算巧妙地实现了输入循环控制。

2025-09-14 21:18:41 560

原创 带参数的宏(函数式宏)详解

C/C++中的带参数宏是一种预处理指令,通过文本替换实现类似函数的功能。核心语法为#define宏名(参数)替换文本,使用时需注意加括号避免运算符优先级问题。宏支持字符串化(#)和连接(##)操作,可嵌套使用但不进行类型检查。相比函数,宏在预处理阶段展开,无调用开销但缺乏类型安全。典型应用包括简化重复代码、调试打印和动态生成标识符等。使用时需权衡便利性与潜在风险,建议简单功能用宏,复杂逻辑优先使用函数或模板。

2025-09-14 21:15:48 430

原创 C语言运算符笔记:取模 % 与左移 <<

本文总结了C语言中%和<<运算符的用法。%取模运算用于求余数,结果范围小于除数,常用于随机数生成(如rand()%100)和范围限制。负数取模时结果符号与被除数一致。<<左移运算将二进制位左移,等价于乘以2的幂,如1<<2=4。使用1LL避免溢出(如1LL<<(n-1))。这两种运算符在算法、随机控制、位运算和状态压缩中应用广泛,掌握它们能提升编程效率。

2025-09-14 10:13:14 593

原创 位运算笔记整理(求某一位与 lowbit 原理)

本文介绍了位运算中的两个核心技巧:获取二进制数第k位和lowbit运算。1)求第k位数字:通过(n>>k)&1操作实现;2)lowbit运算:使用x&(-x)快速获取最低位的1及其后的0。这些方法在判断奇偶、树状数组等场景中应用广泛,能显著提升算法效率。文章通过原理推导和C++代码示例,展示了这两种位运算的实现方式及应用价值。

2025-09-02 22:25:58 273

原创 双指针算法

双指针算法是一种高效遍历序列的方法,通过两个指针协同移动降低复杂度。主要形式包括:同向双指针(滑动窗口,用于子数组问题)、对向双指针(用于有序数组求和问题)和多序列双指针(用于归并或交集操作)。典型应用包括最长无重复子串、两数之和等。该算法的关键在于指针单向移动,使复杂度降至O(n)或O(n+m)。适用于需要高效处理有序数据或区间维护的场景。

2025-09-01 21:45:43 447

原创 C语言笔记:typedef 和 #define 的区别详解

C语言中typedef和#define的区别主要体现在处理阶段、类型检查和适用场景上。#define是预处理阶段的文本替换,不进行类型检查,常用于定义常量和简单宏;typedef是编译阶段的类型别名,具有类型安全性,适合简化复杂类型声明。typedef更推荐用于提高代码可读性和维护性,而#define在定义常量和条件编译时仍有其价值。核心区别在于:#define是"文本替换",typedef是"类型别名"。

2025-08-31 14:48:19 400

原创 C语言动态内存管理与常用函数总结

本文系统介绍了C语言动态内存管理的核心函数。malloc用于分配未初始化内存,calloc分配并清零内存,realloc调整内存大小(可能移动内存块),free释放内存。同时讲解了内存操作函数:memcpy(非重叠内存拷贝)、memmove(支持重叠拷贝)、memset(内存初始化)。文章特别强调了realloc的三种使用场景和注意事项,并提供了安全使用建议。最后总结了各函数特点,指出内存泄漏检查和野指针处理的重要性。这些函数是C语言高效内存管理的基础,合理使用可提升程序性能和稳定性。

2025-08-31 14:38:03 437

原创 C语言常用输入输出函数总结

本文整理了C语言常用输入输出函数,包括printf/scanf(格式化I/O)、getchar/putchar(字符I/O)、gets/puts(字符串I/O)等,并配有示例说明。重点介绍了各函数功能及使用注意事项,如scanf必须传地址、gets已被弃用、Windows特有函数等。同时解释了缓冲区处理方法和常见错误,帮助开发者正确使用这些函数进行控制台交互和字符串处理。掌握这些基础I/O函数对C语言编程至关重要。

2025-08-31 11:57:31 988

原创 C语言和C++中的函数二义性

本文分析了C和C++语言中函数二义性的差异及解决方法。在C语言中,二义性主要源于函数声明与定义不一致、类型转换不明确等问题;而C++由于支持函数重载,二义性问题更为复杂,常由重载函数、默认参数和类型转换引发。文章提出了避免二义性的实用建议:保持函数声明与定义一致、避免函数名冲突、使用显式类型转换、合理设计重载函数等。通过理解语言特性并遵循这些规则,开发者可以有效减少二义性问题。

2025-08-30 17:27:31 702

原创 C语言中的 assert 函数

C语言中的assert宏是重要的调试工具,用于运行时检查表达式是否为真。当表达式为假时,程序会输出错误信息并终止执行。assert包含在<assert.h>头文件中,语法为void assert(int expression)。它常用于检查函数参数合法性、程序状态等,但会影响性能且不适合生产环境,可通过定义NDEBUG宏禁用。assert在调试阶段能有效发现逻辑错误,提高代码健壮性,是开发者不可或缺的调试助手。

2025-08-30 16:46:14 533

原创 二维差分算法

二维差分是一种高效处理子矩阵操作的算法,通过差分矩阵和前缀和实现O(1)复杂度的区间加法。其核心思想是利用四个关键操作(S[x1][y1]+=c等)标记修改区域边界,再通过二维前缀和还原最终结果。该算法特别适合需要多次修改矩阵子区域的场景,如竞赛题目或图像处理,可将暴力解法的O(n²)时间复杂度优化为O(n²)预处理+O(1)每次操作。实现时需注意差分矩阵的初始化和正确应用前缀和公式来还原结果矩阵。

2025-07-21 19:14:15 565

原创 一维差分算法

本文介绍了一维差分算法及其应用。该算法通过构建差分数组,将区间修改操作优化为常数时间,显著提升处理效率。文章详细解释了差分数组的概念、区间加法操作原理,并通过数轴图示直观展示其工作原理。同时给出了完整的代码实现和示例演示,分析了算法的时间复杂度(O(n+m))及其应用场景(如大规模区间操作、线段树优化等)。一维差分算法能高效处理区间更新问题,在竞赛和实际开发中具有重要价值。

2025-07-21 18:13:36 1277

原创 二维前缀和算法

二维前缀和是一种高效计算子矩阵和的方法。通过预先构建前缀和数组S[i][j],可以快速求出任意子矩阵(x1,y1)-(x2,y2)的和,公式为S[x2][y2]-S[x1-1][y2]-S[x2][y1-1]+S[x1-1][y1-1]。构建前缀和数组的公式为S[i][j]=S[i-1][j]+S[i][j-1]-S[i-1][j-1]+a[i][j]。该方法预处理O(nm),查询O(1),适用于图像处理、地图分析等二维数据场景,能显著提升子矩阵和查询效率。

2025-07-21 17:45:25 589

原创 一维前缀和算法

前缀和是一种高效计算区间和的算法技巧,通过预处理构建前缀和数组S,其中S[i]表示前i个元素的和。核心公式S[r] - S[l-1]可在O(1)时间内求出任意区间和,显著提升查询效率。算法步骤包括构建前缀和数组(O(n)时间)和查询操作(O(1)时间)。适用于频繁区间求和场景,可扩展至前缀积、二维前缀和等变种。典型应用包括LeetCode区间问题、滑动窗口优化等,是算法竞赛和面试中的重要工具。

2025-07-21 17:34:37 356

原创 高精度除以低精度

本文介绍了一个高精度除法模板,用于处理超大整数除以普通整数的场景。该算法将被除数存储为逆序vector<int>,模拟手工除法过程逐位计算商和余数。核心步骤包括:当前余数乘10加当前位,计算商位,更新余数。实现时需注意去除商的前导0和结果逆序处理。该模板适用于竞赛、金融等需要高精度计算的场景,并可与高精度加减乘等运算配合使用。文章提供了完整C++代码和示例演示,帮助理解算法实现过程。

2025-07-18 16:55:50 340

空空如也

空空如也

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

TA关注的人

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