自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++ 高并发线程池实战(二):动态缓存线程池 + 调用者运行拒绝策略完整版实现

动态弹性伸缩无任务→线程自动销毁;高并发→自动创建线程,直到上限。完美复用前作同步队列、超时机制、返回值状态全部复用,代码不冗余。工业级拒绝策略:调用者运行队列满 → 提交线程自己执行,保证任务不丢失。线程安全原子变量 + 互斥锁 + 条件变量,多线程高并发安全。优雅停止线程自行退出、自行从线程组移除,不崩溃、不残留。极高性能特别适合短任务、IO 密集型、高并发后端服务。本文基于上一篇固定线程池与同步队列的成果,实现了高性能动态缓存线程池 CachedThreadPool,具备。

2026-04-25 14:04:05 645

原创 【数据结构】顺序表超全总结(定义 + 代码实现 + 时间复杂度 + 面试题详解)

顺序表是线性表的顺序存储结构,用一段地址连续的内存单元依次存放数据元素,本质就是动态数组。逻辑上相邻 → 物理上一定相邻支持随机访问:通过下标 O (1) 访问元素用动态管理内存,可扩容#define INIT_SIZE 10 // 初始容量// 动态数组指针int length;// 有效元素个数// 当前总容量插入方式实现逻辑时间复杂度核心注意点头插(Insert_Seqlist_head)所有元素后移 1 位,新元素放下标 0O(n)先扩容(满了的话),再后移。

2026-04-24 18:15:52 530

原创 【改进版】C++ 固定线程池实现:基于调用者运行的拒绝策略优化

private:// 任务存储容器,deque兼顾头尾操作效率// 互斥锁,保证队列操作线程安全// 队列非空条件变量(消费者等待)// 队列非满条件变量(生产者等待)// 等待队列为空的停止条件变量// 超时等待时间(100ms),避免无限阻塞// 队列最大容量// 队列停止标志// ... 省略IsFull/IsEmpty工具函数:分别用于消费者等待任务、生产者等待队列空闲;m_waitTime:超时等待阈值,解决 “队列满时生产者无限阻塞” 问题;m_needStop。

2026-04-19 21:47:29 542

原创 C++ 实现零钱兑换(完全背包)+ 图结构 + 并查集|数据结构综合练手

模块化强:三部分独立,可单独学习面试高频:完全背包、图遍历、最小生成树、并查集全覆盖可直接运行:零钱兑换模块无依赖,复制即可跑规范清晰:打印 DP 表、菜单交互、注释完整bug 已修复:原硬币兑换判断错误已修正这份代码把动态规划、图结构、并查集三大核心知识点整合到一个文件中,非常适合用来系统复习。如果对你有帮助,欢迎,后续会持续更新数据结构与算法干货~

2026-04-16 10:00:00 292

原创 C++ 回溯法解决旅行商问题(TSP)超详细实现与讲解

本文用 C++ 实现了带剪枝的回溯法 TSP,代码结构清晰、注释完整,适合学习回溯与剪枝思想。虽然回溯法只适合小规模问题,但它是理解组合优化与 NP 难问题的绝佳入门案例。需要完整工程文件、动态规划版本 TSP 或注释更细的代码,可以在评论区留言!

2026-04-16 08:30:00 462

原创 回溯法经典实战:0/1 全排列与 N 皇后问题(递归 + 非递归双实现)

回溯法本质是试探 + 回退按路径尝试所有可能解;发现当前路径不合法 / 无解时,回退到上一步重新选择;直到找到所有合法解。基础案例:生成 n 位 0/1 全排列经典案例:N 皇后问题(算法必考题)试探→验证→回溯→再试探;0/1 全排列是回溯法入门模板,掌握选 / 不选逻辑;N 皇后是回溯法经典应用,重点理解位置合法性判断;递归适合写算法题,非递归适合实际工程使用。

2026-04-15 23:00:00 166

