- 博客(145)
- 收藏
- 关注
原创 C++17 其它大杀器
C++17特性解析:提升开发效率的关键升级 C++17在C++11/14基础上,针对日常开发痛点提供了多项重要改进。结构化绑定简化了多值返回的解包操作,代码可读性显著提升;string_view实现字符串零拷贝传递,优化性能;optional/variant/any提供了类型安全的语义表达,替代指针和魔法值;filesystem统一了跨平台文件操作接口;inline变量解决了头文件全局变量问题;嵌套命名空间优化了代码组织;__has_include支持预处理期检查头文件;std::byte强化了内存操作的语
2026-04-03 18:59:35
402
原创 现代C++ | 模板元编程 + std::tuple
摘要:C++11/14/17通过模板元编程(TMP)将模板能力从泛型编程提升到编译期计算维度,实现了零运行时开销的高性能抽象。std::tuple作为TMP的经典应用,解决了多返回值问题,C++17的结构化绑定极大提升了易用性。SFINAE是TMP的核心规则,配合type_traits工具包实现编译期类型检查。TMP通过模板递归、特化等机制在编译期完成计算和代码生成,相比运行时计算具有性能优势。文章详细介绍了TMP的原理、应用场景、实现方式及常见问题,并对比了std::tuple与struct的使用场景,展
2026-04-02 01:21:49
455
原创 现代C++ | C++14甜点特性
C++14作为C++11的补充版本,聚焦于提升开发者的"生活质量",主要解决了C++11中诸多使用不便的细节问题。文章详细介绍了C++14的7个关键改进:1. 函数返回类型自动推导,简化模板函数编写;2. std::exchange实现原子交换操作;3. std::quoted简化字符串引号处理;4. 聚合类型支持默认成员初始化;5. 标准化废弃标记[[deprecated]];6. 变长数组的标准化支持;7. 内存对齐机制的完善。这些改进使代码更简洁、更安全,同时保持了零开销抽象原则。
2026-03-31 23:05:05
408
原创 现代C++ | 并发编程全家桶(std::thread / mutex / async / future 等)
本文全面介绍了C++11到C++17中的并发编程机制,包括线程管理(std::thread)、线程局部存储(thread_local)、互斥锁(std::mutex)及其RAII包装器(std::lock_guard/unique_lock/scoped_lock)、条件变量(std::condition_variable)、异步任务(std::async/future/promise)和无锁编程(std::atomic)等核心组件。重点分析了各种锁的使用场景和性能特点,深入探讨了死锁避免策略和内存序(me
2026-03-31 14:12:59
674
原创 现代C++ | constexpr 全家桶
C++11引入的constexpr特性将编译期计算能力提升到新高度。它允许变量、函数和类在编译期求值,显著提升性能并增强类型安全。C++11版本限制较多,仅支持简单表达式;C++14放宽约束,允许循环、分支和局部变量;C++17加入if constexpr实现编译期分支。该特性使数组大小、模板参数等编译期需求成为可能,替代了晦涩的模板元编程。使用注意事项包括:避免调用非constexpr函数、正确初始化变量、注意递归深度限制等。constexpr既可在编译期也可在运行时执行,取决于参数是否编译期可知。
2026-03-30 01:36:01
379
原创 现代C++ | 完美转发 + 万能引用 + std::forward + 变长模板+ C++17 折叠表达式
摘要:C++11引入右值引用和完美转发机制解决临时对象传递问题。万能引用(T&&)通过引用折叠规则可同时绑定左右值,配合std::forward实现参数原属性传递。变长模板(Args&&...args)处理不定参数,结合完美转发(std::forward<Args>(args)...)可高效转发任意参数。C++17折叠表达式简化了参数包处理,支持一元/二元折叠运算。工厂函数利用这些特性封装对象创建,如std::make_unique通过完美转发实现高效构造,相比直
2026-03-29 13:38:57
406
原创 现代C++ | 右值引用 + std::move + noexcept
摘要:C++11引入移动语义解决临时对象拷贝性能问题,通过右值引用(T&&)实现资源转移而非拷贝。关键点包括:1) 区分左值(持久对象)和右值(临时对象);2) std::move将左值转为右值;3) 移动构造函数需标记noexcept以保证容器操作安全;4) Rule of Five原则管理资源类;5) C++17强制RVO优化,返回纯右值可避免拷贝/移动。移动语义显著提升了返回大对象、容器操作等场景的性能。
2026-03-27 23:22:23
406
原创 现代C++ | 智能指针
C++智能指针发展与应用指南 摘要:本文系统介绍了C++智能指针的发展历程与技术要点。从C++98手动内存管理的缺陷出发,详细解析了RAII机制和智能指针原理。重点讲解了三种核心智能指针:unique_ptr(独占所有权,零开销)、shared_ptr(共享所有权,引用计数)和weak_ptr(解决循环引用)。文章对比了各指针特性,指出auto_ptr因潜在风险已被废弃,强调应优先使用make_unique/make_shared确保异常安全。针对实际开发中的常见问题(如循环引用、所有权转移),提供了具体解
2026-03-26 22:40:34
443
原创 现代C++ | Lambda表达式+函数包装器相关特性
摘要:C++11引入Lambda表达式实现函数式编程风格,核心目标是实现零开销的匿名函数。编译器将Lambda转换为匿名类,捕获变量作为成员,保证性能与手写functor一致。C++14新增初始化捕获功能,支持移动语义和临时对象创建,解决了资源管理和生命周期问题。泛型Lambda允许参数使用auto,增强了通用性。使用时需注意引用捕获的生命周期风险,建议短生命周期用[&],长生命周期用[=]或初始化捕获。Lambda通过编译器生成的闭包类实现,完全保留了C++的零开销抽象特性。
2026-03-25 21:36:44
611
原创 现代C++ | 基础革命特性
C++11现代化改进摘要:C++11针对C++98/03的痛点进行了多项改进,包括:1)类型别名(using)支持模板,替代笨拙的typedef;2)decltype提供编译期精确类型推导;3)auto简化变量声明;4)nullptr取代不安全的NULL;5)统一初始化{}防止窄化转换;6)=default/=delete显式控制特殊成员函数;7)委托和继承构造函数减少重复代码;8)原始字符串字面量解决转义问题;9)static_assert实现编译期检查;10)enum class强枚举防止隐式转换;11
2026-03-25 01:20:32
361
原创 现代C++ | 11/14/17被弃用和被移除的老特性
摘要:现代C++逐步淘汰了C++98/03中不安全、低效或过时的特性。C++17移除了auto_ptr(所有权问题)、random_shuffle(随机质量差)、register关键字(编译器优化更好)、bool自增(语义错误)、三字符序列(兼容性问题)等。这些特性被更安全高效的替代方案取代,如unique_ptr、shuffle、lambda表达式等。移除旧特性旨在强制使用现代C++最佳实践,提高代码安全性和性能,同时保持向后兼容性。
2026-03-24 14:19:01
373
原创 WSL 2 安装ROS2
本文详细介绍了在Windows系统中配置WSL2和Ubuntu22.04环境,并安装ROS2的完整流程。主要内容包括:1)启用Windows子系统功能;2)NVIDIA显卡驱动安装;3)Ubuntu22.04安装;4)使用鱼香ROS脚本一键安装ROS2;5)验证ROS2安装;6)针对独立显卡用户的CUDA环境配置和显卡切换设置。重点解决了WSL2环境下NVIDIA独显的调用问题,通过环境变量设置实现系统自动识别和使用独立显卡。
2026-03-19 11:11:48
1293
原创 C++ | 哈希的应用
本文介绍了位图(bitset)和布隆过滤器的核心应用。位图是C++标准库提供的固定长度二进制位集容器,每个元素仅占1bit,支持高效位操作。文章详细讲解了位图的构造函数、成员函数、运算符和类型转换方法,并通过模拟实现展示了其底层原理。位图在快速查找、海量数据排序去重、集合运算和操作系统磁盘管理等方面有广泛应用,特别适合空间敏感场景。最后以腾讯面试题为例,展示了位图如何用512MB内存高效处理40亿无符号整数的存在性判断问题。
2026-03-18 23:30:07
429
原创 C++ STL | 哈希
哈希是一种高效的数据组织方法,通过哈希函数将关键码映射到存储位置,实现接近O(1)的搜索效率。哈希冲突是不同关键码映射到同一地址的现象,可通过闭散列(开放定址法)和开散列(链地址法)解决。闭散列包括线性探测、二次探测等方法,在表内寻找空位;开散列则将冲突元素组织为链表。哈希函数设计需考虑均匀分布和简单计算,常见方法包括直接定址、除留余数等。哈希表性能受装载因子影响,需适时扩容。开散列实现灵活,是解决冲突的主流方案。
2026-01-30 05:34:31
709
原创 C++ STL | unordered系列容器
本文介绍了C++11中unordered系列关联式容器,重点分析unordered_map的实现原理与使用方式。unordered_map基于哈希表实现,提供O(1)平均复杂度的查询效率,相比红黑树结构的map在查找性能上更具优势。文章详细讲解了unordered_map的构造方法、容量管理、迭代器使用规则、元素访问接口以及增删改查操作,特别强调了哈希表的扩容机制对迭代器有效性的影响。通过对比operator[]和at()的不同特性,以及insert/emplace等插入方式的性能差异,帮助开发者根据实际场
2026-01-29 13:17:51
679
原创 C++ STL | map、multimap
C++中的map和multimap是两种关联容器,用于存储键值对。map保证键的唯一性,按照键排序存储元素,底层使用红黑树实现,查找时间复杂度为O(logN)。它支持多种插入方式(insert、operator[]、emplace等)和查找操作(find、count等)。multimap允许键重复,接口与map类似但不支持operator[]。两者都提供迭代器遍历功能,map适合需要唯一键的场景,而multimap适合键可能重复的情况。使用时需注意迭代器有效性和不同版本C++的特性差异。
2026-01-26 22:03:05
1001
原创 C++ | 红黑树
红黑树的节点跟AVL二叉平衡搜索树的节点有些类似,不同的是,后者是借助平衡因子来判断是否需要调整搜索树,而红黑树则是根据节点的颜色来判断是否需要调整搜索树。{}为什么插入的节点在构造函数这里要处理成红色?如果处理成黑色,则一定导致新插入节点的那条路径多出一个黑色节点,不再满足各个路径黑色节点个数相同的性质,一定破坏性质4,此时很难维护。
2026-01-23 21:51:35
1125
原创 C++ STL | set、multiset
摘要: STL关联式容器包括map/set和unordered_map/unordered_set系列,与序列式容器的区别在于存储<key,value>键值对,采用非线性结构实现高效检索。set基于红黑树实现,元素唯一且有序,插入/查找时间复杂度O(logN);multiset允许重复元素。关键操作包括:insert返回插入状态,find查找元素,erase删除元素,emplace直接构造元素。set适用于需要唯一值排序的场景,multiset适合可重复值排序。两者都支持迭代器遍历,但set的插
2026-01-22 01:02:25
922
原创 C++ | 二叉搜索树、二叉平衡搜索树
摘要: 本文系统介绍了二叉搜索树(BST)和平衡二叉搜索树(AVL)的概念与实现。首先阐述了BST的性质和基本操作(插入、查找、删除),包括K模型和KV模型两种应用场景。然后详细讲解了AVL树的平衡原理,重点分析了四种旋转操作(左旋、右旋、左右旋、右左旋)的实现方法及其应用场景。文章提供了完整的C++实现代码,包括节点定义、插入删除算法、平衡因子调整等核心功能,并介绍了验证AVL树平衡性的方法。最后比较了BST和AVL树的性能特点,指出AVL树在查询效率上的优势及其在频繁修改场景下的局限性。
2026-01-21 00:19:03
841
原创 C++ | 多态
本文深入探讨了C++多态机制的核心概念与实现原理。主要内容包括:1. 多态的分类:静态多态(函数重载/模板)和动态多态(虚函数重写);2. 虚函数机制:虚函数表结构、动态绑定原理及多态实现条件;3. 关键语法:override/final关键字的作用,协变返回值的特殊处理;4. 纯虚函数与抽象类:接口继承特性及标准实现方式;5. 继承体系中的虚表布局:单继承/多继承场景下的虚表结构差异;6. 特殊场景分析:内联虚函数、静态成员函数与虚函数的关系等。文章通过大量代码示例和内存分析,系统性地揭示了C++多态的实
2026-01-16 22:13:14
676
原创 C++ | 继承
本文系统阐述了C++继承机制的核心概念和应用。主要内容包括:1)继承的基本概念与访问控制规则;2)派生类默认成员函数的实现要点;3)继承中的特殊问题(作用域、友元、静态成员);4)多继承与菱形继承问题及解决方案(虚拟继承);5)继承与组合的区别与选择原则。重点分析了继承机制下的内存布局、构造析构顺序等底层原理,并针对菱形继承问题详细解释了虚拟继承的实现机制。文章最后强调应优先使用组合而非继承,避免多继承带来的复杂性。全文通过丰富代码示例深入浅出地展示了C++继承体系的特性与最佳实践。
2026-01-13 14:30:37
829
原创 C++ | 模板
文章摘要:本文系统介绍了C++泛型编程中的模板机制。首先通过交换函数示例引出模板的必要性,详细讲解了函数模板的定义格式、实例化过程(隐式/显式)和参数匹配原则。接着介绍了类模板的定义与实例化,包括全特化和偏特化两种特化方式。针对模板分离编译问题,分析了传统方法的局限性,并对比了C++20 Modules的解决方案。最后深入探讨了typename与class关键字的区别,特别是typename在嵌套依赖类型中的独特作用。文章通过丰富代码示例,全面剖析了模板的优缺点及实际应用场景。
2026-01-09 01:31:14
836
原创 模拟实现stack、queue、priority_queue
摘要: 本文介绍了STL中stack、queue和priority_queue的模拟实现方法。stack和queue作为容器适配器,默认使用deque作为底层容器,通过封装容器接口实现功能。priority_queue的实现需要借助仿函数(less/greater)和堆调整算法(向上/向下调整)。文章详细展示了三个数据结构的类模板实现代码,包括push、pop等核心操作,并通过测试用例验证了实现的正确性。其中priority_queue可根据比较器类型实现升序或降序排列。
2026-01-07 05:37:41
375
原创 C++ STL | 容器适配器
摘要:适配器模式将类接口转换为客户期望的接口。STL中stack和queue是容器适配器,默认使用deque作为底层结构。deque是双端队列,由分段连续空间组成,通过中控数组管理,支持O(1)时间复杂度的头尾操作。相比vector和list,deque在头尾插入删除效率高且空间利用率好,但不适合遍历和中部操作。STL选择deque作为stack和queue的底层容器,因其完美适配这两种数据结构只需固定端操作的需求,避开了deque遍历效率低的缺陷,同时发挥其高效扩容和内存利用率高的优势。
2026-01-07 04:41:51
2455
原创 C++ STL | stack、queue、priority_queue
摘要:本文介绍了C++中的三种容器适配器:stack、queue和priority_queue。stack实现后进先出(LIFO)操作,支持push/pop/top等操作;queue实现先进先出(FIFO)操作,支持front/back/push/pop等操作;priority_queue基于堆结构,默认大顶堆(less<int>),支持top/push/pop操作。文章详细说明了它们的底层容器要求、构造方法和常用接口,并通过LeetCode题目(如最小栈、逆波兰表达式、第K大元素等)演示了实际
2026-01-07 02:52:29
782
原创 模拟实现list容器
老样子,由于迭代器部分的实现需要绕一下脑子,并且和之前vector的模拟实现中的迭代器设计方式不一样,因此我单独把迭代器部分的设计拿出来。要模拟实现c++stl的list容器,首先得知道它是双向带头循环列表,就像下面这张图一样。由于正向迭代器和反向迭代器的++和--的方向不一致,因此单独设计出正向迭代器和反向迭代器。
2026-01-06 18:35:51
230
原创 C++ STL | list
摘要:list是C++中的双向链表容器,支持高效插入删除操作,但无法随机访问。其底层为双向链表结构,每个节点存储前后指针。相比forward_list(单链表),list支持双向迭代但效率略低。主要操作包括:构造空/填充容器、元素增删(push/pop/insert/erase)、迭代器遍历(begin/end/rbegin/rend)、排序(内置归并排序)和拼接(splice)等。list的查找效率较低(需线性遍历),可通过哈希索引或有序索引优化。特殊场景下可采用预排序+二分查找或分桶排序等方案提升性能。
2026-01-06 02:26:14
896
原创 模拟实现vector容器
本文详细介绍了如何实现C++ vector容器的迭代器功能,重点包括正向迭代器和反向迭代器的实现方法。正向迭代器部分通过指针类型定义iterator和const_iterator,提供begin()和end()接口。反向迭代器则封装为独立的Reverse_Iterator类,通过运算符重载实现反向遍历。文章还探讨了迭代器失效问题及解决方案,并展示了insert、erase等关键操作的实现细节。整体实现涵盖了vector容器的基本功能,包括内存管理、元素访问和迭代器操作等核心内容,有助于深入理解STL容器的底
2026-01-05 01:23:29
158
原创 迭代器失效问题
摘要:C++ STL容器和string类在使用迭代器、指针和引用时存在失效风险,可能导致未定义行为。失效分为内存地址移动和元素删除两种情况。string和vector在扩容时所有迭代器失效,部分修改操作会导致局部失效;链表和关联容器仅在被删除节点处失效。建议通过预分配内存、重新获取迭代器或使用链表容器来避免失效问题。不同容器的失效场景差异较大,需根据具体操作类型判断。
2026-01-05 00:43:03
674
原创 C++ STL | vector
摘要:vector是C++中的动态数组容器,支持高效随机访问和动态扩容。它采用连续内存存储元素,通过预分配额外空间来优化插入操作。主要功能包括:构造函数创建空/指定大小的容器;size()/capacity()获取大小/容量;resize()/reserve()调整空间;push_back()/pop_back()进行尾部操作;insert()/erase()实现插入删除;迭代器遍历元素。使用时需注意迭代器失效问题,特别是扩容和删除操作后需要重新获取迭代器。相比其他序列容器,vector在访问和尾部操作上更
2026-01-04 23:30:20
1077
原创 模拟实现string类
本文介绍了如何模拟实现C++的string类,重点讲解了实现过程中的关键点和注意事项。内容包括构造函数、拷贝构造函数的现代写法及其潜在问题,内存管理(如reserve/resize),字符串操作(插入/删除/查找),运算符重载以及流操作等。特别强调了使用memcpy代替strcpy以避免遇到空字符终止的问题,以及在swap操作前必须初始化成员变量等细节。通过实现string类,可以深入理解字符串处理的底层机制,提升编程能力。
2026-01-03 03:50:37
197
原创 从C到C++ | string类
本文详细介绍了C++中string类的核心用法,包括成员类型定义、常用构造函数、增删查改操作、元素访问方法以及与其他字符串类型的转换。重点讲解了迭代器使用、容量管理函数(resize/reserve)、字符串比较(compare)、子串提取(substr)等关键功能,并分析了c_str()与data()的区别及getline()函数的使用注意事项。通过大量代码示例展示了string类的各种操作方法,帮助开发者全面掌握这一重要的字符串处理工具。
2026-01-03 02:32:32
925
原创 从C到C++ | 内存管理
本文深入解析了C/C++程序的内存分布及动态内存管理机制。首先介绍了栈(向下增长)、堆(向上增长)、数据段、代码段等内存区域的特点,并通过代码示例展示了变量在不同区域的存储位置。随后详细对比了C语言(malloc/calloc/realloc/free)和C++(new/delete)动态内存管理方式,重点阐述了new/delete自动调用构造/析构函数的特性及其与malloc/free的本质区别。文章还探讨了定位new表达式、new[]与delete[]必须配对使用的原因,以及错误释放内存的严重后果,最后
2025-12-26 16:45:52
1002
原创 时间类的实现
摘要:本文实现了一个日期类Date,包含年、月、日属性和各种操作符重载。主要功能包括:日期合法性检查、获取月份天数、日期比较运算(>,<,==等)、日期加减运算(+=,-=,+,-)、自增自减运算(++,--)、日期差值计算以及流操作符重载(<<,>>)。通过静态数组存储各月天数,并处理闰年情况。所有运算都确保日期合法性,非法输入会触发断言。该类封装了完整的日期处理功能,支持自然语法的日期运算和IO操作。
2025-12-26 08:06:36
204
原创 从C到C++ | 类和对象(下)
本文介绍了C++中构造函数初始化列表与构造函数体的区别,强调初始化列表才是真正的初始化操作,而构造函数体属于赋值操作。重点说明了必须使用初始化列表的三种情况:引用成员、const成员和没有默认构造函数的类成员。文章还探讨了成员变量初始化顺序与声明顺序的关系,以及为什么推荐使用初始化列表(效率更高、逻辑更清晰)。此外,还介绍了explicit关键字的作用(禁止隐式转换)、static成员的特性(类级别共享)、友元函数/类的使用场景,以及内部类的概念和特性。这些知识点对理解C++对象初始化和类设计有重要意义。
2025-12-26 07:59:28
1021
原创 从C到C++ | extern关键字
摘要:extern关键字在C/C++中主要有三种用途:1. extern "C"用于解决C++和C语言之间的函数名兼容问题,通过禁止C++的名称修饰实现互调;2. extern修饰函数/变量声明,表示其定义在其他文件中,实现多文件共享;3. extern "C"修饰变量使C++变量按C规则处理,实现跨语言变量访问。其中extern "C"与函数重载冲突,使用时需注意声明与定义的区别,推荐通过条件编译编写兼容头文件。extern声明变量时需严格区分声
2025-12-26 07:09:06
1043
原创 从C到C++ | 类和对象(中)
本文介绍了C++类中的6个默认成员函数:构造函数、析构函数、拷贝构造函数、赋值运算符重载、取地址操作符重载和const取地址操作符重载。重点分析了前四个函数的特性和使用场景:构造函数负责对象初始化,支持重载;析构函数在对象销毁时自动调用,用于资源清理;拷贝构造函数实现对象复制,需注意深浅拷贝问题;赋值运算符重载使自定义类型支持运算符操作。文章通过日期类示例说明了这些函数的实际应用,并指出编译器会自动生成默认版本,但对于需要管理动态资源的类,通常需要自定义实现。最后简要介绍了const成员函数和取地址操作符重
2025-12-26 05:58:28
820
原创 踩坑记录 君正T23移植RTL8189FTV
解读代码,MMC0.removal的值为REMOVABLE,而MMC1.removal的值为MANUAL,上面说了SDIO_WiFi口是接在了MMC0上,而君正T23默认是接在了MMC1上,这下说得通了,首先查看原理图,因为板子是公司自己设计的,SDIO_WiFi口是接在了MMC0上,而君正T23默认是接在了MMC1上,因此修改了jzmmc_manual_detect()函数的第一个参数。上面说了SDIO_WiFi口是接在了MMC0上,而君正T23默认是接在了MMC1上,因此极大可能是还有地方没修改完。
2025-03-28 09:21:23
1110
原创 踩坑记录 编译WiFi驱动出现重定义,但是检查有没问题
把函数定义从头文件移到源文件(例如ie80211.c)里,然后在头文件中只保留函数声明。// 只保留函数声明// 函数定义。
2025-03-19 11:48:03
415
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