- 博客(28)
- 收藏
- 关注
原创 【C + +】从 C 到 C++:类型转换避坑指南 + 特殊类设计技巧,代码更规范
本文探讨了C++中特殊类设计与类型转换的关键技术。在特殊类设计方面,介绍了禁止拷贝、限定堆/栈创建、不可继承及控制对象数量等模式的实现方法,对比了C++98与C++11的差异。在类型转换部分,系统分析了C风格的隐式/显式转换与C++的四种具名转换(static_cast、reinterpret_cast、const_cast、dynamic_cast),强调其安全优势。同时讲解了RTTI机制(typeid、dynamic_cast、decltype)在运行时类型识别中的应用。文章通过对比表格总结了各类技术的
2025-11-08 16:50:30
1068
14
原创 【C + + 】一文吃透 C++ 智能指针:RAII 思想 + 三大指针 + 实战避坑
本文系统介绍了C++智能指针的核心概念与应用场景。首先剖析了传统指针在异常处理时可能导致的内存泄漏问题,引出RAII资源管理思想。重点讲解了标准库中的四种智能指针:auto_ptr(已废弃)、unique_ptr(独占所有权)、shared_ptr(共享引用计数)和weak_ptr(解决循环引用)。详细分析了shared_ptr的线程安全问题和实现原理,包括引用计数机制和自定义删除器支持。最后提供了内存泄漏的检测工具与防范建议,以及智能指针的适用场景对比表和使用避坑指南。通过智能指针的合理使用,可以有效解决
2025-11-08 16:03:08
1345
3
原创 【C + +】C++11 (下) | 类新功能 + STL 变化 + 包装器全解析
主要是负责“转移”资源,而不是释放资源,编译器假设转移资源并不改变析构时的行为,所以它会继续生成默认析构函数,认为默认的资源释放机制(如自动销毁对象的成员)依然有效。特殊函数之间可能存在依赖或互斥的关系,编译器不会随意地插入可能与用户意图不符的代码,也就导致了当强制生成移动语句,编译器不会默认生成析构函数等与之依赖性强的函数,当你显式定义了析构函数时,编译器会尊重你的选择,不再生成默认的移动构造函数,需要你根据具体的类设计和资源管理策略,决定是否需要自定义移动构造函数。是一个类模板,也是一个包装器。
2025-11-03 21:02:38
1017
2
原创 【C + +】C + + 11(中)——Lambda 表达式 + 可变参数模板
C++11特性详解:Lambda表达式与可变参数模板 本文深入探讨了C++11中的两个核心特性:Lambda表达式和可变参数模板。 Lambda表达式部分详细解析了其语法结构(捕获列表mutable->返回类型{函数体}),六种捕获方式(值/引用/隐式/混合捕获)、mutable关键字的作用(解除值捕获的const限制),以及其在STL算法中的实际应用场景。通过底层原理分析,揭示Lambda本质是编译器生成的匿名仿函数类。 可变参数模板章节介绍了模板参数包(class...Args)和函数参数包(Ar
2025-11-01 11:32:20
1259
8
原创 【C + +】 C++11(上)--列表初始化+右值引用和移动语义详解
本文系统介绍了C++11的核心特性及其发展历程。重点讲解了列表初始化(统一{}初始化方式)、右值引用(区分左值/右值、移动语义)和完美转发三大特性。其中: 列表初始化通过std::initializer_list实现了容器多值初始化; 右值引用配合移动构造/赋值解决了传值返回的深拷贝问题,通过掠夺临时对象资源提升效率; 完美转发使用std::forward保持参数原始值属性。 文章还探讨了类型分类(纯右值/将亡值)、引用折叠规则等进阶概念,并指出C++11虽然新增约140个特性。
2025-10-28 23:06:37
947
115
原创 【C + + 】从源码到实现:哈希表封装 unordered_set 和 unordered_map 全解析
本文介绍了如何基于自定义哈希表实现C++11标准库中的unordered_set和unordered_map容器。主要内容包括:1. 分析SGL-STL30源码中的hash_set/hash_map实现框架;2. 通过模板参数KeyOfT解决哈希表处理不同类型数据的问题;3. 实现哈希表迭代器,支持单向前移操作;4. 复用哈希表完成unordered_set和unordered_map的基本功能,包括insert、find、迭代器等;5. 为unordered_map实现operator[]操作符。
2025-10-25 21:24:43
1437
71
原创 【C + + 】负载因子、哈希函数、冲突解决:C++ 哈希表实现的核心密码
本文深入探讨了哈希表的实现原理及其核心组件。首先介绍了哈希表的基本概念和高效特性(O(1)时间复杂度),对比了其与红黑树结构的性能差异。重点解析了哈希函数设计方法(直接定址法、除留余数法等)和冲突解决策略(开放定址法、链地址法),详细说明了负载因子的计算及其对性能的影响。文章还提供了两种实现方案:开放定址法(含线性探测、二次探测)和链地址法(哈希桶),给出完整代码实现并分析关键操作(插入、查找、删除)的处理逻辑。最后强调了自定义类型转整型的处理方式。
2025-10-25 21:00:42
1191
108
原创 【C + +】unordered_set 和 unordered_map 的用法、区别、性能全解析
本文介绍了C++标准库中的无序关联容器unordered_set和unordered_map。它们与有序容器set/map的主要区别在于使用哈希表作为底层结构,元素无序存储,查找效率平均为O(1)。文章详细讲解了二者的基本操作:插入、查找、删除等,并比较了它们与有序容器的区别,包括底层实现、键值要求、迭代器类型和性能差异。此外,还简要提及了支持键冗余的unordered_multiset/multimap。最后指出哈希冲突可能导致最坏情况下效率退化为O(n),并介绍了负载因子机制。
2025-10-24 19:29:09
2141
109
原创 【C + + 】基于红黑树封装的Map与Set实现过程详解
本文介绍了基于红黑树封装Map和Set的实现方法,重点分析了模板参数的设计原理。主要内容包括: 设计思路:通过红黑树的模板参数区分Map和Set,Map存储键值对(pair<K,V>),Set直接存储键(K)。使用KeyOfT仿函数统一键比较逻辑。 关键改造: 红黑树节点存储泛型T 迭代器支持++/--操作 Insert返回pair<iterator,bool>供Map的operator[]使用 实现Set时T设为const K防止键修改 核心优势: 复用同一棵红黑树实现两种容器 通
2025-10-22 21:14:36
1197
9
原创 【C + +】红黑树:全面剖析与深度学习
本文详细介绍了红黑树的实现原理与操作。红黑树是一种自平衡二叉搜索树,通过节点着色(红/黑)和旋转操作保持平衡。文章阐述了红黑树的五大性质、节点结构定义,重点讲解了插入操作的三种处理情况(变色、单旋+变色、双旋+变色)。通过代码示例展示了红黑树的实现,包括旋转、插入、遍历和平衡检查等功能。最后比较了红黑树与AVL树的性能差异,指出红黑树在频繁插入删除场景下的优势。文章提供了完整的RBTree.h和AVLTree.h实现代码,以及测试用例验证两种树的性能表现。
2025-10-20 18:37:50
2001
6
原创 【C + +】异常处理:深度解析与实战
本文系统介绍了C++异常处理机制,主要内容包括:1. 与传统错误处理方式的对比分析,指出异常机制的优势在于错误信息表达清晰、避免层层传递错误码;2. 通过"外卖点餐"场景类比,说明程序中不同错误类型的处理策略;3. 详细讲解C++异常处理的三个核心关键字(try/catch/throw)及其匹配规则、栈展开机制和重新抛出语法;4. 重点分析异常安全问题,提出RAII资源管理方案;5. 介绍自定义异常体系的实现方法,建议通过继承统一基类来构建层次化的异常类;6. 总结C++标准库异常体系的
2025-10-18 15:56:17
2001
26
原创 【C++】AVL树的平衡机制与实现详解(附思维导图)
本文介绍了AVL树的基本概念、实现原理及操作。AVL树是一种自平衡二叉搜索树,通过平衡因子(左右子树高度差不超过1)确保查找效率(O(logn))。文章详细讲解了AVL树的节点结构、插入操作(涉及单旋和双旋调整)、查找方法、验证逻辑(中序遍历和平衡检查)以及性能分析。针对插入导致的失衡问题,重点分析了四种旋转场景(左单旋、右单旋、左右双旋、右左双旋)的实现细节,并提供了完整代码示例。最后指出AVL树严格平衡的特性使其适合查找密集型场景,但频繁插入删除时维护成本较高。
2025-10-15 04:00:00
1875
14
原创 【C++STL】map与set(举例+详解,一文说懂)!
本文介绍了C++中set和map两种关联式容器的使用。set是key模型容器,用于去重和排序,元素不可修改;map是key-value模型容器,支持通过key快速查找value。重点讲解了容器的构造、插入、删除、查找等操作,以及multiset/multimap允许重复元素的特性。特别分析了map的operator[]实现原理,它巧妙结合了插入和修改功能,可高效实现统计计数等功能。文章通过统计水果出现次数的示例,对比了find和operator[]的不同实现方式,展示了关联式容器在实际问题中的应用价值。
2025-09-29 17:30:00
2374
47
原创 【C++】数据结构——二叉搜索树(详细图解,详细代码实现)
本文介绍了C++中的二叉搜索树(BST)数据结构。首先讲解了二叉搜索树的基本概念和特性:左子树值小于根节点,右子树值大于根节点。随后详细分析了二叉搜索树的实现方式,包括节点类设计、构造函数、拷贝构造函数和析构函数等核心组件。文章还重点讲解了BST的关键操作:插入、查找和删除的算法实现,并区分了key-only和key/value两种使用场景。最后提供了完整的key/value二叉搜索树实现代码,展示了如何应用于实际场景如字典查询和单词统计。文章内容全面,从理论到实践系统地介绍了二叉搜索树的实现与应用。
2025-09-26 08:00:00
2259
32
原创 【C++】深入浅出之多态(举例+详解,一文说懂)!
本文深入探讨了C++面向对象编程中的多态特性。首先介绍了多态的基本概念,即同一方法在不同对象上产生不同行为。文章详细解析了多态的实现条件:必须通过基类指针或引用调用虚函数,且派生类必须重写基类虚函数。重点讲解了虚函数的重写规则、虚函数表机制以及动态绑定的实现原理,并通过多个代码示例展示了多态的实际应用场景。文章还对比了重载、覆盖和隐藏的区别,讨论了抽象类和接口继承的概念,最后通过面试题加深对多态底层机制的理解。全文系统性地阐述了多态从语法到实现的全貌,为C++开发者提供了深入理解多态特性的重要参考。
2025-09-22 08:00:00
3022
80
原创 【C++】深入浅出之继承(一文说懂)
本文系统介绍了C++继承机制的核心概念和应用场景。主要内容包括:1. 继承的基本概念与定义方式,重点讲解了三种访问权限在继承中的变化规则;2. 派生类与基类对象的赋值转换(切片机制);3. 继承中的名称隐藏规则及其解决方法;4. 派生类默认成员函数的实现要点,包括构造、拷贝构造、赋值重载和析构函数的调用顺序;5. 多继承和菱形继承问题,分析了数据冗余和二义性问题及其解决方案(虚继承);6. 对比了继承与组合的优缺点,建议优先使用组合以降低耦合度。
2025-09-21 07:30:00
2135
28
原创 【C++】模版的特化讲解(函数模版和类模版的特化)
C++模板进阶指南:非类型参数、特化与分离编译 本文深入探讨了C++模板编程的三个关键知识点: 非类型模板参数:允许使用常量作为模板参数,常用于静态数组大小指定,仅支持整型和浮点型(C++20)。 模板特化:包括函数模板特化(需先有基础模板)和类模板特化(全特化/偏特化),用于处理特殊类型的特殊情况。 分离编译问题:模板声明与定义分离会导致链接错误,解决方法是将二者统一放在.hpp文件中。 模板虽能提高代码复用性,但可能导致代码膨胀和编译错误信息混乱等问题。掌握这些进阶技巧能显著提升模板使用效率。
2025-09-19 08:00:00
1941
17
原创 【C++】Stack和Queue的底层封装和实现
本文介绍了C++ STL中stack、queue和priority_queue的底层实现与使用方式。通过分析容器适配器设计模式,讲解了三种数据结构分别基于vector、list和deque的模拟实现方法。其中,stack通过vector实现后进先出操作,queue使用list支持先进先出,priority_queue则利用堆算法构建优先队列。重点说明了deque作为默认底层容器的优势,以及自定义类型在priority_queue中需要重载比较运算符的注意事项。文章还对比了不同容器在特定场景下的性能差异。
2025-09-17 08:00:00
2254
22
原创 【C++STL】list的详细用法和底层实现
本文详细讲解了C++ STL库中list容器的实现原理和使用方法。list是一个带头双向循环链表,支持高效的元素插入和删除操作。文章首先介绍了list节点的基本结构,包括数据成员和前驱后继指针的实现。随后重点讲解了list类的构造函数、拷贝构造、赋值重载、析构函数等核心成员函数的实现细节,并分析了迭代器的设计原理及运算符重载。此外,文章还比较了vector和list的排序效率差异,解释了list需要自定义sort函数的原因,并通过迭代器类阐述了封装的概念。最后,文章总结了list相对于vector在随机访问
2025-09-15 18:47:07
2199
6
原创 【C++STL】vector的详细用法和底层原理
本文详细介绍了C++ STL中vector容器的使用方法,包括创建方式、常用成员函数和算法操作。主要内容包括:1. vector的创建方式及初始化方法;2. 迭代器、容量管理、元素访问和修改器等常用函数;3. push_back、insert、erase等元素操作方法;4. sort、unique、reverse等算法操作;5. 查找最值的方法;6. vector扩容机制及优化建议。文章通过代码示例展示了vector的各种用法,并比较了不同操作之间的区别,如push_back与emplace_back的效率
2025-09-14 19:58:14
1512
8
原创 【C++STL】一文总结String类的常用函数用法总结
📝【C++ STL string类使用指南】 本文系统介绍了C++ STL中string类的核心操作: 1️⃣ 初始化:6种构造方式(空串/拷贝/子串/字符填充等) 2️⃣ 访问方式:下标[]、迭代器(正向/反向)、范围for循环 3️⃣ 容量管理:size()/length()、capacity()、reserve()/resize()区别 4️⃣ 常用操作:插入(push_back/insert)、拼接(append/+)、删除(erase/clear)、替换(replace) 。
2025-09-11 19:06:22
1141
8
原创 【C++】模版初阶---函数模版、类模版
本文介绍了C++中的函数模板和类模板,重点讲解了泛型编程的概念与实现方式。函数模板部分包括模板格式、编译原理、实例化方式(隐式/显式)及匹配规则(优先非模板函数);类模板部分涵盖定义格式、实例化特点(必须显式)及与函数模板的区别。文章还解答了三个关键问题:1)两种实例化的区别与应用场景;2)类模板与函数模板的核心差异;3)同名模板与非模板函数的调用优先级。最后强调模板声明与定义必须放在同一文件中,避免链接错误。适合C++开发者理解模板编程基础。
2025-09-10 16:36:36
1334
2
原创 【C++】C/C++内存管理
C++内存管理详解:从基础到高级应用 本文系统介绍了C/C++的内存管理机制,涵盖以下核心内容: 内存分布详解:解析栈、堆、静态区等不同内存区域的特点和使用场景 动态内存管理对比:对比C语言的malloc/free与C++的new/delete机制 高级特性:深入讲解operator new/delete函数、定位new表达式等底层原理 关键区别:总结malloc/free与new/delete在初始化、异常处理等方面的差异 使用规范:强调匹配使用new/delete和new[]/delete[]的重要性
2025-09-09 18:16:04
1251
1
原创 【C++】类和对象(结尾)
本文总结了C++类和对象的核心知识点,主要包括:1)初始化列表的使用规则和注意事项;2)隐式类型转换与explicit关键字的作用;3)静态成员的声明、定义和使用方法;4)友元类和友元函数的特性;5)内部类的定义和访问权限;6)匿名对象的创建和使用场景。文章通过代码示例详细说明了各类特性的使用方法和注意事项,对于理解C++面向对象编程中的关键概念具有重要参考价值。
2025-09-07 22:11:13
1223
1
原创 【C++】六个默认成员函数(下)
本文介绍了C++运算符重载的核心概念。运算符重载通过定义特殊函数(如operator+)为类类型对象赋予运算能力,需遵循特定规则:函数名以operator开头、必须包含类类型参数、不能改变内置运算符含义。重点讲解了流插入/提取运算符(<<、>>)的全局重载方法,需配合友元函数访问私有成员;详细分析了赋值运算符重载的参数传递、返回值优化和自赋值检查;区分了拷贝构造与赋值重载的使用场景;还介绍了const成员函数对this指针的修饰作用,以及取地址运算符重载的注意事项。编译器会为未显式定
2025-09-07 18:41:56
1728
原创 【C++】六个默认成员函数(上)
本文介绍了C++类和对象中的六个默认成员函数,重点讲解了构造函数、析构函数和拷贝构造函数。构造函数用于初始化对象,可以重载,编译器会生成默认构造函数但不处理内置类型成员;析构函数在对象生命周期结束时自动调用,用于资源清理;拷贝构造函数用于对象拷贝,默认生成的是浅拷贝,可能引发问题。文章还通过代码示例展示了这些函数的特性与使用场景,并总结了何时需要显式定义这些函数。最后指出,只有类管理资源时通常才需要自定义这些函数。
2025-09-06 20:14:25
1077
原创 【C++】初识引用
本文主要介绍了C++中的引用、内联函数和nullptr特性。引用是变量的别名,与指针不同它不占用额外内存空间,具有初始化必须、不可更改引用对象等特点,常用于函数参数和返回值优化。内联函数通过编译展开减少函数调用开销,适合短小频繁调用的函数。nullptr是C++11引入的空指针常量,解决了NULL在C++中可能引发的问题。这些特性共同提升了C++代码的效率和安全性,是C++区别于C语言的重要特性。
2025-09-06 11:36:44
1238
1
原创 【C++】初识C++
摘要:本文介绍了C++中命名空间的概念及其应用。命名空间(namespace)用于解决变量、函数或类名冲突问题,特别是在大型项目中或使用库文件时。通过作用域限定符::可访问命名空间中的成员。文章还演示了命名空间的嵌套定义、两种访问方式(指定访问和using展开),并对比了C++的输入输出(cout/cin)与C语言的差异。最后强调实际项目中应避免全局展开命名空间,以保持代码清晰。全文以实例辅助理解,适合C++初学者学习命名空间的基础用法。
2025-09-05 19:40:37
1301
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