原创 C++ 并发编程核心:手写固定线程池,彻底搞懂生产者 — 消费者模型

private:// 任务队列(双端队列,高效入队/出队)// 互斥锁,保护队列访问// 队列非空条件变量(消费者等待)// 队列非满条件变量(生产者等待)// 等待队列空的条件变量(停止时使用)// 等待超时时间(ms)// 队列最大容量// 停止标志位// ... 后续成员函数m_queue:存储任务的双端队列,相比std::liststd::deque的随机访问和头尾操作更高效;m_mutex:保证队列操作的原子性,避免多线程竞争;m_notEmpty。

2026-04-15 18:27:37 781

原创 0-1 背包进阶:回溯法(子集树)+ 分支限界优化 极致详解(C++ 完整实现)

本篇作为0-1 背包进阶篇子集树暴力回溯:遍历所有选 / 不选组合优化回溯单位价值降序排序上界函数 bound 剪枝分支限界大幅减少递归次数完整 C++ 类实现,可直接运行、直接用于课程设计 / 面试0-1 背包三大解法全部掌握动态规划(高效)记忆化递归(好理解)回溯 + 分支限界(搜索思想、进阶必备)建议大家运行代码,观察递归次数变化,彻底理解剪枝优化的强大魅力!

2026-04-14 15:43:15 587

原创 算法详解:矩阵连乘问题(动态规划 C++ 完整实现)

m[i][j]:计算矩阵 ~ 连乘的最小乘法次数s[i][j]:记录 ~ 的最优分割位置 k(用于回溯输出加括号方案)矩阵连乘是动态规划入门必做题,核心是状态定义 + 状态转移 + 填表两个关键表:m[i][j]:存储最小乘法次数s[i][j]:存储最优分割点迭代实现效率更高,递归实现更易理解回溯函数可以输出最优计算顺序,完整解决问题。

2026-04-14 15:37:09 697

原创 动态规划经典:0-1 背包问题超详细解析(递归 + 非递归 + 路径回溯)C++ 实现

m[i][j]:表示前i个物品,放入容量为j的背包中,能获得的最大价值。状态定义m[i][j]前 i 个物品、容量 j 的最大价值转移方程实现方式递归:自上而下,记忆化搜索非递归:自底向上填表,效率更高路径回溯:对比 DP 表,反向推导选中的物品复杂度:时间 O (nc),空间 O (nc)本文完整实现了 0-1 背包的递归、非递归、路径回溯三大核心功能,代码规范、注释详细、附带表格打印调试,非常适合 C++ 新手学习动态规划。完全背包(物品可重复选)多重背包(物品有数量限制)

2026-04-13 08:30:00 443

原创 经典算法:最长上升子序列(LIS)深度解析 C++ 实现

dp[i]表示以数组中第 i 个元素结尾的最长上升子序列长度。最长上升子序列(LIS)是动态规划经典题,核心是dp[i]定义 + 状态转移初学者常见错误:只比较相邻元素,正确做法是遍历前面所有元素标准方程dp[i] = 1;最终答案 = dp 数组最大值,不是最后一个元素进阶可学习贪心 + 二分优化到 O (n log n)

2026-04-12 15:05:43 539

原创 经典算法:打家劫舍(动态规划 + 回溯求最优解)C++ 超详细解析

打家劫舍核心是动态规划状态转移方程空间优化是面试高频考点,用两个变量滚动替代数组回溯法适合需要输出具体方案的场景,掌握回溯思想,有问题评论区交流!

2026-04-12 14:05:55 504

原创 深入理解HTTP请求报文与响应报文:结构、细节及实战解析

HTTP(HyperText Transfer Protocol,超文本传输协议)是一种基于TCP/IP的应用层协议,采用“请求-响应”模式进行通信。其核心特点是无状态(每次请求独立,服务器不主动保留客户端状态)、可扩展(支持自定义请求头/响应头),目前主流版本为HTTP/1.1,同时HTTP/2也已广泛应用,在性能上进行了大幅优化。无论是请求报文还是响应报文,其基本结构高度一致,均由起始行 + 头部(Headers) + 空行 + 主体(Body,可选)四部分组成。

