讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

Laper
Laper

剧本策划到成片协作

立刻MV
立刻MV

低成本歌曲 MV、视频生成

剧云
剧云

中文短剧剧本制作平台

c++怎么实现lru缓存淘汰算法_c++ map与双向链表结合实现【方法】

雨晨大大_2183

雨晨大大_2183

发布时间:2026-01-07 14:33:07

|

380人浏览过

|

来源于php中文网

原创

应手写双向链表节点+裸指针映射,因std::list+std::unordered_map易致迭代器失效;需精确控制指针、统一初始化、严格按序操作内存,哨兵模式简化边界处理。

c++怎么实现lru缓存淘汰算法_c++ map与双向链表结合实现【方法】

为什么不用 std::list + std::unordered_map 就容易出错

直接用 std::list 存值、std::unordered_map 存键到迭代器的映射,看似简洁,但实际运行时极易触发迭代器失效:比如 std::list::splice 或 erase 后,若 map 中缓存的迭代器没同步更新,下一次访问就会 undefined behavior。更隐蔽的问题是,std::list::iterator 不能跨容器复用,也不能直接保存为裸指针——必须确保 map 中的迭代器始终指向当前 list 中有效节点。

  • 每次 get() 或 put() 涉及节点移动时,必须先用 map.erase(key),再 list.push_front(),最后 map[key] = list.begin()
  • 不能用 list.splice(list.begin(), list, it) 把中间节点挪到头部——因为 it 来自 map 查得,而 splice 后原 it 在旧位置失效,但 map 里还留着它
  • std::list 的 size() 是 O(1),但频繁 erase + push_front 仍需注意内存局部性,小对象影响不大,大对象建议用 std::list<:unique_ptr>></:unique_ptr>

手写双向链表节点比依赖 STL 更可控

标准容器封装太深,LRU 核心逻辑(头插、尾删、任意节点提至头部)需要精确控制指针。自己定义节点结构,能避免迭代器生命周期管理问题,也方便调试和注入日志。

struct Node {
    int key;
    int value;
    Node* prev;
    Node* next;
    Node(int k, int v) : key(k), value(v), prev(nullptr), next(nullptr) {}
};
  • 构造时统一初始化 prev/next 为 nullptr,避免野指针
  • 在 put() 中删除最久未用节点时,先从 map 中 erase(old_tail->key),再 delete old_tail,顺序不能反
  • 提频操作(如 get() 命中后移到头部)只需四步:断开原链接 → 插入头部 → 更新 head → 修正新节点的 prev/next

std::unordered_map<int node></int> 是性能与安全的平衡点

用原始指针而非智能指针,是因为节点生命周期完全由 LRU 容器自身管理(头插、尾删、替换全在类内闭环),引入 std::shared_ptr 会增加原子计数开销,且无必要;而 std::unique_ptr 会导致 map 中存储的是移动后的独占权,无法支持「查找后提频」这类需多次访问同一节点的场景。

logos-node
logos-node

在 Linux x86_64 上安装、更新或检查 Logos 区块链测试网验证节点。用于用户需要搭建 Logos 节点时使用。

下载
  • 插入新节点时:new Node → 插入 list 头部 → cache_map[key] = new_node
  • 删除节点时:先 cache_map.erase(node->key),再手动 delete node,否则内存泄漏
  • 不建议用 std::map 替代 std::unordered_map:LRU 不要求有序,红黑树的 O(log n) 查找会拖慢热点路径

边界处理比算法本身更容易翻车

LRU 类里最容易被忽略的是容量为 0 或 1 的情况,以及重复 put 相同 key 的行为——这既是更新值,也是访问频次提升,必须触发提频逻辑,而不是简单覆盖。

立即学习“C++免费学习笔记(深入)”;

  • 构造时 capacity 应直接设为 0,并使所有操作退化为 no-op(<code>get 返回 -1,put 不存)
  • put(key, value) 遇到已存在 key:必须先从链表中移除对应节点,再插入头部,同时更新值——不能只改 node->value,否则链表顺序不变,违背 LRU 语义
  • 尾节点(tail)的 prev 指针永远指向倒数第二个节点,tail 本身不存有效数据(哨兵模式),可省去大量空指针判断;但务必在构造函数中初始化 head->next = tail, tail->prev = head

手写节点+裸指针映射的组合,看着低级,实则把所有生命周期和链接逻辑暴露出来,反而不容易漏掉某处 prev 没置空、某次 erase 忘了更新 map 这类细节。真正难的不是“怎么连”,而是“什么时候连、连完谁负责清理”。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

更多
C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

399

2026.04.23

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

179

2025.11.16

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

730

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

343

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

553

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

323

2025.11.27

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

3591

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1085

2023.12.29

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

40

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebSocket手册
WebSocket手册

共0课时 | 0人学习

HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 11.2万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 29.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn