自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 深入理解 C++11 核心特性:从零开始构建现代高效代码

C++11 是 C++ 的第二个主要版本,也是自 C++98 诞生以来最重要的一次更新。在它最终由 ISO 组织于 2011 年 8 月 12 日正式采纳之前,人们通常使用名称“C++0x”,因为它曾被期望在 2010 年之前发布。由于 C++03 与 C++11 之间经历了长达 8 年的时间,这是迄今为止版本间隔最长的一次。自此以后,C++ 保持着每 3 年更新一次的稳定节奏。

2026-11-04 13:47:33 290

原创 C++ 运行时多态与虚函数机制全面剖析【面试重点】

构成C++ 运行时多态必须是基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,并且派生类必须对该虚函数完成重写/覆盖(Override)。只有基类的指针或引用才能既指向基类对象,又指向派生类对象(切片机制);而只有完成了虚函数重写,派生类与基类才具备不同的函数行为,达到“指向谁就调用谁”的效果。在类成员函数的前面加上virtual关键字修饰,该成员函数就成为了虚函数。public:// 成员函数前加 virtual 修饰,声明为虚函数。

2026-11-04 13:43:57 421

原创 C++ 异常处理全攻略:异常规范、栈展开、多态体系设计与异常安全防范

/ 1. 定义顶层异常基类public:// 构造函数:初始化错误描述信息与错误编号, _id(id)// 虚函数 what:支持多态调用,返回基础错误信息// 获取错误编号return _id;protected:// 错误描述信息int _id;// 错误编号⭐ 语法细节与行为机制:Exception 作为整个异常体系的基类,定义了所有异常共有的核心属性:错误描述 _errmsg 和错误码 _id。

2026-11-04 13:43:40 275

原创 深入解析 C++ unordered_set 与 unordered_map 的核心特性与性能实战

在 C++ STL 中,关联式容器是日常开发中不可或缺的利器。此前我们已经学习了基于红黑树的 set 和 map,它们能够保证元素有序且支持高效的对数时间复杂度操作。而今天,我们要探索的是基于哈希表实现的无序关联式容器:unordered_set 与 unordered_map。我们将结合具体的测试代码,深入剖析它们的行为特征、核心差异以及性能表现。

2026-10-30 23:42:57 284 1

原创 C++ AVL树保姆级详解:从平衡因子到四大旋转机制

学完四大旋转,我们可以把它们归纳为一个清晰的记忆口诀:左左高 (-2, -1)→→右单旋(RotateR)。右右高 (2, 1)→→左单旋(RotateL)。左右高 (-2, 1)→→左右双旋(RotateLR)(先左旋子树,再右旋父亲)。右左高 (2, -1)→→右左双旋(RotateRL)(先右旋子树,再左旋父亲)。核心重点:双旋的核心在于“先拉直,后整体压平衡”,并且必须根据插入点位置(即孙子节点的平衡因子)来精准修正各个节点的 _bf。

2026-10-30 23:42:40 426

原创 C++ STL 进阶:关联式容器 set 与 map 使用指南

在 STL 源码中,pairT1 first;// 键 KeyT2 second;// 值 Value// 默认构造函数// 值构造函数// 支持隐式类型转换的拷贝构造函数。Key 的只读限制:因为pair的第一个成员类型显式声明为了const Key,所以从map中获取元素时,无法修改其first成员。

2026-10-29 17:41:22 146 1

原创 【C++ 进阶】二叉搜索树(BST)全景拆解:从原理分析到模板源码实现

/ 二叉搜索树节点结构体(Key-Value 模型)K _key;// 关键字 KeyV _value;// 映射值 Value// 指向左孩子的指针// 指向右孩子的指针// 节点构造函数{}// 二叉搜索树类定义// 内部重命名,简化书写public:// C++11 显式生成默认构造函数private:// 类内初始化,防止野指针⭐模板泛型设计:通过 template<class K, class V> 实现 Key 与 Value 的解耦,支持任意类型的比较与映射。

2026-10-29 17:40:55 364 1

原创 彻底搞懂 C++ 模板进阶:特化技巧、STL 仿函数妙用与分离编译陷阱

