
C++
文章平均质量分 97
分享C++知识
云边有个稻草人
支付宝开发者社区优秀季度创作博主,腾讯云创作之星,AWS 认证人工智能从业者,极星会KOL
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【C++】第二十八节—一文详解 | 智能指针的使用及其原理
本文介绍了C++智能指针的概念、原理及应用。主要内容包括:1. 智能指针的使用场景分析,通过示例展示手动管理内存的缺陷;2. RAII设计思想与智能指针实现原理,包括auto_ptr、unique_ptr、shared_ptr和weak_ptr的特点;3. 标准库智能指针的使用方法和注意事项;4. shared_ptr循环引用问题及weak_ptr的解决方案;5. 内存泄漏的危害及检测方法。文章通过代码示例详细讲解了各种智能指针的实现原理和使用方法,重点强调了RAII思想在资源管理中的重要性,并提供了解决常原创 2025-09-02 17:36:24 · 1090 阅读 · 59 评论 -
【C++】第二十七节—C++11(下) | 可变参数模版+新的类功能+STL中一些变化+包装器
本文介绍了C++11中可变参数模板的基本概念和使用方法,包括参数包的声明、扩展方式以及在实际编程中的应用。文章详细讲解了可变参数模板的原理,通过编译时实例化处理不同数量和类型的参数。同时介绍了std::function包装器和bind适配器的使用,它们可以统一处理函数指针、仿函数、lambda等可调用对象。此外还探讨了C++11新增的移动语义、emplace系列接口等特性,并通过具体代码示例展示了这些新特性的实际应用场景,帮助开发者编写更高效灵活的泛型代码。原创 2025-08-30 17:58:26 · 1568 阅读 · 85 评论 -
【C++】第二十六节—C++11(中) | 右值引用和移动语义(续集)+lambda
我是,C++领域博主与你分享专业知识(*^▽^*)上节总览本节总览(4)右值引用和移动语义在传参中的提效6. 类型分类7. 引用折叠8. 完美转发四、lambda1. lambda表达式语法2. lambda的应用3. 捕捉列表4. lambda的原理接着上节,正文开始——原创 2025-08-25 16:22:48 · 1281 阅读 · 42 评论 -
【C++】第二十五节—C++11 (上) | 详解列表初始化+右值引用和移动语义
本文深入讲解了C++11的重要特性,主要包括列表初始化和右值引用两大核心内容。在列表初始化部分,详细介绍了C++98传统{}初始化、C++11统一初始化方式以及std::initializer_list的实现原理,通过代码示例展示了如何利用这些特性简化容器初始化。右值引用部分重点剖析了左值/右值的区别、右值引用的语法规则及其应用场景,特别是移动构造和移动赋值如何通过"窃取"资源而非拷贝来提高效率。文章通过大量代码示例和内存分析图,生动演示了右值引用在解决传值返回问题时的优化效果,包括编译原创 2025-08-22 00:55:26 · 1407 阅读 · 64 评论 -
【C++】第二十四节—用哈希表封装unordered_set和unordered_map
本文详细讲解了如何基于哈希表实现C++中的unordered_map和unordered_set容器。首先分析了SGI-STL30版本的哈希表源码框架,指出unordered_map和unordered_set是C++11后才加入的标准容器。然后逐步实现了复用哈希表的框架,包括支持insert操作、迭代器功能以及map的[]运算符重载。文章提供了完整的代码实现,包括HashTable.h、MyUnorderedMap.h和MyUnorderedSet.h三个核心文件,并详细解释了迭代器实现的关键点,如ope原创 2025-08-18 23:14:51 · 939 阅读 · 10 评论 -
【C++】第二十三节—unordered_map和unordered_set的使用+哈希表实现
本文介绍了C++中unordered_map和unordered_set的使用与哈希表实现原理。主要内容包括:1) unordered_set和unordered_map的接口特点,与set/map相比在key要求、迭代器特性和性能上的差异;2) 哈希表的核心概念如哈希函数、冲突处理、负载因子等;3) 详细讲解解决哈希冲突的两种方法:开放定址法(线性探测、二次探测)和链地址法(哈希桶),并给出具体代码实现;4) 关键实现细节如扩容策略、字符串哈希处理等。文章通过对比分析和代码示例,帮助读者深入理解STL中u原创 2025-08-17 01:55:23 · 807 阅读 · 9 评论 -
【C++】第二十二节—一文详解 | 封装红黑树实现myset和mymap
本文详细讲解了C++中map和set的底层实现原理及模拟实现方法。文章首先分析了SGI-STL30源码中map和set的实现框架,重点解析了红黑树的泛型设计思想,通过Value参数控制红黑树节点存储的数据类型,实现set和map的复用。随后详细介绍了模拟实现过程:1) 构建复用红黑树的框架并支持insert操作;2) 实现迭代器功能,分析++和--操作的核心逻辑;3) 为map添加[]操作符支持;4) 完整实现lrq命名空间下的map和set类。文章通过大量代码示例和图示,深入浅出地讲解了红黑树迭代器的实现原创 2025-08-05 01:18:23 · 803 阅读 · 90 评论 -
【C++】第二十一节—一文详解 | 红黑树实现(规则+效率+结构+插入+查找+验证)
本文详细介绍了红黑树的概念、规则和实现方法。红黑树是一种自平衡二叉搜索树,通过节点颜色约束确保最长路径不超过最短路径2倍,时间复杂度保持O(logN)。文章重点讲解了红黑树的插入操作,包括三种处理情况:单纯变色、单旋+变色和双旋+变色,并提供了完整的C++实现代码。同时对比了红黑树与AVL树的性能差异,指出红黑树旋转次数更少但效率相当。文中还给出了红黑树的验证方法,通过检查4条规则确保平衡性。最后附上了完整的测试代码,可用于实际性能测试。原创 2025-08-02 10:44:40 · 1780 阅读 · 84 评论 -
【C++】第二十节—一文详解 | 异常
本文详细介绍了C++异常处理机制,包括异常的概念、抛出与捕获、栈展开、匹配处理等核心内容。文章通过代码示例演示了异常重新抛出、异常安全问题及异常规范(noexcept)的用法,并对比了C++98和C++11的差异。作者还展示了标准库异常体系的设计模式,建议在主函数捕获基类exception以处理各类异常。全文采用理论讲解与实例代码相结合的方式,帮助读者深入理解C++异常处理机制及其在实际项目中的应用场景。原创 2025-07-30 16:25:35 · 2497 阅读 · 84 评论 -
【C++】第十九节—一文万字详解 | AVL树实现
本文详细介绍了AVL树(自平衡二叉搜索树)的概念与实现。AVL树要求左右子树高度差不超过1,通过平衡因子控制平衡。文章讲解了AVL树的结构、插入操作(包括平衡因子更新)、四种旋转操作(左单旋、右单旋、左右双旋、右左双旋),以及查找、平衡检测等功能。提供了完整的C++代码实现,包括节点结构定义、旋转函数和测试用例。AVL树通过旋转保持平衡,使得增删查改操作的时间复杂度维持在O(logN),相比普通二叉搜索树有显著性能提升。原创 2025-07-29 10:05:56 · 1400 阅读 · 86 评论 -
【C++】第十八节—一文万字详解 | map和set的使用
set的声明如下,T就是set底层关键字的类型,也就是我们上面说的keyset默认要求T支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模版参数set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参数。⼀般情况下,我们都不需要传后两个模版参数。set底层是用红黑树实现,增删查效率是 ,迭代器遍历是走的搜索树的中序,所以是有序的。O(logN)原创 2025-07-22 17:05:54 · 10479 阅读 · 8 评论 -
【C++】第十七节—二叉搜索树(概念+性能分析+增删查+实现+使用场景)
本文系统介绍了二叉搜索树(BST)的概念、实现和应用。主要内容包括:二叉搜索树的定义(左子树值≤根≤右子树)、基本操作(查找、插入、删除)的实现原理和代码,其中删除操作分为3种情况处理。文章分析了BST的性能(最优O(logN),最差O(N))及其局限性,指出需要平衡二叉树的改进。最后介绍了BST的两种应用场景:纯key模型(如车牌识别)和key-value模型(如字典翻译、词频统计),并给出了对应代码实现。全文通过理论讲解与C++代码示例相结合的方式,完整呈现了BST的核心知识点。原创 2025-07-20 18:48:12 · 17146 阅读 · 79 评论 -
【C++】第十六节—一文详解 | 多态(概念+定义+实现,纯虚函数和抽象类,原理)
本文详细介绍了C++中多态的概念、实现原理及相关技术要点。主要内容包括:多态分为编译时多态(静态多态)和运行时多态(动态多态),重点讲解了运行时多态的实现条件:必须通过基类指针或引用调用虚函数,且派生类必须完成虚函数重写。文章还深入分析了虚函数表指针、动态绑定机制、虚函数表的存储结构等底层原理,并通过多个代码示例演示了多态的具体应用场景。此外,还介绍了协变、析构函数重写、纯虚函数和抽象类等高级特性,以及C++11新增的override和final关键字的使用场景。原创 2025-07-17 08:14:18 · 16727 阅读 · 95 评论 -
【C++】第十五节—一文详解 | 继承
摘要:本文详细讲解了C++继承机制及其相关特性,包括继承概念、定义格式、访问方式变化、基类派生类转换、作用域规则、派生类成员函数实现等核心内容。重点分析了多继承带来的菱形继承问题及虚继承解决方案,并通过代码示例对比了继承与组合的设计差异。文章还探讨了继承与友元、静态成员的关系,以及如何实现不可继承的类等实用技巧。最后总结了继承与组合的选择原则,强调应根据实际需求合理使用这两种代码复用方式。全文内容系统全面,适合C++开发者深入学习面向对象编程中的继承机制。原创 2025-07-13 23:57:07 · 16757 阅读 · 89 评论 -
【C++】第十四节—模版进阶(非类型模版参数+模板的特化+模版分离编译+模版总结)
本文介绍了C++模板编程中的关键概念:1. 非类型模板参数的特点和使用场景,重点说明其只能是整型常量且需编译期确定;2. 模板特化的两种形式(函数模板特化和类模板特化),通过Date类案例演示指针比较问题的特化解决方案,指出函数特化易错点并推荐直接重载函数;3. 类模板全特化与偏特化的语法差异,展示部分参数特化和指针/引用特化的实现方式;4. 模板分离编译问题及两种解决方案,强调将声明定义放在同一文件的实践优势。文章最后总结了模板在代码复用和灵活性方面的优势,以及可能导致的代码膨胀和编译错误信息混乱等缺点。原创 2025-07-10 22:12:21 · 13955 阅读 · 84 评论 -
【C++】第十三节—stack、queue、priority_queue、容器适配器(介绍和使用+模拟实现+OJ题)
本文介绍了C++中的三种容器适配器:stack(栈)、queue(队列)和priority_queue(优先队列)。主要内容包括:1. 各容器的基本接口和使用方法,如push/pop操作;2. 通过LeetCode例题(最小栈、逆波兰表达式等)演示实际应用;3. 容器适配器的模拟实现,重点讲解了底层容器选择及实现原理;4. 对比分析了deque作为默认底层容器的优势;5. 通过性能测试比较了vector和deque的排序效率。文章最后提供了完整的代码示例,适合C++学习者了解STL容器适配器的核心概念和使用原创 2025-07-02 15:37:08 · 1444 阅读 · 61 评论 -
【C++】第十二节—详解list(list的介绍和使用、模拟实现)
本文介绍了C++中list容器的使用和模拟实现。主要内容包括:1) list的基本概念,它是带头双向循环链表;2) list的常用接口,如构造、迭代器、容量操作、元素访问和修改操作;3) push_back和emplace_back的区别,后者在某些情况下更高效;4) vector和list在排序性能上的差异,vector的排序效率更高;5) 通过代码示例演示了list的模拟实现过程,包括节点结构、迭代器和基本操作。文章还提供了完整的测试代码,帮助理解list的实际应用。作者作为C++学习者,将持续更新相关原创 2025-06-23 23:10:13 · 1924 阅读 · 84 评论 -
【C++】第十一节—一文详解vector(使用+杨辉三角+深度剖析+模拟实现+细节详细补充)
这篇文章详细介绍了C++ STL中的vector容器,主要包括以下内容: vector的基本使用:构造函数、迭代器、遍历方式、空间增长问题和增删查改操作 迭代器失效问题分析:扩容和删除操作导致的失效情况 vector的模拟实现:核心框架、构造函数匹配、拷贝问题和内存管理 二维vector的使用:以杨辉三角为例展示动态二维数组的实现 文章通过源码分析和实例演示,深入剖析了vector的内部实现机制和使用注意事项,特别是针对迭代器失效和深拷贝等关键问题提供了详细说明和解决方案。原创 2025-06-08 10:53:19 · 2627 阅读 · 105 评论 -
【C++】第十节—string类(完结篇)——详解+代码示例
(1)所有的.c或者.cpp文件在编译链接的时候都会生成.o文件(VS下叫.obj文件),.h文件在预处理的时候就在两个.cpp文件里面展开了,我们在类域外面定义的npos就会在两个.cpp里面展开,当两个.cpp文件链接合并生成可执行程序的时候,就构成了下面报错里面的重定义,所以当静态成员变量定义和声明分离的时候要在.cpp文件里面定义,不能像以前那样在类里面声明在类外面定义。对于npos要加上const,不可修改。(2)同时npos要在定义的时候给值,对于const对象是只有定义时一次初始化的机会。原创 2025-04-11 21:53:26 · 1685 阅读 · 86 评论 -
【C++】第九节—string类(中)——详解+代码示例
387. 字符串中的第一个唯一字符 - 力扣(LeetCode)public://开空间来存放出现次数的数组//统计次数//映射到count里面//找出字符串里面第一个只出现一次的字符-->再遍历一遍s//利用s里面的每个字符映射到count数组里面找为1的,找不到就返回-1i++)return i;return -1;字符串最后一个单词的长度_牛客题霸_牛客网根据上面的思路我们实现了下面的代码,这是怎么回事呢?原创 2025-04-06 21:22:18 · 1607 阅读 · 71 评论 -
【C++】第八节—string类(上)——详解+代码示例
hello,又见面了!目录一、为什么要学习string类?1.1 C语言中的字符串1.2 面试题(暂不做讲解)二、 标准库中的string类2.1 string类(了解)2.2 auto和范围for2.3 string类的常用接口说明(注意下面我只讲解最常用的接口)2.3.1 string类对象的常见构造2.3.2 string类对象的容量操作2.3.3 string类对象的访问及遍历操作【operator[ ]】 【遍历begin+end+迭代器第一弹】【迭代器第二弹】【const对象的迭代器和反向迭代器原创 2025-04-03 22:28:20 · 2504 阅读 · 105 评论 -
【C++】第七节—模版初阶+STL简介
1.什么是STL标准模板库是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。2. STL的版本原始版本Meng Lee在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。HP 版本--所有STL实现版本的始祖。P. J. 版本由开发,继承自HP版本,被采用,不能公开或修改,缺陷:可读性比较低,符号命名比较怪异。原创 2025-04-02 09:56:09 · 1458 阅读 · 105 评论 -
【C++】第六节—内存管理
但是如果对于A类使用new去申请空间但是如果没有A的默认构造又不去传参调用就会报错,见下:没有默认构造是不可以的,所以一个类还是要有构造函数为好!原创 2025-03-30 15:09:25 · 19362 阅读 · 99 评论 -
【C++】第五节—类和对象(下)
class Apublic:// 构造函数explicit就不再支持隐式类型转换A(int a1):_a1(a1):_a1(a1), _a2(a2)private:int main()//1构造一个A的临时对象,再用这个临时对象拷贝构造aa1//编译器遇到连续构造+拷贝构造->优化为直接构造A aa = 1;aa.Print();//还有一个需要注意的点,对于引用类型就不能直接像刚才那样写,会报错。原创 2025-03-29 01:22:44 · 5421 阅读 · 107 评论 -
一名合格程序猿的自我修养—VS实用调试技巧(详解+图例)
F5和F9是帮助我们快速到达我们想要到的地方,F10和F11是帮助我们到达地方后观察程序内部的运行情况的。CTRL + F5:开始执⾏不调试,如果你想让程序直接运⾏起来⽽不调试就可以直接使⽤。(为什么点击F5也可以直接完成运行呢?因为F5是用来运行到下一个断点处的,但是整个程序都运行结束了都没有发现断点)上面是我们很常用的快捷键,下面还有很多快捷键,我们平时应该多用才能提升我们写代码的速度,多用才能记住!原创 2025-03-26 20:44:17 · 19672 阅读 · 70 评论 -
【C++】第四节—抽象之神:类和对象(中)万字详解(构造函数、析构函数、拷贝构造、赋值运算符重载、日期类实现、取地址运算符重载)
内置类型就是语言提供的原生数据类型,如:int/char/double/指针等。自定义类型就是我们。原创 2024-12-18 23:44:30 · 4501 阅读 · 75 评论 -
【C++】第三节—类和对象(上)——(类、类的实例化、this指针、C++实现的Stack)
1.1 类定义格式1.2 访问限定符public1.3 类域类域比较短小的函数就在类里面去定义,默认是内联函数,长一点的函数不在类里面去定义在类外面去定义,在.cpp文件里面去定义,做函数声明和定义的分离。下面展现的就是标准的类的声明和定义分离。原创 2024-09-22 20:51:33 · 5761 阅读 · 99 评论 -
【C++】第二节—入门基础(下)—(详细介绍引用、引用和指针的关系(面试点)、内联函数、nullptr)
正文开始——7、引用7.3 引用的使用(实例)7.4 const引用临时对象类型转换中会产生临时对象存储中间值可以引用一个const对象,但是必须用const引用。const引用也可以引用普通对象,因为对象的访问权限在引用过程中可以缩小,但是不能放大。上难度,理解const引用和指针的结合,见下图详解:这张图献给C语言中const用法没记牢的同学,(我是小菜鸡^(* ̄| (o_o) | ̄)^),指针与const的组合。(我当初为啥要选计算机来着),啊!临时对象类型转换中会产生临时对象存储中间值。原创 2024-09-16 14:20:05 · 2478 阅读 · 65 评论 -
【C++】第一节—入门基础(上)
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{},里面即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,同一个域不可以定义同名变量。所以下面的rand不再冲突了。C++域中有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找一个变量/函数/类型出处(声明和定义)的逻辑,所以有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响。原创 2024-09-11 21:23:31 · 3640 阅读 · 91 评论