2026-04-12 08:00:00 556

原创 【C++ 高性能日志系统实战】第三篇:异步日志系统的实现与优化

多线程同步std::mutex(互斥锁)、(条件变量)、(原子变量);智能指针管理线程资源,避免内存泄漏;移动语义std::move转移字符串缓冲区,减少拷贝开销;生产 - 消费模型:解耦日志写入与磁盘 IO,提升并发性能;锁优化:最小化锁持有时间,通过交换队列将刷盘操作移出锁范围。本文基于原有日志系统,实现了异步日志的核心逻辑,通过 “内存缓冲区 + 后台线程” 的生产 - 消费模型,彻底解决了同步日志的性能瓶颈。

2026-04-11 21:43:29 509

原创 经典算法详解:最长公共子序列 (LCS) —— 从暴力递归到动态规划完整实现

子序列(Subsequence):不需要连续,但顺序保持不变公共子序列:两个字符串都存在的子序列最长公共子序列:长度最长的那一个示例LCS 结果B C B A或B D A B,长度 =4分析图解方法时间复杂度空间复杂度特点暴力递归O(2ⁿ)O(m+n)思路简单,效率极低记忆化递归O(mn)O(mn)避免重复计算非递归 DPO(mn)O(mn)最优解,推荐使用LCS 是动态规划经典模板题,必须掌握核心思想:相等 → 左上角 +1不等 → max (上,左)

2026-04-11 16:13:17 573

原创 经典算法详解:最大子数组和(暴力 / 分治 / 动态规划 / 线段树)

最大子数组和是动态规划的经典入门题,最优解时间复杂度O(n)、空间复杂度O(1);暴力法直观但效率低,分治法体现递归拆分思想,动态规划是工业级最优解;,舍弃负收益的前缀。本文完整实现了所有经典解法,代码可直接运行,适合算法初学者学习~有问题欢迎评论区交流!

2026-04-11 14:49:44 735

原创 从零实现高性能日志系统(二):日志落地与文件轮询机制

缓冲区优化:通过setbuffer自定义文件缓冲区,减少系统调用次数,提升写入效率;线程安全设计:分层加锁策略(LogFile层加锁,AppendFile层不加锁),避免重复锁开销;文件轮询策略:结合 “大小阈值 + 时间阈值” 实现日志文件自动切分,兼顾性能与可维护性;资源管理:使用unique_ptr管理文件句柄、缓冲区、互斥锁等资源,避免内存泄漏;系统调用封装:封装getpidtime等系统调用,提升代码可维护性。本文在上一篇基础上,完成了日志系统的 “落地” 能力,通过。

2026-04-08 17:38:18 547

原创 【算法进阶】从一维到二维:分治算法彻底搞定「最接近点对问题」(C++ 完整实现 + 超详细讲解)

一维是基础:划分 → 递归 → 检查左最大 & 右最小二维是升级:按 x 划分 → 递归求左右 → 检查带状区域分治思想统一大问题拆小递归求解高效合并复杂度:O(nlogn),远优于暴力 O(n2)

2026-04-08 11:34:12 654

原创 深入理解快速排序:从数组到链表,递归与非递归全解析

/ 链表节点定义int data;// 打印链表while (p!= nullptr)// 创建节点return s;// 头插法创建链表head = s;快排核心:划分函数(Partition),将数组 / 链表按基准值分割为两部分;两种划分:双向划分(效率高)、单向划分(易理解);两种实现:递归(代码简洁)、非递归(避免栈溢出);链表适配:基于指针遍历实现单向划分,不支持随机访问;核心优势:平均时间复杂度 O(nlogn),原地排序,应用广泛;