仿函数:本质上是一个重载了圆括号运算符operator()的类或结构体。“仿”在哪里:由于它重载了(),使得该类的对象可以像普通函数一样被调用(例如obj(a, b)相比传统函数指针的优势:仿函数是一个真正的“类对象”,因此它可以包含成员变量来持存状态,并且它的调用会在编译期被内联优化,性能显著优于传统函数指针。在 STL(如std::sort)中,仿函数被大量用作自定义排序规则的比较器。

2026-10-17 20:42:58 408 13

原创 一文彻底搞懂 C++ 继承:从语法特性到底层内存布局与实现原理

在面向对象编程(OOP)中,继承(Inheritance) 是实现代码复用、扩展类功能以及构建层级结构的核心机制。也就是说,继承是指在已有类的基础上建立新类的机制。基类(Base Class / 父类):被继承的已存在的类,提供通用的属性与行为。派生类(Derived Class / 子类):基于基类新建的类,自动拥有基类的成员,并可以扩展或修改自身的属性与行为。子类对象的内存: 父类的成员 | 子类独有的成员父类对象的内存: 父类的成员耦合度指的是模块与模块之间(或类与类之间)依赖关系的紧密程度。

2026-09-07 13:40:48 465 10

原创 深度剖析 C++ vector:从接口使用到底层模拟实现全指南

由于扩容导致旧空间被释放,迭代器指向了无效的野指针区域。

2026-07-25 15:16:20 238 14

原创 C++中的活字印刷术——模板·初阶

同名的非模板函数(普通函数)可以和模板函数同时存在。普通函数和实参完全匹配 -> 优先调用普通函数。普通函数不匹配 -> 编译器自动调用模板。在函数名后加上< 类型 > -> 显式实例化模板,编译器强制使用模板。定义格式class 类模板名// 类内成员定义模板形参建议:在类模板中,如果函数形参是模板类型(如T),推荐使用常引用(const T&),以避免不必要的拷贝开销。C++扩容特性C++ 没有像 C语言中realloc那样可以自动就地或异地扩容的renew机制。

2026-05-21 13:25:19 728 24

原创 C++ 内存管理

在申请自定义类型的空间时,new会自动调用自定义类型的构造函数,delete会自动调用析构函数,而malloc和free都不会。这就是new和delete与malloc和free最大的区别。int _a2;int main()// 申请3个数据类型为A的空间(调用三次默认构造)

2026-04-27 12:21:35 658 24

原创 带你了解C++的类与对象(下)

每个成员都要走初始化列表在初始化列表初始化的成员(显式写)没有在初始化列表初始化的成员(不显式写)a. 声明的地方有缺省值用缺省值b. 没有缺省值- x: 内置类型,不确定是否初始化,看编译器,大概率是随机值。- y: 自定义类型,调用默认构造,没有默认构造就编译报错。引用 const 无默认构造的自定义类型,必须在初始化列表初始化。

2026-04-24 20:13:57 627 22

原创 带你了解C++的类与对象(中)

编译器自己生成的构造,只做相对浅显的初始化操作,因此大部分构造函数的初始化操作,都需要我们自己手搓;但是!当类的成员变量,只包含自定义成员变量时,编译器自己生成的构造,就足够了。例:用两个栈(Stack)来实现队列(MyQueue)//自己实现栈,需要自己写public://构造函数return;_top = 0;private://两个栈实现队列 - 不需要自己写public://编译器默认生成 MyQueue 的构造函数,调用了 Stack 的构造。

2026-04-19 19:11:53 641 20

原创 带你了解C++的类与对象(上)

/类的方法//...void Pop()//...int top()//...//类的属性int* _a;int _top;//分号不可省略class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时,后面的分号不能省略。类中的变量,称为类的属性 或 成员变量;类中的函数,称为类的方法 或 成员函数。为了区分成员变量,一般习惯上成员变量会加一个特殊标识,如成员变量或者后面加_或者m开头。注意C++中这个并非强制要求,只是一些惯例。

2026-04-12 09:58:41 673 23

原创 C++入门基础

定义命名空间,需要用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可(注,末尾无需加分号“;”){}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace本质是定义一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以rand就不再冲突了。C++中域有局部域全局域命名空间域类域。域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义)的逻辑,所以有了域隔离,名字冲突就解决了。

2026-04-04 15:18:40 654 24

原创 二叉树的遍历和实现

了。这里和前文保持一致,建小堆来实现降序。

2026-03-29 13:22:40 560 20

原创 带你了解栈和队列(附OJ题)

