- 博客(30)
- 收藏
- 关注
原创 C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?
第17课:用大白话讲清 list 的双向链表结构、哨兵头、push_back 四步、迭代器封装、merge 与 splice 的区别,以及 vector 排序为什么常比 list 快。
2026-11-11 16:14:44
81
原创 C++ 入门笔记(十六):第16课 vector 模拟实现十问十答 —— 从三指针到迭代器失效
第16课复盘:用10个问题讲清 vector 的三指针、= default、拷贝构造、reserve 与 resize、new T[n] 与 uninitialized_copy、insert/erase 迭代器失效,以及 vector<string> 为什么不能 memcpy。
2026-11-07 16:50:20
180
原创 C++ 入门笔记(十五):第15课 vector 的模拟实现 —— 三指针、reserve 深拷贝与迭代器失效
第15课:从三个指针手写 vector,讲清 reserve 为什么不能 memcpy、resize 的资源释放、insert/erase 迭代器失效,以及 vector<size_t> v(10,1) 被范围构造函数抢走的坑。附 STL30 源码对照。
2026-11-04 22:05:15
135
原创 136 / 137 / 260 其实是同一道题:我的位运算三连复盘(附 9 个踩坑)
今天最惨的一道只过了 5/35。复盘完才发现:136、137、260 其实是同一道题的三种参数——一个整数就是一个集合,异或就是模 2,出现 k 次就模 k。附 9 个踩坑记录。
2026-11-03 00:13:13
149
原创 C++ 入门笔记(十四):string 的 copy-and-swap 与 vector 初探
第14课:string 的 copy-and-swap、swap 的 O(1) 写法、substr 临时对象、operator>> 的 EOF 坑,以及 vector 的扩容、insert/erase/find 和迭代器失效。
2026-10-30 23:56:00
19
原创 C++ 入门笔记(十三):手写 string 的增删查改 —— 深拷贝、扩容与临时对象
第13课手写 string:深拷贝、扩容、insert/erase 的挪动、find/substr 的临时对象、六个比较运算符与 operator<<,全部在 VS 2026(MSVC 14.51)实测。
2026-10-26 18:52:40
302
原创 C++ 入门笔记(十二):string 底层初探 —— basic_string 模板、构造与迭代器本质
本文深入剖析C++ string底层实现,揭示其作为basic_string<char>模板的通用性设计,解释为何比较运算符需三组全局重载以支持多种类型匹配。通过手写简化版string,阐明构造过程(堆内存分配、strcpy拷贝)、迭代器本质即char*指针,以及begin()与end()构成左闭右开区间。强调迭代器封装带来的接口统一性,使不同容器遍历语法一致。实测验证常量区与堆内存分离特性,理解new char[size+1]中+1用于容纳\0。学习方式为“听课+编码验证+AI辅助”,所有代码
2026-10-21 00:56:38
161
原创 C++ 入门笔记(十一):string 的迭代器、容量管理与增删改
本文深入剖析C++ string 的迭代器、容量管理与增删改操作。详解四种迭代器的使用场景,强调 const_iterator 与 const_iterator 的本质区别;通过实测对比 reserve(预分配空间,以空间换时间)与 shrink_to_fit(真缩容,以时间换空间)的差异;明确 resize 的三种行为及对 \0 的处理逻辑;对比 [] 断言与 at() 异常抛出的适用场景;指出 insert/erase/replace 因需数据挪动应谨慎使用,并以“空格替换”和“大数相加”为例,展示用
2026-10-17 00:01:40
153
原创 C++ 入门笔记(十):初识 STL —— string、迭代器与范围 for
本节课正式进入C++ STL,重点学习string的构造与操作、三种遍历方式(下标、迭代器、范围for)及迭代器的通用性。通过对比C语言字符数组,体会string封装带来的便捷;理解迭代器作为“万能插座”实现算法与容器解耦,支持reverse等算法跨容器通用;掌握auto简化类型声明,提升代码可读性。结合两道LeetCode题实践,巩固字符串处理能力。学习方式为听课+动手验证+AI辅助,所有代码在VS中编译运行,为后续深入STL打下坚实基础。
2026-10-14 18:57:08
134
原创 C++ 入门笔记(九):new/delete 的底层实现与模板初探
本节课深入剖析C++中new/delete的底层实现——“两步走”:先调用operator new申请内存,再调用构造函数初始化;delete则反之。通过汇编与实测验证,对比malloc/free,凸显new/delete在自定义类型上的优势:自动初始化、类型安全、异常处理。同时学习new[]/delete[]配对机制及内存池中的定位new,掌握其在内存管理优化中的应用。最后引入函数模板与类模板,实现“一次编写,多类型复用”,体会编译期半自动化带来的高效编程体验。所有内容均通过VS实机验证,强调动手实践与原
2026-10-12 10:59:28
277
原创 C++ 入门笔记(八):拷贝消除优化与 C++ 内存分区
本课聚焦拷贝消除优化与内存分区。通过实测对比,揭示传值返回的三种写法差异:推荐定义时直接接收(如Aaa2=f2()),避免先定义后赋值(如aa3=f2())导致多一次拷贝与赋值。传参也应优先使用表达式直接构造,避免具名对象传参带来的额外拷贝。同时详解C++内存四区:栈(局部变量,自动释放)、堆(手动管理,易泄漏)、静态区(全局/static变量)、常量区(字符串常量)。强调数组复制内容于栈,指针仅指向常量区;栈小而快,堆大但需手动释放。二者结合,揭示“写法决定性能,内存布局决定资源归属”,为后续类设计奠定基
2026-10-08 23:47:46
220
原创 C++ 入门笔记(七):初始化列表、类型转换构造、static 静态成员与友元内部类
本节系统梳理了C++初始化列表、类型转换构造函数、static静态成员、友元与内部类等核心概念。重点揭示初始化列表按成员声明顺序执行的机制,澄清“书写顺序≠初始化顺序”的常见误区;明确引用、const及无默认构造函数成员必须使用初始化列表;通过JZ64题理解static成员的共享性与生命周期特性,强调其需在类外定义且不会自动重置;剖析explicit防止隐式转换的意义;友元实现类间灵活访问但需谨慎使用,体现封装的精细控制;内部类则提供更紧密的模块化封装。实践验证结合编译错误分析,深化对底层机制的理解,为后续
2026-09-21 00:24:11
139
原创 C++ 入门笔记(六):赋值重载、运算符复用与 const 成员函数
学习方式不变:听课 + 疑惑的地方自己敲 + AI 辅助。这节课的 6 段代码全部在我自己机器上用 VS 的 MSVC 编译器实际编译运行过,包括故意写错让编译器报错的 const 成员函数例子。赋值运算符重载也是个默认成员函数,但它处理的是两个已经存在的对象之间的拷贝赋值:**运行结果:**关键判断标准就一条:这句话是不是在定义一个新对象。这是这节课我觉得最有价值的地方。拷贝构造和赋值重载看起来像,但赋值重载多一个拷贝构造没有的问题:正确的写法是三步:**运行结果:**注意 s2 = s1 之前 s2 已
2026-09-19 21:03:09
192
原创 C++ 入门笔记(五):拷贝构造、深浅拷贝与运算符重载
本文系统梳理C++拷贝构造、深浅拷贝与运算符重载核心概念。重点解析浅拷贝引发的资源共享与重复释放问题,通过Stack类实例说明深拷贝的必要性;强调类若管理资源(如堆内存),必须自定义拷贝构造函数。同时详解运算符重载机制,以Date类加天数为例展示其提升代码可读性的优势,并区分前置与后置++的重载方式。结合实践验证,强化对对象复制语义与表达式直观性的理解,为后续学习赋值重载奠定基础。
2026-09-19 00:40:02
137
原创 C++ 入门笔记(四):从 Init/Destroy 到构造析构,面向对象的第一步
本节课系统学习了C++类与对象的核心机制:从类的内存模型(成员变量独立存储、函数共享)到this指针隐式传递,再到构造/析构函数实现对象的自动初始化与资源清理。通过对比C风格栈操作,深刻体会到C++“对象自己管理自己”的思维转变——构造函数替代Init,析构函数自动释放资源,实现RAII思想,有效防止内存泄漏。内存对齐优化访问效率,空指针调用成员函数的运行时行为也加深了对this的理解。虽仅掌握6个默认成员函数中的前两个,但已建立起面向对象编程的安全性与规范性意识。
2026-09-09 23:46:10
170
原创 C++ 入门笔记(三):从引用到类,我终于理解了 “语法层和底层是两回事“
这个点是课堂上老师引出的,我之前完全没考虑过。// 链接错误!f2(2);// 普通函数,正常return 0;编译能过,但链接时报错:**LNK2019: 无法解析的外部符号 "void __cdecl f1 (int)",函数 main 中引用了该符号为什么?因为 inline 函数在编译时就直接展开了,展开之后就没有函数地址了。普通函数声明定义分离时,链接器会去其他 .obj 文件里找函数地址;
2026-09-07 12:59:09
170
原创 C++ 入门笔记(二):从 C 到 C++,我被引用绕了三天
<think>我们根据要求,需要生成≤150字的文章摘要。内容关于C++入门笔记,包括缺省参数、函数重载、引用等。摘要要简洁概括。字数限制150字以内。我们写一段摘要,涵盖主要点。</think>一位C语言学习者学习C++初体验,重点记录缺省参数须从右向左连续、函数重载依赖名字修饰,以及最困惑的引用:别名本质,底层类似const指针,能简化二级指针传参、作为返回值实现左值操作,但不可返回局部变量引用。笔记总结引用与指针区别,并强调C++在语法层面引导新思维方式。
2026-09-06 00:39:22
251
原创 八大排序系列(收尾):从入门到复盘,八种排序算法的完整梳理与学习感悟
如果说给同样在学排序的新手一条最实用的建议,我会说:不要上来就背代码、背复杂度。先抓住每个算法的核心思想,知道它是解决什么问题、靠什么优化的,再去抠实现细节。理解了底层逻辑,复杂度、稳定性这些特性根本不用死记,自己就能推导出来。
2026-08-31 17:57:14
156
原创 通勤路上复盘C++第一课:难,但值得啃
对我这种习惯碎片化复习的人来说,一份结构清晰的板书价值太高了。预习的时候能顺着框架摸清楚重点,复习的时候能快速串起整节课的逻辑。更重要的是,以后哪天遇到模糊的知识点——明明记得老师讲过,但就是想不起来细节——不用在厚厚的教材里大海捞针,翻板书就能快速找回当时的理解,省了很多无用功。它就像学习路上的锚点,哪怕印象模糊了,也能顺着框架快速找回来。至于接下来的计划,倒没着急列长长的书单。先把眼下的C++基础学透嚼烂,把每一个概念都啃扎实,比囫囵吞枣读多少本都强。慢慢来,比较快。
2026-08-31 16:50:17
175
原创 八大排序系列(六):计数排序 —— 跳出比较框架,用统计思想实现排序
在我看来,计数排序最适合的场景非常明确:数据是整数(或可以映射为整数),且取值范围不大、元素种类有限。比如年龄排序、百分制分数排序、状态枚举值排序这类场景,数据范围固定且很小,用计数排序的效率会远超所有 O (nlogn) 的比较排序。但如果是通用的、取值范围不确定的数值排序,计数排序就很难胜任了,这也是它没法成为通用排序算法的核心原因。
2026-08-17 22:29:47
159
原创 八大排序系列(五):堆排序 —— 数据结构赋能算法,从选择排序到 O (nlogn) 的进化
很多初学者会误以为建堆是 O (nlogn),觉得 “每个节点下沉一次,深度是 logn,n 个节点就是 nlogn”。其实这个结论只对「向上调整建堆」成立。如果用「从下往上的下沉调整」建堆,复杂度其实是 O (n)。核心原因是:越靠下的节点数量越多,但需要下沉的层数越少;越靠上的节点下沉层数多,但数量少。把每一层的节点数乘以该层的最大下沉深度,求和之后整体是收敛的,最终的总操作量和 n 是线性关系,而不是 n 乘以树高。这也是堆排序一个很反直觉但很重要的知识点。
2026-08-16 22:30:33
235
原创 八大排序系列(四):归并排序 —— 分治思想的另一条路径,稳定排序的代表
本文深入解析归并排序的核心思想与特性,通过对比快速排序揭示两种分治路径的本质差异:快排侧重"分区+递归",排序在递归前完成;归并排序则采用"先递归拆分,再合并排序"的路径,排序工作集中于合并阶段。文章详细阐述了递归与迭代两种实现方式,指出归并排序具有稳定的O(nlogn)时间复杂度、天然稳定性和必然的O(n)空间开销三大特性。虽然在内排序场景中空间效率不如快排,但归并思想在外排序领域(处理超大规模数据)具有不可替代的优势。最后作者分享了学习过程中的调试心得,强调分治思
2026-08-15 22:46:11
195
原创 八大排序系列(三):快速排序 —— 分治思想下的排序效率之王
上一篇我们聊完了希尔排序,它通过增量分组的思路,把插入排序的性能从 O (n²) 往前推进了一步。但真正彻底打破 O (n²) 壁垒、成为工业界排序首选的,还是我们今天的主角 —— 快速排序。它既是分治思想最经典的落地实现,也是面试最高频的排序算法,没有之一。
2026-08-14 22:05:00
173
原创 八大排序系列(二):希尔排序 —— 插入排序的增量进化之路
【摘要】希尔排序是对插入排序的优化升级,通过增量分组预排序使数组趋于基本有序,再通过最终插入排序实现完全有序。其核心在于增量序列的选择,常见如Knuth序列能平衡排序轮次与工作量。希尔排序突破O(n²)时间复杂度但不稳定,性能受数据分布影响较大。相比高级排序(如快排)在小数据量时切换为插入排序的横向优化策略,希尔排序属于纵向深度改造。尽管因性能波动未成主流,其"粗调+精调"的分治思想具有广泛借鉴意义,体现了优化复杂问题的分步处理智慧。
2026-08-13 22:23:13
230
原创 八大排序系列(一):从冒泡、选择、插入说起,夯实 O (n²) 基础排序的本质
本文是排序算法系列的第一篇,重点分析了三种基础O(n²)排序算法:冒泡排序、选择排序和插入排序。作者从工程实践角度提出了排序算法的评价维度(时间复杂度、空间复杂度、稳定性和原地性),并详细剖析了每种算法的核心思想、优化技巧和特性差异。通过对比发现,插入排序在实际工程中价值最高,尤其在数据量小或近似有序时表现优异;冒泡和选择排序则更具教学意义。文中还记录了作者学习过程中遇到的典型问题(如边界条件处理)和待解疑问(如插入排序为何适合小区间优化),为后续学习更高效的排序算法奠定了基础。
2026-08-12 21:45:27
189
原创 初学二叉树:从概念到递归,我的理解与思考
简单说,节点的度就是它有几个孩子。度为 0:没有孩子,也就是叶子节点度为 1:只有一个孩子,单分支节点度为 2:左右孩子都有,双分支节点我自己记的时候就类比树枝:一根枝条分到最末端、不再分叉的地方就是叶子;分一个叉就是单分支,分两个叉就是双分支。这里有个容易混淆的点:叶子节点是「度为 0 的节点」,不等于「最下面一层的所有节点」。严格来说,只要没有孩子,无论在哪一层都是叶子节点,只不过最底层的节点天然都是叶子。
2026-07-20 01:54:52
234
原创 数据结构学习笔记:堆(大顶堆 / 小顶堆)入门复盘与认知迭代
写完栈和队列的学习笔记后,我先回头修正了队列入门时的一个认知偏差:最开始觉得链表实现队列更直观高效,深入理解循环队列后才明白,工程里反而更常用数组实现的循环队列。链表队列内存分散、频繁申请释放的开销,在实际工程里往往不可接受;数组内存连续、访问速度快的优势,才更贴合生产环境的性能需求,链表队列只适合数据量极不确定、操作不频繁的小众场景。带着这种 “认知会随着理解深入不断迭代” 的感受,我继续往下学了堆。趁热把这段学习过程、思考和踩坑记录下来,算是对树形结构入门的一次阶段性整理。
2026-07-05 23:58:58
312
2
原创 数据结构学习笔记:队列入门与深度反思(附与栈的对比思考)
对比栈是 “只有一个口的水杯”,队列是 “两端通透的管道”,两个模型放在一起对比,从一开始就没把两者的特性搞混。普通数组队列的头尾指针只会单向后移,出队空出来的前部空间没法复用,最终会出现 “前面空着、后面堵死,明明有空间却入不了队” 的假溢出。至于结构体的设计,把 front、rear、有效元素个数、总容量一起封装进去,属于线性表实现的常规操作,整体思路和栈是相通的。第一,先建立具象认知。说到队列的实际应用,我印象最深的场景是聊天消息:先发送的消息先展示出来,后发的排在后面,完全贴合先进先出的特性。
2026-07-05 00:21:21
167
原创 数据结构学习笔记:我对栈的入门理解与思考
就像一个人吃饭会剩一点饭,另一个人每一口都要多占点空间,在数据量不大的场景下,两者的空间差距其实很有限,至少我目前练习的量级里,几乎感知不到区别。如果抽象概念理解费劲,就把它具象化——想象成一个水杯、一摞书,画个简单的示意图,顺着入栈、出栈的流程捋一遍,逻辑一下就通了。两个栈模拟一个队列的思路,把栈“后进先出”的特点反过来用,做完之后对栈的特性就熟悉了很多。最近在系统学习数据结构,栈是我接触比较早的基础结构,趁着理解还新鲜,把这段学习过程和自己的思考整理下来,也算是给自己的学习留个印记。
2026-07-03 23:33:19
242
原创 关于我的一个月的C语言学习计划的感受
3来到指针环节,和数组结合起来学习后,我渐渐不明白为什么外部定义函数调用参数时intARR[],但内部用时只要填ARR就行了,我试着理解,发现程序面对数组,只要知道首地址就行了,就引出了对[]的理解,原来这个[]就是类似*的作用,前后现场闭环,茅塞顿开,这也让我更清楚的明白二阶指针,什么时候在想打印内容什么时候打印几阶指针。不一会儿功夫,一个月过去了,从一开始的printf到后面数组再到指针,现在正在和指针做斗争中,可能🤔我学的比较慢吧,等6月份课结了大概就能一整个投入了💪。
2026-05-11 17:10:17
46
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