2026-04-07 19:36:49 340

原创 经典算法解析:整数划分 + 归并排序 (C++ 实现),重点详解归并排序递归与非递归版本

整数划分:递归思想的入门经典题,理解递归的分治逻辑;归并排序:时间复杂度稳定 O (nlogn) 的高效排序,重点讲解递归实现 + 非递归实现,适配面试、笔试、考试高频考点。所有代码均可直接编译运行,注释详细,适合新手学习~将正整数n表示成一系列正整数之和,,求划分的种类数(不考虑顺序)。q(n, m)表示将n划分,最大加数不超过 m的划分个数。归并排序核心:分治 + 合并,时间复杂度稳定O(nlogn),稳定排序;递归版:代码简洁,逻辑清晰,适合理解;非递归版:无栈溢出风险,效率更高,

2026-04-04 21:03:57 447

原创 C++ 算法与数据结构硬核总结:堆排序、优先级队列、快排、栈队列全覆盖

堆排序:向下调整、向上调整、建堆、排序完整实现优先级队列:基于小根堆手动封装(入队、出队、取堆顶)快速排序:双路划分 + 单向划分两种核心写法STL 容器:stack、queue、priority_queue 基础用法所有代码均为教学版,逻辑清晰,适合背诵和理解。堆排序小根堆:父 ≤ 子建堆 O (n),排序 O (nlogn)向下调整是核心优先级队列入队:尾插 + 向上调整出队:堆顶替换 + 向下调整快速排序分治 + 划分单向 / 双路划分都要会STL。

2026-04-04 21:03:41 316

原创 经典算法实现:二分查找、全排列与子集生成

二分查找:高效查找有序数组,重点掌握折半思想和边界处理,尤其是重复元素场景的变种;全排列:回溯法的经典应用,核心是 “交换 - 递归 - 回溯”,需理解回溯的本质是恢复现场;子集生成:通过 0-1 标记法遍历所有元素的选择状态,是回溯法解决组合问题的典型思路。这些算法是算法学习的基础,掌握其核心思想后,可拓展到更复杂的场景(如带重复元素的全排列、子集去重、二分查找的变种问题等)。建议大家手动敲写代码,调试理解每一步的执行逻辑,加深对算法的理解。

2026-04-02 00:01:31 487

原创 QT6网络编程入门:手把手教你写带UI的TCP服务端(可直接复制源码)

本文基于QT6环境,完整讲解了可视化TCP服务端的开发全流程,从开发环境准备、项目创建、UI界面设计,到核心代码实现、功能解析、编译运行注意事项,再到具体的运行演示,每一步都贴合新手入门需求,代码简洁易懂、注释清晰,可直接复制编译运行。

2026-04-02 00:00:48 503

原创 Ubuntu虚拟机下基于C++实现带时间戳的日志系统(CMake构建完整版)

本文基于 Ubuntu 环境,通过 C++ 实现了带时间戳的轻量级日志系统,采用 CMake 完成项目构建,实现了时间戳的获取与格式化、多级别日志输出等核心功能。项目结构清晰,模块化设计便于扩展,可作为 Linux 下 C++ 项目日志系统的基础模板。

2026-04-01 10:29:14 878

原创 深入理解 C++ Lambda 表达式:从基础到实战

匿名性:Lambda 是匿名函数,可通过 auto 接收其类型,直接调用或作为参数传递;捕获规则[]:无捕获;[=]:值捕获所有外部变量;[&]:引用捕获所有外部变量;[var]:值捕获指定变量 var;[&var]:引用捕获指定变量 var;[this]:类成员函数中捕获 this 指针;mutable:仅对值捕获生效,解除 Lambda 体内拷贝变量的 const 限制;灵活性:C++14 支持自动类型推导参数,可适配不同类型的输入;生命周期。

2026-04-01 10:28:40 516

原创 C++ 线程编程核心知识点全解析(从基础到进阶)

