<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[feng_qi0325的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/feng_qi0325</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; feng_qi0325]]></copyright><item><title><![CDATA[【C++】一套代码如何同时支撑 set 和 map？哈希桶泛型封装与跨桶迭代器全解析]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/166493836</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/166493836</guid><author>feng_qi0325</author><pubDate>Wed, 23 Sep 2026 22:45:44 +0800</pubDate><description><![CDATA[这篇笔记接着上一篇的哈希桶，把它改造成能同时支撑 unordered_set 和 unordered_map 的泛型结构。我按顺序讲清楚三件事：用 K、T、KeyOfT 完成泛型改造，让一套代码同时容纳 set 的 K 模型和 map 的 KV 模型；给迭代器加上哈希表指针，解决桶尾怎么跨桶前进，再用 Ptr、Ref 双参数一次搞定 const 迭代器；最后套壳封装两个容器，并用 const 从编译期管住 key。末尾还聊了自定义类型做 key 的两个坑，以及 reserve 提前扩容的实测收益。]]></description><category></category></item><item><title><![CDATA[【MySQL】类型合法的脏数据谁来拦？表约束上篇：非空、默认值、zerofill 与主键]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/166493759</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/166493759</guid><author>feng_qi0325</author><pubDate>Wed, 23 Sep 2026 22:41:22 +0800</pubDate><description><![CDATA[类型对上就万事大吉了吗？远不止。这篇里我先把"为什么需要约束"讲透——类型只管格式和范围，管不了业务合法性，学号列照样能存下 QQ 号。然后逐个拆开五种表级约束：not null 与 default 各管一段，一个看守显式插入的值，一个负责省略的列，连报错文案都不同；comment 只是写给维护者看的软约束；zerofill 补零只动显示不动存储。最后是主键，为什么它隐含非空、冲突为何报 1062，以及复合主键如何把多列当一个整体来保证唯一。]]></description><category></category></item><item><title><![CDATA[【C++】哈希冲突怎么办？开放定址与哈希桶从原理到实现]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/166254923</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/166254923</guid><author>feng_qi0325</author><pubDate>Mon, 21 Sep 2026 21:14:13 +0800</pubDate><description><![CDATA[这篇笔记聊聊 C++ 的哈希表：先从 unordered_map、unordered_set 和 map、set 的差异说起，再回答两个底层问题——值怎么映射到位置？冲突了怎么办？我带你把开放定址法（三态标记、线性探测、负载因子控制）和哈希桶拉链法（头插、扩容挪节点）各实现一遍，还有 string 做 key 的 BKDR 哈希与模板特化。跟着敲完，哈希表对你就不再是黑箱。]]></description><category></category></item><item><title><![CDATA[【MySQL】越界的数据为什么插不进去？数据类型即约束——整型/浮点/字符/日期全解析]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/166254825</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/166254825</guid><author>feng_qi0325</author><pubDate>Mon, 21 Sep 2026 21:10:48 +0800</pubDate><description><![CDATA[这篇笔记把 MySQL 常用数据类型按数值、字符串、日期时间、聚合四类完整梳理了一遍，重点不在罗列语法，而是要让你体会到：类型本身就是数据库的第一道约束。整型越界报错、float 先四舍五入再查越界、char 与 varchar 的分配差异、enum 和 set 的下标与位图存储，我都配了课堂实测和对比。读完你就能按场景选出合适的类型，并且理解为什么乱插的数据永远进不了库。]]></description><category></category></item><item><title><![CDATA[【C++】map、set 的底层是什么？红黑树五条性质、插入旋转到模拟实现]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/166142883</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/166142883</guid><author>feng_qi0325</author><pubDate>Sun, 20 Sep 2026 23:48:21 +0800</pubDate><description><![CDATA[这篇笔记把 map 和 set 的底牌翻给你看：它们的底层就是红黑树。我会从五条性质讲起，重点拆解插入时的变色与旋转这套核心机制，再用实测数据对比红黑树与 AVL 树的性能，接着实现迭代器，最后用这棵树把 set 和 map 完整封装出来——让你既会用容器，也看得懂容器的内脏。]]></description><category></category></item><item><title><![CDATA[【MySQL】建库就是建目录？字符集校验规则、备份恢复与alter改表实操]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/166142819</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/166142819</guid><author>feng_qi0325</author><pubDate>Sun, 20 Sep 2026 23:41:33 +0800</pubDate><description><![CDATA[这篇笔记里，我带你从"认识"跨到"上手"：建库不过是在数据目录下建个同名目录，删库就是连目录一起删掉。字符集与校验规则怎样决定存储编码与比较排序，我掰开揉碎讲给你听，再顺手把 mysqldump 备份恢复也过一遍。后半程转到表，从创建查看到修改删除，对比 MyISAM 与 InnoDB 的落盘文件，看清 alter table 每一步到底动了什么。希望你读完，每写一条 SQL 都能想到它在 Linux 上对应的动作。]]></description><category></category></item><item><title><![CDATA[【MySQL】数据库到底是什么？建库就是建目录、建表就是建文件]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/165892135</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/165892135</guid><author>feng_qi0325</author><pubDate>Fri, 18 Sep 2026 23:54:26 +0800</pubDate><description><![CDATA[这篇笔记想帮大家想明白一件事：数据库到底是什么。我们会先分清 mysql 客户端和 mysqld 服务端，再亲手建库建表，直观看到建库就是建目录、建表就是建文件，从而理解为什么数据不能直接塞进普通文件。随后梳理主流数据库的选择逻辑、MySQL 三层架构、SQL 三大分类与插件式存储引擎，为后续操作打好地基。]]></description><category></category></item><item><title><![CDATA[【C++】AVL 树如何自动保持平衡？四种旋转、平衡因子更新与完整代码实战]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/165892002</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/165892002</guid><author>feng_qi0325</author><pubDate>Fri, 18 Sep 2026 23:40:16 +0800</pubDate><description><![CDATA[这篇笔记把 AVL 树最难啃的旋转一次讲透。我先回顾平衡因子和向上更新的规则，再用抽象图说清单旋的手感，以及折线形状为什么必须拆成双旋。代码部分逐行核对三叉链要维护的三份父指针，也讲了双旋里最绕的平衡因子分情况赋值。最后给出 isBalance 的验证思路，连课堂上漏写两行清零代码被调试抓出来的过程也一并分享。看完你就能写出真正平衡的 AVL 树。]]></description><category></category></item><item><title><![CDATA[【Git】远程分支删了本地还在、两个分支历史不相干？两招故障排解]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/165309288</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/165309288</guid><author>feng_qi0325</author><pubDate>Mon, 14 Sep 2026 13:49:12 +0800</pubDate><description><![CDATA[这篇笔记攒了我实际踩过的两个 Git 坑。一个是远程分支早就删了，本地 git branch -a 却还挂着它们，用 git remote show origin 看出 stale、再 git remote prune 清理即可；另一个是两个分支压根没有共同祖先，Git 会直接拒绝合并，文中给了诊断法和 --allow-unrelated-histories 的用法，还结合本 vault 的真实案例完整走了一遍。希望同样掉坑的你，看完就能自己爬出来。]]></description><category></category></item><item><title><![CDATA[【C++】set 和 map 凭什么既高效又有序？从二叉搜索树到关联式容器实战]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/165307667</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/165307667</guid><author>feng_qi0325</author><pubDate>Mon, 14 Sep 2026 13:30:14 +0800</pubDate><description><![CDATA[这片笔记我从二叉搜索树讲起，把关联式容器为什么能有序、为什么查找快讲清楚，再依次带出 set、multiset、map、multimap 的用法。重点落在 map 的 operator[]——它凭什么一句话就能统计词频。最后用四道实战题让你感受容器的降维打击，并顺手铺垫 AVL 树，为后面的红黑树与模拟实现铺路。]]></description><category></category></item><item><title><![CDATA[【Git】多人协作推送总被拒绝？同分支与多分支两种协作模式全流程详解]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/165242351</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/165242351</guid><author>feng_qi0325</author><pubDate>Sun, 13 Sep 2026 20:25:08 +0800</pubDate><description><![CDATA[这篇笔记我用两个可复现的场景把 Git 多人协作讲透：一是两位开发者挤在同一分支上，推送被拒、pull 出冲突、手动合并；二是每人各建 feature 分支，推送一路畅通，最后走 PR 合并到 master。我也整理了追踪连接的建立方式，以及"永远在功能分支上解决冲突"这条企业级铁律。]]></description><category></category></item><item><title><![CDATA[【C++】模板为什么不能分离编译？非类型参数、特化与 typename 一次讲透]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/165240419</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/165240419</guid><author>feng_qi0325</author><pubDate>Sun, 13 Sep 2026 17:33:11 +0800</pubDate><description><![CDATA[我这篇笔记把模板进阶的四块内容一次讲完了：非类型模板参数让常量也能当参数，顺便看清了 array 为什么鸡肋；typename 在模板里为什么必不可少；特化部分，重点是用 less<Date*> 特化解决了 priority_queue 存指针排序乱的老问题；最后回答一个高频疑问——模板为什么不能分离编译，并给出最佳实践。配合上一篇模板初阶，模板语法体系到此完整，希望帮你一次打通。]]></description><category></category></item><item><title><![CDATA[【Git】代码只能存在自己电脑上？远程仓库、SSH 克隆与 push/pull 协作全流程]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/164879343</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/164879343</guid><author>feng_qi0325</author><pubDate>Thu, 10 Sep 2026 20:01:41 +0800</pubDate><description><![CDATA[这篇文章我们聊聊 Git 远程操作。本地仓库玩得再熟，代码也只能躺在自己电脑里，没法协作还有丢失风险。所以我们先理清分布式的思路，再到 Gitee 创建远程仓库，走通 HTTPS 与 SSH 两种克隆方式，把 push 和 pull 这对动作讲透——代码怎么推上去、怎么拉下来。最后整理了 .gitignore 和命令别名两个实用技巧，帮你填平协作路上的坑。]]></description><category></category></item><item><title><![CDATA[【C++】大堆怎么变小堆？priority_queue 与仿函数从原理到模拟实现]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/164877582</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/164877582</guid><author>feng_qi0325</author><pubDate>Thu, 10 Sep 2026 19:56:14 +0800</pubDate><description><![CDATA[上一篇聊完栈和队列，这篇我接着讲适配器家族的第三员 priority_queue。它本质就是堆，默认是大堆，底层却用 vector 存储。我会带你重温向上、向下调整，动手模拟实现一遍，再引出这一小节真正的重点——仿函数。看懂它，你就明白为什么只换个模板参数，大堆就能变成小堆，甚至能自定义任意比较规则。]]></description><category></category></item><item><title><![CDATA[【C++】还在手写栈和队列？容器适配器是什么——deque 底层如何做到头尾 O(1)]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/164341562</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/164341562</guid><author>feng_qi0325</author><pubDate>Thu, 03 Sep 2026 23:57:18 +0800</pubDate><description><![CDATA[这篇笔记聊 C++ 的 stack 和 queue：它们不是容器，而是封装底层容器的"适配器"，所以用起来格外简单。我们从适配器模式讲到亲手模拟实现，再深入默认底层 deque——中控数组加缓冲数组，为何头尾操作都能做到 O(1)，也解释了为什么 queue 不能用 vector 适配。最后用最小栈、出入栈序列匹配、层序遍历三道经典题，带你把栈和队列真正用起来。]]></description><category></category></item><item><title><![CDATA[【Git】为什么要用分支？从创建合并到冲突解决与紧急Bug修复实战]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/164341399</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/164341399</guid><author>feng_qi0325</author><pubDate>Thu, 03 Sep 2026 23:43:00 +0800</pubDate><description><![CDATA[这篇文章用武侠村「本尊与分身」的故事帮你建立直觉：分支其实只是指向提交的指针，创建、切换、合并是它的全部核心操作。文中从创建分支讲起，一步步演示提交、快进合并与冲突解决，也讲清了 master 为何必须稳定、团队协作时分支如何各司其职。最实用的要数开发到一半遇到线上紧急 Bug 的场景——如何用 git stash 保存现场、修完 Bug 再无缝恢复，以及"两步合并法"这类少有人讲的实战经验。读完你就能像老手一样安全地玩转分支。]]></description><category></category></item><item><title><![CDATA[【C++】为什么 list 插入删除都是 O(1)，排序却比 vector 慢 5 倍？从原理到模拟实现]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/164126987</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/164126987</guid><author>feng_qi0325</author><pubDate>Thu, 27 Aug 2026 23:50:31 +0800</pubDate><description><![CDATA[这篇文章带你彻底吃透 STL 的 list 容器：从带头结点的双向循环链表结构讲起，对比它与 vector 在随机访问、插入删除、内存布局上的根本差异，再逐一拆解 sort、splice、merge 等独有操作，并附上实测数据——list 排序比 vector 慢 5 倍，最优策略是转 vector 排序再转回。最后手写模拟实现，把迭代器设计、深浅拷贝这些面试硬核全部讲明白。]]></description><category></category></item><item><title><![CDATA[【C++】vector 凭什么能动态扩容？从三指针源码到迭代器失效全解析]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/164086255</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/164086255</guid><author>feng_qi0325</author><pubDate>Wed, 26 Aug 2026 13:26:30 +0800</pubDate><description><![CDATA[这篇笔记带你把 vector 彻底弄明白：先像用 string 一样学会构造、遍历和容量管理，再钻到 SGI 源码里看三指针设计和定位 new 的奥秘。扩容为什么是 2 倍、迭代器为什么会失效、手写 mini vector 会踩哪些坑，都讲得清清楚楚。看完你就能理解"连续存储"背后的设计哲学，也为学 list、deque 打下基础。]]></description><category></category></item><item><title><![CDATA[10.C++ string 实现详解]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/164035310</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/164035310</guid><author>feng_qi0325</author><pubDate>Mon, 24 Aug 2026 23:49:42 +0800</pubDate><description><![CDATA[这篇文章带着你手写一个 string 类，把标准库背后的故事讲明白：成员怎么设计、扩容怎么翻倍、插入删除时数据怎么挪、深浅拷贝为什么必须做，再到 swap 优化、写时拷贝 COW 这些进阶技巧，顺带踩遍无符号越界的坑。读完你就能从"会用"进阶到"懂底层"，面试也不慌。]]></description><category></category></item><item><title><![CDATA[【daily practice】最长数字串怎么找？岛屿数量如何沉岛秒数？六棍拼两三角形有几种验法？（5.字符串中找出连续最长的数字串、岛屿数量、拼三角）]]></title><link>https://blog.youkuaiyun.com/feng_qi0325/article/details/164003976</link><guid>https://blog.youkuaiyun.com/feng_qi0325/article/details/164003976</guid><author>feng_qi0325</author><pubDate>Sun, 23 Aug 2026 22:48:06 +0800</pubDate><description><![CDATA[这篇文章整理了三道笔试常考题。第一道用双指针扫描字符串，找出连续最长的数字串，还要留意没有数字时的边界情况；第二道岛屿数量走 FloodFill 思路，BFS 或 DFS 把相连的陆地"沉岛"即可计数；第三道拼三角，六根棍子枚举 20 种分组足够，排序后还能归纳成 4 种固定模式。每道题都附完整代码和复杂度分析，笔试前翻一翻很划算。]]></description><category></category></item></channel></rss>