现代 C++ 实战(27):协程与 Actor 模型
第 26 篇 的两个练手项目收尾了数据结构;系列最后一篇进入现代 C++ 的两条并发进阶路线:C++20 协程让异步代码像同步一样写,Actor 模型让并发像发消息一样简单。 demo:ref/cpp_demo/projects/learning_guide/(coroutine/ + actor/)。 这是「现代 C++ 实战」系列的第 27 篇(收官)。建议先读 第 12 篇:多线程基础 和 第 14 篇:线程池。 一、协程基础:三个关键字C++20 协程用编译器魔法把异步逻辑写成顺序代码: 关键字 作用 示例 co_yield 产生一个值并挂起 Generator co_await 等待异步操作完成 Task co_return 协程返回 结束协程 123456789Generator<int> counter(int max) { for (int i = 1; i <= max; ++i) { co_yield i; // 产生值,挂起 }}for (...
现代 C++ 实战(26):LRU 缓存与 JSON 解析器
第 25 篇 给服务加了持久化;本篇是两个经典练手项目:LRU 缓存练数据结构设计,JSON 解析器练递归下降与 std::variant——都是面试高频、又能深入理解 C++ 现代特性。 demo:ref/cpp_demo/projects/learning_guide/(lru_cache/ + json_parser/)。 这是「现代 C++ 实战」系列的第 26 篇。建议先读 第 20 篇:栈、队列与链表(LRU 底层)和 第 24 篇:HTTP 服务与 JSON(nlohmann/json)。 一、LRU 缓存:设计思路LRU(Least Recently Used)——缓存满时淘汰最久未使用的项。要求 get 和 put 均 O(1)。 123456unordered_map<K, iterator> list<pair<K,V>>┌─────────────────┐ ┌──────────────────────┐│ key1 → iter1 ───┼─────────>│ (k...
现代 C++ 实战(25):SQLite 数据库实战
第 24 篇 的 HTTP 服务把数据存在内存里,重启即失;SQLite 把数据库装进一个文件——零配置、嵌入式、全球部署量最大的数据库引擎。本篇用 C++ RAII 封装 DatabaseManager,实现学校管理系统的完整 CRUD。 demo:ref/cpp_demo/database/sqlite3/。 这是「现代 C++ 实战」系列的第 25 篇。建议先读 第 24 篇:HTTP 服务与 JSON。 一、为什么选 SQLite? 特点 说明 零配置 无需安装数据库服务,打开文件即用 单文件 整个库在一个 .db 文件中,备份 = 复制文件 嵌入式 以库形式链接进进程,无网络开销 ACID 支持事务,数据一致性有保障 跨平台 iOS/Android/桌面/浏览器(WASM)均内置 12345应用进程 │ ├─ DatabaseManager (C++ 封装) │ └─ libsqlite3.so ──→ school.db (单文件) 适用场景:移动 App 本地存储、桌面工具、原型...
现代 C++ 实战(24):HTTP 服务与 JSON
第 23 篇 收官第三季算法篇;第四季进入工程实战。第一篇从最常见的后端能力入手:用 cpp-httplib 搭 HTTP 服务,用 nlohmann/json 处理 JSON——几十行代码就能跑起一个 REST 接口。 demo:ref/cpp_demo/networking/http_json/。 这是「现代 C++ 实战」系列的第 24 篇,第四季开篇。建议先读 第 01 篇:CMake 与现代构建(FetchContent)和 第 23 篇。 一、HTTP 基础速览1234567客户端 服务端 │ GET /camera HTTP/1.1 │ │ Host: localhost:8080 ────────→ │ 路由匹配 → 处理 → 响应 │ │ │ ← HTTP/1.1 200 OK │ │ Content-Type: image/jpe...
现代 C++ 实战(23):字符串搜索与动态规划
第 22 篇 的图算法处理「关系」;本篇进入算法面试的两大支柱:字符串搜索(在文本中找模式)和动态规划(把大问题拆成重叠子问题)。KMP 和 Boyer-Moore 解决搜索,背包和 LCS 解决 DP——掌握这些,LeetCode 中等题大半有思路。 demo:ref/cpp_demo/algorithms/string_search/ + ref/cpp_demo/algorithms/dynamic_programming/。 这是「现代 C++ 实战」系列的第 23 篇。建议先读 第 22 篇:图算法。 一、字符串搜索全景在文本 text(长度 n)中查找模式 pattern(长度 m): 算法 时间 思路 适用 暴力 O(nm) 每个位置逐字符比 短模式、教学 KMP O(n+m) 前缀函数,失配不回退 text 通用、面试必考 Boyer-Moore 最好 O(n/m) 从右向左,坏字符跳跃 长模式、实际文本搜索 Rabin-Karp 平均 O(n+m) 滚动哈希,先比哈希再验证 多模式匹配 1234text: A ...
现代 C++ 实战(22):图算法
第 21 篇 的树是一对多分支;图则允许任意顶点之间连边——社交网络、路由表、任务依赖、编译单元关系,本质都是图。BFS 找最短、DFS 探路径、Dijkstra 算权重、拓扑排序排依赖——四大经典算法覆盖 90% 的工程场景。 demo:ref/cpp_demo/algorithms/graph/(graph.h、bfs、dfs、dijkstra、topological_sort)。 这是「现代 C++ 实战」系列的第 22 篇。建议先读 第 21 篇:树结构全家桶。 一、图的两种表示顶点 V、边 E。两种存储方式,时空权衡不同: 表示 空间 查边 遍历邻居 适用 邻接矩阵 O(V²) O(1) O(V) 稠密图、频繁查边 邻接表 O(V+E) O(度) O(度) 稀疏图、遍历为主 123456邻接矩阵(6 顶点) 邻接表 0 1 2 3 4 5 0 → [1, 2]0 [ 0 1 1 0 0 0 ] 1 → [3]1 [ 0 0 0 1 0 0 ] 2 → [...
现代 C++ 实战(21):树结构全家桶
第 20 篇 的链表是「一对一」串联;树则是一对多的分支结构。从二叉搜索树到 AVL、红黑树、B 树、堆——五种经典树形结构,覆盖了内存索引、STL 容器、优先队列和磁盘存储的核心场景。 demo:ref/cpp_demo/algorithms/tree/(binary_tree、avl_tree、red_black_tree、b_tree、heap)。 这是「现代 C++ 实战」系列的第 21 篇。建议先读 第 20 篇:栈、队列与链表。 一、五种树,一张选型地图 结构 平衡策略 查找 插入 典型场景 BST 无保证 O(h) O(h) 教学、小规模有序数据 AVL 严格平衡 O(log n) O(log n) 查找密集、更新较少 红黑树 近似平衡 O(log n) O(log n) std::map / std::set B 树 多路平衡 O(log n) O(log n) 数据库索引、文件系统 堆 堆序性质 O(n) 查任意 O(log n) 优先队列、Top-K 12345678910111213BST(可能退化成链) ...
现代 C++ 实战(20):栈、队列与链表
第 19 篇 的哈希表用数组 + 指针组织数据;再往前退一步,有三种几乎无处不在的基础结构:栈(LIFO)、队列(FIFO)、链表(动态串联节点)。实现简单,却是表达式求值、BFS、LRU 的底座。 demo:ref/cpp_demo/algorithms/stack_queue_list/(stack_demo、queue_demo、linked_list_demo)。 这是「现代 C++ 实战」系列的第 20 篇。建议先读 第 19 篇:哈希表。 一、三种结构一句话 结构 规则 典型操作 栈 Stack 后进先出 LIFO push / pop / top 队列 Queue 先进先出 FIFO enqueue / dequeue / front 链表 Linked List 节点 + 指针串联 头插、尾插、删除、遍历 12栈: push → [30][20][10] ← top 队列: front → [10][20][30] ← back链表: head → (30) → (20) → (10)...
现代 C++ 实战(19):哈希表实现
第 18 篇 用 std::sort 做 O(log n) 查找前的准备;哈希表把查找压到平均 O(1)——键经哈希函数映射到桶,碰撞用链地址或开放寻址解决。理解这两条路,就摸清了 std::unordered_map 的底层地图。 demo:ref/cpp_demo/algorithms/hash_table/(链地址、线性探测、双重哈希 + 与标准库性能对比)。 这是「现代 C++ 实战」系列的第 19 篇。建议先读 第 18 篇:排序算法。 一、哈希表在干什么? 操作 平均时间 思路 插入 O(1) index = hash(key) % bucket_count 查找 O(1) 同 index,再比对 key 删除 O(1) 定位后删节点或标记槽位 碰撞(collision):不同 key 算出同一 index。解决策略分两大类: 12链地址法: bucket[i] → (k1,v1) → (k2,v2) → …开放寻址: table[i], table[i+1], … 在同一数组里探测下一个空位 二、哈希函数好哈希函数:确定性、均匀分...
现代 C++ 实战(18):排序算法与 std::sort
第二季讲完语言与工程,第三季进入算法与数据结构。排序是第一课:手写七种经典算法理解原理,再和 std::sort 做性能对比——感受工业级实现为何快一个数量级。 demo:ref/cpp_demo/algorithms/sorting/(含 7 种手写排序 + benchmark)。 这是「现代 C++ 实战」系列的第 18 篇,第三季开篇。建议先读 第 17 篇:C++23 新特性。 一、排序算法全景 算法 平均时间 最坏 空间 稳定 比较? 冒泡 O(n²) O(n²) O(1) ✅ 是 选择 O(n²) O(n²) O(1) ❌ 是 插入 O(n²) O(n²) O(1) ✅ 是 归并 O(n log n) O(n log n) O(n) ✅ 是 快速 O(n log n) O(n²) O(log n) ❌ 是 堆 O(n log n) O(n log n) O(1) ❌ 是 计数 O(n + k) O(n + k) O(n + k) ✅ 否 std::sort O(n log n) — O(log n) ❌ 是(IntroSo...