本文围绕 C++ 线程编程的核心知识点展开,从基础的线程创建、移动语义,到同步互斥(mutex/lock_guard/unique_lock)、条件变量、生产者 - 消费者模型,再到死锁避免和参数传递坑点,覆盖了多线程开发的核心场景。不可拷贝,仅可移动,join()detach()需合理使用;互斥锁优先使用 RAII 封装(lock_guard),避免手动解锁;条件变量解决线程协作问题,需配合和条件判断避免虚假唤醒;死锁的核心解决思路是 “锁排序”,优先使用;

2026-03-31 15:55:58 546

原创 Linux锁机制详解(含实战示例,面试必备)

Linux锁机制的核心是“按需选择”——没有最好的锁,只有最适合的锁。掌握各类锁的特性、适用场景和接口,不仅能解决日常开发中的并发问题,也是Linux开发者面试的核心竞争力。简单总结:用户态开发:优先用互斥锁、读写锁;短临界区用自旋锁;线程间等待唤醒用条件变量。内核态开发:中断上下文用自旋锁;进程上下文长临界区用互斥锁;读极多写极少用RCU锁。进程间同步:低频率用文件锁;高频用共享内存+互斥锁。

2026-03-31 15:08:42 656

原创 堆区(Heap)与栈区(Stack)的核心区别

栈区:自动分配、自动释放、速度快、空间小、线程独立。堆区:手动分配 / 智能指针管理、手动 / 自动释放、速度慢、空间大、全局共享。栈区自动管理,速度快、空间小,存临时变量。堆区手动 / 智能指针管理,速度慢、空间大,存长期对象。shared_ptr 只用于管理堆区对象,不能管理栈区对象。小对象用栈,大对象 / 动态生命周期用堆 + 智能指针。

2026-03-24 17:08:26 425

原创 C++ 中 shared_ptr 的创建:构造函数 vs make_shared 深度解析 + enable_shared_from_this 安全用法

s​​​​​​​是C++ 标准库为优化shared_ptr创建而设计的工具,凭借一次内存分配、高异常安全性、简洁语法成为常规场景下的首选;而直接使用构造函数创建shared_ptr则以灵活性取胜,能处理自定义删除器、私有构造、数组管理等无法覆盖的特殊场景。在实际开发中,应遵循优先使用 make_shared,特殊场景用构造函数的原则,同时注意的内存释放滞后性问题,避免因悬空的weak_ptr造成不必要的内存浪费。理解两种创建方式的底层内存实现,才能根据业务场景做出最优选择,让shared_ptr。

2026-03-24 16:55:01 616

原创 C++ weak_ptr 详解:从原理到实战,彻底解决shared_ptr循环引用

weak_ptr不是独立的智能指针,而是shared_ptr的“辅助工具”,用于解决循环引用和安全观察对象。2. 核心特性:不拥有对象、不增加强引用计数、需升级为shared_ptr才能访问对象、线程安全的lock()接口。3. 核心场景:解决shared_ptr循环引用、缓存、观察者模式。掌握weak_ptr,能让你在使用shared_ptr时更安全、更灵活,彻底摆脱循环引用导致的内存泄漏问题,写出更健壮的C++代码。最后,留一个小练习:尝试用weak_ptr。

2026-03-23 17:43:40 531

原创 C/C++ 核心知识点:值返回、引用返回、指针返回全解析

为了更清晰的区分三者,将核心差异整理为表格,涵盖返回本质、内存开销、修改能力、生命周期要求、空值支持、效率对比维度值返回引用返回指针返回核心本质返回原数据的副本返回原数据的别名返回原数据的地址内存开销有拷贝开销(创建副本)无开销(共享内存)极小(存储地址,4/8 字节)原数据修改能力无法修改可以修改(const 可限制)可以修改(const 可限制)生命周期要求无(可返回局部变量)高(不可返回局部变量)高(不可返回局部变量)空值支持不支持(必须返回有效值)

