- 博客(15)
- 收藏
- 关注
原创 C++ vector 从入门到模拟实现(超详细整理)
vector 的迭代器本质是T*。当 vector 底层空间被重新分配(扩容)或元素被搬移后,原来的迭代器仍指向已释放的旧空间,继续使用就是访问野指针,程序可能崩溃或输出错误结果。类比:你手里有一把旧房子的钥匙,房子拆了重建,钥匙就打不开新房子了,甚至可能打开别人家。易错点说明是 5 个 0,不是容量 5reservevsresizereserve 只开空间;resize 改 size 且初始化扩容倍数VS 1.5 倍,g++ 2 倍,别记死迭代器失效扩容类操作后全部失效;
2026-11-10 14:15:11
127
原创 C++ string 类从入门到模拟实现
易错点说明npos定义只能类内初始化容量语义_capacity不含'\0',开空间要 +1size_t下溢插入时避免end--溢出自赋值赋值运算符必须判断this!= &snew 失败先 new 再 delete,保证异常安全operator+传值返回,深拷贝效率低,尽量少用数据挪动,O(N),尽量用+=替代头插cin >>遇空格终止,读整行用getline总结string是 C++ 中使用频率最高的类之一,掌握其接口只是第一步,理解深拷贝、容量管理、迭代器失效等底层机制才是关键。
2026-11-05 19:20:31
200
原创 【C++】模板初阶:泛型编程与函数/类模板
cppclass 类模板名// 类内成员定义示例:用类模板实现 Stackcpp// 类模板public:_size = 0;// 模板不建议声明和定义分离到两个文件.h 和.cpp,会出现链接错误,具体原因后面会讲// ... 扩容逻辑重要提示模板不建议声明和定义分离到两个文件.h和.cpp,会出现链接错误。具体原因后续会讲解(本质是模板在编译时才能实例化,而分离编译时.cpp文件单独编译时看不到调用点,无法实例化)。
2026-10-19 21:00:07
229
原创 【C++】类和对象(下):初始化列表、static、友元与编译器优化
之前实现构造函数时,初始化成员变量主要使用函数体内赋值。构造函数初始化还有另一种方式——初始化列表。使用方式:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。cppclass Timepublic::_hour(hour) // 初始化列表private:int _hour;场景优化前优化后f1(aa1)传值传参构造 + 拷贝构造构造 + 拷贝构造(无法优化)f1(1)隐式类型构造 + 拷贝构造直接构造。
2026-10-13 14:53:17
190
原创 【C++】类和对象(中):六大默认成员函数详解
cpppublic:perror("malloc申请空间失败");return;_top = 0;// ...private:// 两个Stack实现队列public:// 编译器默认生成MyQueue的构造函数调用了Stack的构造,完成了两个成员的初始化private:int main()MyQueue mq;return 0;默认成员函数核心要点何时需要自己实现构造函数类名同名、无返回值、可重载、自动调用需要自定义初始化逻辑时析构函数~类名。
2026-10-11 10:35:05
180
原创 【C++】类和对象(上):从类的定义到this指针
在 C++ 中,class是定义类的关键字,语法格式如下:cpp// 类体:成员变量 + 成员函数// 注意分号不能省略!类体内容称为类的成员:变量称为属性/成员变量,函数称为方法/成员函数。成员变量命名惯例:为了区分成员变量,通常加特殊标识,如_yearm_yearyear_等。这不是强制要求,具体看公司规范。struct 也能定义类:C++ 兼容 C 的 struct 用法,同时将其升级为类,struct 内可以定义函数。但一般推荐用class。类内定义的成员函数默认为 inline。封装性。
2026-10-09 19:23:04
139
原创 【C++入门】第一天到第三天:命名空间、输入输出、缺省参数、函数重载、引用、inline、nullptr全解析
作为一个学完C语言、正在入门C++的新手,这几天我系统学习了C++的一些基础特性。从命名空间到引用,从缺省参数到nullptr,每一个知识点都让我感受到C++和C语言的差异。这篇文章是我的学习笔记整理,希望能帮到同样在入门C++的你。如有错误,欢迎大佬指正!函数声明时给参数一个默认值,调用时可以不传。cppfunc(1);// 1 2 20// 1 2 3同一作用域中,函数名相同,但参数列表不同(参数个数或类型不同)。cpp引用就是给变量起。
2026-09-12 20:07:58
177
原创 【C语言数据结构】八大排序算法详解(插入/选择/交换/归并/计数,附完整代码)
排序是计算机科学中最基础、最重要的算法之一。无论是数据库查询、数据分析,还是日常编程中的数据处理,都离不开排序。一个好的排序算法能极大地提升程序效率。本文将一次性带你搞懂八大经典排序算法✅插入排序:直接插入、希尔排序✅选择排序:直接选择、堆排序✅交换排序:冒泡排序、快速排序(递归+非递归)✅归并排序:递归实现✅非比较排序:计数排序所有算法均用C语言实现,包含完整测试代码和性能对比,让你不仅学会代码,更能理解每种算法的适用场景。sort.hc// 工具函数// 插入排序。
2026-08-06 20:11:41
192
原创 【C语言数据结构】二叉树详解(递归遍历+层序遍历+各种计算,附完整代码)
在前面的学习中,我们接触的都是线性结构(顺序表、链表、栈、队列)。这些结构的数据元素之间是一对一的关系。然而现实中很多数据的关系是一对多的,比如文件系统的目录结构、家族族谱、表达式树等。树(Tree)正是这种非线性结构的代表,而二叉树(Binary Tree)是树结构中最基础、最重要的一种——每个结点最多有两个子结点(左孩子、右孩子)。二叉树不仅是数据结构的重点,也是算法面试的常客。本文将带你从零实现一个链式存储的二叉树,包含:✅ 二叉树的定义(数据域 + 左右指针)✅四种遍历。
2026-06-16 07:00:00
268
原创 【C语言数据结构】堆的实现与堆排序详解(附完整代码)
在之前的数据结构学习中,我们掌握了线性表(顺序表、链表)、栈和队列。这些结构处理数据时,要么按插入顺序(栈/队列),要么按位置(线性表)。但是否存在一种结构,能自动将数据按优先级(如大小)组织,每次都能高效地取出“最大”或“最小”的元素?堆(Heap)正是为此而生!它是一种特殊的完全二叉树,通常用数组实现,能在O(log n)时间内插入和删除极值,在O(1)时间内获取极值。它也是优先队列的底层实现,广泛应用于堆排序、Top-K 问题、Dijkstra 算法等。本文将带你从零实现一个。
2026-06-14 20:48:18
355
原创 【C语言数据结构】栈和队列详解(动态栈+链式队列,附完整代码)
在前面的文章中,我们已经学习了顺序表、单链表、双向链表。这些都是线性表的典型代表,支持在任意位置插入和删除。浏览器的后退/前进(栈)打印机任务排队(队列)函数调用栈(栈)消息队列(队列)这些场景如果使用普通链表/顺序表,虽然可以实现,但代码复杂且容易出错。于是,栈(Stack)和队列(Queue)应运而生——它们是操作受限的线性表,提供了简单高效的接口。本文将带你从零实现:✅动态栈(顺序表实现,后进先出 LIFO)✅链式队列(链表实现,先进先出 FIFO)
2026-05-26 21:33:18
392
原创 【C语言数据结构】双向链表(带头循环双向链表,附完整代码)
在前面两篇文章中,我们分别学习了顺序表和单链表。顺序表:支持随机访问,但头部和中间插入删除效率低(O(n))。单链表:头插头删效率高,但只能单向遍历,且尾插尾删仍需O(n),另外删除结点时必须知道前驱结点。那么有没有一种链表,既能双向遍历,又能高效地在任意位置插入删除呢?双向链表(Doubly Linked List)就是答案!如果再给它加上带头结点和循环的特性,就变成了我们今天要实现的“带头循环双向链表”—— 这是链表中最完美的结构之一。
2026-05-22 22:44:12
362
原创 【数据结构】C语言实现单链表(附完整代码)
在前面的文章中,我们学习了顺序表,它虽然支持随机访问,但在头部和中间插入删除时需要移动大量元素,效率较低。那么有没有一种数据结构可以解决这个问题呢?链表(Linked List)应运而生!它通过“指针”将零散的内存块串联起来,插入删除不需要移动元素,只需修改指针指向即可。本文将带你从零实现一个单链表(Singly Linked List),包含:✅ 结点的定义与创建✅ 头插、头删、尾插、尾删✅ 任意位置插入/删除(前插/后插)✅ 查找、打印、销毁✅ 完整测试代码与运行结果学完你将掌握。
2026-05-12 14:26:56
437
原创 【数据结构】C 语言实现动态顺序表(附完整代码)
本文介绍了用C语言实现动态顺序表的方法。顺序表是一种线性表,通过连续内存存储数据元素,支持随机访问。文章详细讲解了顺序表的结构体定义、初始化与销毁、动态扩容机制等核心功能,并实现了尾插/删、头插/删、任意位置插入/删除等操作。测试代码验证了各功能的正确性,最后分析了时间复杂度:尾插O(1),头插/删O(n),查找O(n)。顺序表优点是随机访问高效,缺点是插入删除需要移动元素且扩容有开销。该实现为后续学习更复杂数据结构奠定了基础。
2026-05-03 16:25:05
420
原创 c语言实战:从零开始实现三子棋游戏 | 来自我的第一个完整c语言项目
我使用char sand[3][3]这个二维数组作为棋盘,将所有位置初始化为' ' ,这样一来,打印的就是空棋盘。说起来,编译时最重要的就是严谨 严谨 再严谨,每一个细小的东西都不能放过。在未来严谨我将会一直贯彻。做完这个项目,我释然的笑了,像是看见自己的“孩子”一样,也许从这个时候开始,我不再仅仅是,更是在。
2026-04-04 23:19:41
400
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