- 博客(30)
- 收藏
- 关注
原创 手撕 C++ priority_queue:二叉堆 + 模板仿函数 + 模板特化(保姆级逐函数拆解)
本文手写简化版std::priority_queue,深入解析其底层二叉堆原理与STL设计精髓。基于完全二叉树的数组存储实现,利用下标公式(父= (child-1)/2,左孩= parent×2+1)保证O(1)访问堆顶。通过模板参数T、Container、compare实现容器适配器模式,强调仿函数(functor)优于函数指针:支持内联、可携带状态、统一接口。重点解决指针比较问题,通过模板全特化Less<int*>实现按值比较。核心函数push(尾插+上浮)、pop(交换末尾+下沉)均保持O
2026-10-09 22:10:07
456
10
原创 C++ STL 适配器:stack & queue,从 vector/list 到 deque 深度解析
容器适配器(如stack、queue、priority_queue)不独立存储数据,而是包装底层容器,提供受限接口。STL中stack和queue默认使用deque,因其支持头尾O(1)增删、随机访问、扩容无需拷贝元素,兼顾性能与内存效率。相比vector(扩容代价高、队列头部删除慢)和list(缓存差、指针开销大),deque在分段连续内存结构下实现高效两端操作,是栈队列适配器的理想选择。
2026-10-08 22:01:19
693
9
原创 【C++ 手写 STL 容器】手撕 list 双向循环链表|迭代器模板复用 + 反向迭代器适配器 庖丁解牛
STL std::list 采用带头结点的双向循环链表实现,核心难点在于迭代器封装。通过模板参数 Ref、Ptr 实现普通与 const 迭代器代码复用,正向迭代器包装节点指针,支持 ++、-- 等操作。反向迭代器采用适配器模式,包装正向迭代器实现反向遍历,避免重复代码。容器提供 push_back、insert、erase 等接口,均在指定位置进行 O(1) 操作,且仅删除节点时迭代器失效。clear 需遍历删除有效节点,析构前释放所有内存。优点为任意位置插入删除高效,缺点是不支持随机访问、内存不连续、缓
2026-10-07 21:26:04
414
原创 手写 vector:从源码到测试,逐函数拆解一个 STL 容器
一句话读懂源码:它用三个指针(_start、_finish、_endofstorage)与裸指针迭代器,复刻了std::vector的核心行为——通过指针差实现size/capacity,扩容时通过偏移量重定位解决迭代器失效,借助SFINAE与双重重载避免构造歧义,确保深拷贝与安全操作。
2026-10-06 21:28:01
499
8
原创 c++ vector的深度使用和详解
话题要点一句话记忆遍历下标 []、迭代器 begin/end、范围 for、反向迭代器、const_iterator想改值用,想只读用下标越界operator[] 不检查,越界是未定义行为;安全用 at()[] 快但野,at() 慢但稳扩容capacity 约 2 倍增长;扩容=新内存+搬运+释放+更新push_back 均摊 O(1)中间插入删除都是 O(n);会搬移元素会失效迭代器,别再碰旧迭代器emplace 直接传构造参数,就地构造,省一次拷贝手里有对象用 push;
2026-10-05 22:09:48
501
7
原创 C++ 模拟实现 string 庖丁解牛|(分层拆解 + 可行性分析 + 缺陷踩坑)
本文手写简易版STL string,仅实现核心接口以理解底层原理。头文件定义类结构、迭代器、成员变量及运算符声明,采用 char* 封装迭代器,_str 存储堆内存字符串,_size 与 _capacity 管理长度与容量,npos 标记查找失败。源文件实现六大默认成员函数:构造函数动态分配内存并拷贝数据,析构释放资源,拷贝构造与赋值使用现代 swap 模式 实现异常安全深拷贝;reserve 预扩容,push_back/append 支持尾插,insert 实现任意位置插入,erase/pop_back/
2026-09-29 21:54:29
495
10
原创 C++ string 深度使用详解(模块细分 + 可行性分析)
本文为C++ STL string 全套实操笔记,系统解析其构造函数、遍历方式、迭代器机制、容量管理及增删查改接口,结合代码逐层拆解原理、使用场景与坑点。涵盖底层内存扩容、迭代器失效、性能优化等面试高频考点,附LeetCode 387实战题,适合复试、面试及408复习,全面掌握现代C++字符串核心能力。
2026-09-28 15:42:15
532
10
原创 C++ 进阶核心知识点总结:模板、内存分区、new/delete、内存池
本文系统讲解C++核心底层原理:函数模板通过类型推导在编译期实例化,生成独立函数;内存分为栈(局部变量)、堆(new/malloc)、静态区(全局/static)、常量区(字符串)和内核空间;new/delete包含内存分配与构造/析构调用,new[]需配对delete[]以正确析构数组;内存池通过预申请大块内存减少系统调用与碎片,提升性能,是高频面试考点。
2026-09-27 18:00:44
505
14
原创 类和对象(下)
本文系统梳理C++类与对象核心知识点:类型转换(含explicit关键字)、static静态成员(声明/定义/访问)、友元(函数/类及四大特性)、内部类、匿名对象及其生命周期,以及编译器拷贝优化(RVO/NRVO)。结合可运行代码与高频坑点,涵盖隐式转换禁用、静态成员内存归属、友元访问权限、内部类独立性、匿名对象作用域与优化机制,助力高效掌握面向对象编程关键概念。
2026-09-26 08:36:50
472
13
原创 类和对象(中)
本文系统讲解C++类与对象的核心——六大默认成员函数。重点剖析构造函数(无参、带参、初始化列表)、析构函数(资源释放与栈/堆对象生命周期)、拷贝构造(浅拷贝与深拷贝)及赋值重载(自赋值判断、深拷贝实现),强调动态资源管理中手动实现深拷贝的必要性。同时说明取地址重载的使用场景与常量性重载机制,指出编译器自动生成规则及常见陷阱(如二义性、无限递归)。掌握这些内容,可有效避免内存泄漏与悬垂指针问题,奠定面向对象编程基础。
2026-09-25 19:46:07
666
9
原创 类和对象(上)
本文系统介绍了C++中类的定义、实例化、访问限定符、类域及this指针等核心概念。类通过class关键字定义,包含成员变量与成员函数,支持封装性;访问限定符public、private控制访问权限;类域确保成员作用域清晰,需用::指定。对象实例化分配内存,遵循内存对齐规则,大小由最大对齐数决定。this指针隐式传递当前对象地址,用于区分同名变量、实现链式调用、防止自赋值等。相比C语言,C++通过类将数据与操作封装一体,提升安全性与可读性,体现面向对象编程的封装特性。
2026-09-21 22:16:03
272
8
原创 C++ 入门核心知识点|缺省参数、函数重载、引用、nullptr(附带栈代码示例)
本文系统介绍了C++相较于C语言的六大核心语法特性:输入输出流(cin/cout)提升效率与便捷性;函数默认参数需从右向左连续设置,避免歧义;函数重载通过参数列表区分同名函数,返回值不可单独作为区分依据;引用作为变量别名,常用于传参,但禁止返回局部变量引用;兼容C内存管理,支持栈结构操作;以及nullptr替代NULL解决重载歧义问题。这些基础特性是掌握C++面向对象与STL的前提,高频出现在面试与竞赛中。
2026-09-15 18:29:24
256
5
原创 C++ 命名空间详解|彻底解决命名冲突(新手零基础吃透)
C++引入命名空间(namespace)旨在解决C语言全局作用域下命名冲突频发的问题。C语言中所有标识符共享同一全局域,易导致重定义错误;而C++通过命名空间划分独立作用域,实现标识符隔离,允许多个同名变量或函数在不同空间共存。其核心语法为namespace定义与::域解析符访问,支持三种使用方式:完整限定(推荐)、using声明(折中)和using namespace(仅限小项目)。标准库功能均封装于std命名空间,大型项目严禁全局展开。命名空间还支持嵌套、分段定义及匿名私有化,提升代码模块化与安全性。掌
2026-09-14 14:35:46
247
3
原创 超详细八大经典排序算法完整解析(原理+代码+复杂度+场景)
本文系统详解八大经典排序算法,涵盖比较排序(冒泡、选择、插入、希尔、快速、堆、归并)与非比较排序(计数),从原理、代码、复杂度、稳定性到实战场景全面解析。重点剖析快排优化(三路划分)、归并稳定性、堆排序建堆逻辑及工程选型策略,总结出“通用选快排、稳定选归并、小数据选插入、大TopK选堆、整数范围小选计数”的核心原则,助力面试与开发高效落地。
2026-09-11 17:10:16
436
3
原创 【数据结构】链式二叉树 从零吃透(创建+遍历+常用操作 )
链式二叉树是普通二叉树的最优存储方式,无空间浪费、增删灵活。深度优先遍历(前/中/后)靠 递归,广度优先(层序)靠 队列。几乎所有二叉树算法:分治思想——处理当前节点 + 递归处理左子树 + 递归处理右子树。销毁树必须后序,防止野指针访问。
2026-08-26 16:55:00
310
3
原创 彻底吃透「堆」:从原理、手写实现到面试必考场景(全网超全总结)
本文系统讲解了堆这一重要数据结构,从定义、存储到核心操作。堆作为满足特殊序性质的完全二叉树,分为大根堆和小根堆,采用数组高效存储。文章详细解析了向上/向下调整两大核心操作及其应用场景(插入、删除、建堆等),提供了完整的C语言实现代码,包括初始化、入堆、出堆等接口。重点分析了堆排序的原理和特性(O(nlogn)时间复杂度、原地排序),并指出堆在算法面试和工程应用中的重要性。掌握堆的关键在于理解其父子节点关系维护机制,并能熟练实现基础操作。
2026-08-19 19:51:32
509
1
原创 一文吃透栈与队列:从原理到实战,彻底告别概念混淆
本文深入讲解了栈和队列两种基础数据结构。栈采用后进先出原则,通过动态数组实现,核心操作包括入栈、出栈等;队列遵循先进先出规则,采用链表实现,支持入队、出队等操作。文章详细分析了二者的C语言实现代码、核心功能函数和应用场景,并对比了它们的存取规则和适用领域。栈适用于需要回溯、逆序的场景,队列则适合有序排队任务处理。掌握这两种数据结构对算法学习和系统开发至关重要,是进阶学习的基础。文中还指出了新手常见的理解误区并提供了正确认知。
2026-08-16 13:30:59
339
原创 带哨兵位的双向链表
本文介绍了带头哨兵位的双向循环链表实现,解决了普通链表操作中二级指针的繁琐问题。通过引入不存储数据的哨兵节点,统一了空链表和非空链表的操作逻辑,使所有节点都拥有前驱和后继指针,避免了边界条件处理。详细讲解了节点结构、核心接口实现(包括初始化、增删改查等操作),并与无哨兵单链表进行对比,突出了带头双向循环链表在操作效率(O(1)首尾操作)、代码简洁性和稳定性方面的优势。该结构特别适合需要频繁增删、双向遍历的场景,是工程开发中的优选方案。
2026-08-15 20:08:58
567
原创 数据结构|顺序表与单链表全面对比分析(原理、操作、优缺点、场景选择)
本文对比分析了顺序表和单链表两种基础数据结构。顺序表采用连续内存存储,支持O(1)随机访问但插入删除效率低;单链表通过指针连接离散节点,插入删除高效但查找需遍历。性能方面,顺序表缓存命中率高,单链表动态扩展灵活。选择时,若需频繁随机访问用顺序表,若需频繁增删或数据量不定则用单链表。理解二者的存储原理和操作特点,能根据实际场景选择更合适的数据结构。顺序表:物理内存连续,优势随机访问;头部 / 中间插入删除需要移动大量元素。单链表:节点离散分布,依靠指针连接;插入删除只需修改指针,但查找元素必须从头遍历。
2026-08-14 21:22:29
487
1
原创 指针面试题
a+1就是跳过数组取到数组后一位的元素,(*int)就是访问这个元素,ptr-1就是前一个元素,*就是访问这个元素。通过上面的学习和练习,想必大家都对指针的题目学习有了一些进步,希望大家在未来可以前途似锦,找到一个不错的工作!因为a代表的是首元素的地址,所以a+1就是第二个元素的地址,*就是访问元素。当指向ENTER 的时候加3,就是首地址向后移动三位,最后得到的结果位ER。但是a的首元素加一 那么内存地址就加了一,原本地址就是。类型是地址,一个地址是四个字节,所以结果是。但是这里的(,)是逗号表达式。
2024-08-03 22:05:47
953
1
原创 深入了解指针(下)
/自定义qsort函数int i = 0;for (i = 0;i < width;best2++;int i = 0;//趟数for (i = 0;i < sz - 1;i++)//假设冒泡排序排好序int j = 0;//一趟冒泡排序的过程for (j = 0;j++)//cmp的参数是用来比较两个参数的地址//交换flag = 0;break;int i = 0;for (i = 0;i < sz;
2024-08-03 14:33:27
503
原创 操作符,结构体的一些从浅到深的理解
以下标注的就是地址传递,通过把指针符给函数,通过指针找到源头,把指针传给printf,打印,打印时需要使用操作符->号。以下标注的就是值传递,就是直接把值给穿递给printf来打印,打印找值时记住需要使用操作符.号。//11%2 == 1 - - -上。想要写一个好的代码,需要很小的内存和高效的效率,再提升一下难度。//如果传入的是野指针的话就会出现错误,是很危险的。// //但是实现链式访问需要返回特殊的指针类型。//失败的代码打出来的是v,列10,行5的 V。
2024-05-16 22:10:49
2071
原创 认识C语言前期所有操作符
return 0;()操作符是函数操作符int main()int a = 10;int b = 20;()不能去掉,()是函数操作符sizeof()后面的括号是可以去掉的,因为sizeof是单独的操作符而不是函数这个函数有三个操作数Add,a,breturn 0;结构成员操作符分为两种:. 操作符-> 操作符struct stuint age;. 操作符是结构体成员加 . 加参数-> 操作符是结构体指针加 -> 加参数他们两个都是等价的。
2024-05-09 14:29:09
1760
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