2026-03-21 20:33:25 541

原创 C/C++ 中 new 与 malloc 的核心区别与底层原理详解

​​​​​​​malloc和new作为堆内存分配的核心方式,其差异的本质是C 语言纯内存管理与C++ 面向对象内存管理malloc是 “极简的内存分配工具”,仅完成内存申请,无初始化、无对象适配,是 C 语言内存管理的基础;new是 C++ 对内存管理的升级与封装,融合了 “内存分配 + 初始化 + 对象构造 + 异常处理”,让内存管理更安全、更贴合 C++ 的开发特性。在实际开发中,C++ 项目优先使用 new/delete,仅在兼容 C 代码时才考虑 malloc/free。

2026-03-21 20:33:05 587

原创 C 语言动态内存函数深度解析:malloc、calloc、realloc 原理与实战

本文详细讲解了 C 语言 / C++ 中动态内存分配三大核心函数:malloc、calloc、realloc的用法、特性与区别,这是编程和面试中的高频考点,也是堆内存管理的基础,核心要点可以归纳为:(1)三大函数核心区别函数作用参数内存初始化核心特点malloc分配指定大小内存总字节数随机垃圾值最常用,需手动初始化calloc分配并清零内存元素个数 + 单个大小自动初始化为 0适合需要默认 0 值的场景realloc调整已有内存大小原指针 + 新大小原有数据保留,新增空间随机。

2026-03-20 16:39:58 652

原创 C++ 浅拷贝 / 深拷贝 / 移动语义 全网最细图解 + 代码实战

C++ 默认生成的拷贝构造函数和赋值运算符重载,都是浅拷贝。如果类中没有堆区资源,浅拷贝完全没问题;但如果类中有指针指向堆内存重复释放内存(程序崩溃)内存泄漏野指针 / 空悬指针只要类中有指针指向堆内存,就必须自己写深拷贝!1. 浅拷贝(1)只拷贝指针(2)多个对象指向同一块堆内存(3)析构崩溃、野指针、内存泄漏2. 深拷贝(1)重新开辟空间 + 拷贝内容(2)资源独立(3)安全但效率一般3. 深赋值(1)先释放旧内存(2)再开辟新空间(3)拷贝数据4. 移动语义(C++11)

2026-03-20 16:39:29 876

原创 C++ 核心关键字深度解析:const 与 static 的本质区别与实战指南

const(常量限定符)和static(静态关键字)都是 C++ 核心关键字,但作用完全不同。本文将从变量、指针、函数、类成员四个维度,对比两者的语法、特性与最佳实践,帮你彻底分清何时用 const,何时用 static。

2026-03-19 19:09:00 265

原创 C++手动实现共享智能指针my_shared_ptr|引用计数+删除器+完整可运行代码

本文围绕C++共享智能指针的手动实现展开,从核心概念到完整代码,详细拆解了my_shared_ptr的实现逻辑与底层原理。首先介绍了共享智能指针的核心思想——通过共享所有权管理资源,结合引用计数机制,确保资源在无人持有时自动释放,既支持堆内存,也可适配各类系统资源;随后讲解了引用计数的核心作用,通过计数器记录资源持有数量,避免频繁拷贝与内存泄漏。

2026-03-19 18:23:22 463

原创 C++智能指针从入门到手写:unique_ptr核心实现与源码剖析

智能指针 = 包装了裸指针的类 + 自动内存管理机制智能指针的本质是一个对象,不是真正的指针,行为用起来像指针(支持->),特点是生命周期结束时(离开作用域)自动调用析构函数释放内存,并且完全遵循 C++ 的RAII 机制(资源获取即初始化)本文围绕C++内存管理痛点展开,深度拆解智能指针的核心价值与实现逻辑,聚焦最常用的std::unique_ptr独占智能指针。

2026-03-17 15:41:08 964

空空如也

空空如也

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

TA关注的人

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