例如:压栈数据1 2 3 4,若在压栈的同时也能进行出栈操作,则顺序可以是4 3 2 1,也可以是1 4 3 2 等。数组和单链表差别不大,但双链表却多了一个指针(prev),因此双链表会造成空间冗余,浪费内存,所以排除使用双链表。题目:给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。删除元素时,无法通过free删除数组中的某个元素,因此将head++即可,同样要注意。注意:出队顺序和入队顺序一样,有且仅有一种:最先入队列的数据,就是最先出队的数据。

2026-03-04 16:56:06 424 13

原创 单链表的实现

总结:本博客所述的单链表是一种,不带头单向不循环链表。单链表和双向带头循环链表(与单链表相对的双链表。

2026-02-11 15:37:43 785 8

原创 带你了解顺序表的功能并实现

通讯录包含的信息较多,如人的姓名,性别,年龄,电话,地址等。因此,通讯录中的数据类型应为结构体,便于存储多种不同的数据类型(如整型和字符型)。此结构体的定义peoInfo//姓名、性别、年龄、电话、地址int age;}peoInfo;//该结构体已改名为:peoInfo要给顺序表改个名字,叫做通讯录改名是为了增加代码辨识度,让人看懂代码//注意,不能将struct SeqList 直接写成SL为什么不能将 struct SeqList 直接写成SL呢?

2026-02-03 14:46:24 1003 7

原创 预处理详解

预处理

2026-01-28 17:08:01 719 3

原创 【笔记】函数递归

递归是一种解决问题的方法,在C语言中,递归就是自己调用自己。//最简单的递归程序//但会明显的引入问题,因此其实是个错误示范。return 0;此时如果进行调试则会显示:这是因为:每一次函数调动,都会在内存的栈区申请空间,如果这样的函数无限的延伸下去,栈区会被撑满。

2025-12-11 10:02:14 1066

原创 【笔记】操作符详解

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。了,则根据运算符是左结合,还是右结合,决定执行顺序。如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。八进制的每一位是0-7的数字,各自写成2进制,最多3个2进制位就足够,比如7的二进制是111。eg:2进制的01101011,换成8进制:0153,0开头的数字,会被当成8进制。

2025-12-08 17:44:21 1046 2

原创 【笔记】VS的调试

它往往进行了各种优化,使程序在代码大小和运行速度上都是最优的。编译生成的可执行文件的大小,Release版本会比Debug小。逐过程,通常用来处理一个过程,一个过程通常是函数调用,或者是一条语句。的作用:打上断点时,可以使程序到想要的地方暂停执行,便于后续利用F10,F11来观察代码细节。若使用F10,则直接完成函数调用,无法观察函数内部细节。,他包含调试信息,不做任何优化,便于程序员调试程序。因此,确认程序无误后,使用Release,效率更高。因此,刚开始编写程序时,尽量使用Debug。

2025-12-01 00:12:59 335 2

原创 【笔记】扫雷游戏

代码位置:E盘-code-test-game。

2025-12-01 00:11:36 946 4

原创 【笔记】static 和 extern

本质原因:全局变量默认是具有外部链接属性的,在外部的文件中想使用,只要适当的声明就可以使用:但是全局变量被static修饰之后,外部链接属性就变成了内部链接属性,只能在自己所在的源文件内部使用了,其他源文件,即使声明了,也是无法正常使用的。static修饰局部变量时,会改变存储类型,由栈区改为静态区,使局部变量n的生命周期=程序的生命周期,但不改变作用域,一个全局变量(或函数)只想在所在的源文件内部使用,不想被其他源文件使用,就可以使用static修饰。会将其外部链接属性,变为内部链接属性,使其只可在。

2025-11-27 12:39:57 442 4

原创 【笔记】让人使用却不让人看代码的实现细节的方法

1.将Add.h(代码头文件)和add.lib(项目)导入到需要使用的项目[仓库]中 (仓库即文件夹)4.添加“加法操作代码”到add项目中(.h放到头文件,.c放到源文件);3.将“加法操作代码”放入“add”[仓库]中 (仓库即文件夹);(1)点击add项目中的“属性”,将“配置类型”修改为“(2)编译后产生的“add.lib”文件,即为静态库。ps:这里的项目为图中的“Project1”;2.将Add.h导入到“Project1”中。2.新创办一个[空项目]:“add”;

2025-11-26 00:59:13 190 2

空空如也

空空如也

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

TA关注的人

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