新闻中心
c++怎么实现一个LRU缓存淘汰算法_c++实现LRU缓存的思路与示例
LRU缓存通过哈希表和双向链表结合实现,get和put操作均O(1)时间复杂度,最近访问节点置于链表头部,满时淘汰尾部最久未用节点。

LRU(Least Recently Used)缓存淘汰算法的核心思想是:当缓存满时,优先淘汰最久未使用的数据。为了高效实现,通常结合哈希表和双向链表,C++中可以用 unordered_map 和自定义的双向链表来完成。
基本思路
使用一个双向链表维护访问顺序,最近访问的节点放在链表头部,最久未访问的在尾部。同时用哈希表快速定位节点位置:
- get(key):若存在,返回值并将该节点移到链表头;否则返回 -1
- put(key, value):若已存在,更新值并移到头部;若不存在且缓存已满,删除尾部节点,插入新节点到头部
关键数据结构设计
定义双向链表节点和缓存容量:
struct ListNode {
int key, value;
ListNode *prev, *next;
ListNode(int k, int v) : key(k), value(v), prev(nullptr), next(nullptr) {}
};
成员变量包括:
- 头尾指针:方便插入删除
- 哈希表:unordered_map
- 当前大小与最大容量
核心操作实现
封装两个辅助函数简化逻辑:
NameGPT
免费的名称生成器,AI驱动在线生成企业名称及Logo
119
查看详情
void removeNode(ListNode* node) {
node->prev->next = node->next;
node->next->prev = node->prev;
}
<p>void addToHead(ListNode* node) {
node->next = head->next;
node->prev = head;
head->next->prev = node;
head->next = node;
}</p>这两个函数用于调整节点位置,保证 O(1) 时间复杂度。
完整示例代码
#include <iostream>
#include <unordered_map>
using namespace std;
<p>class LRUCache {
private:
struct ListNode {
int key, value;
ListNode <em>prev, </em>next;
ListNode(int k, int v) : key(k), value(v), prev(nullptr), next(nullptr) {}
};</p><pre class='brush:php;toolbar:false;'>int capacity;
unordered_map<int, ListNode*> cache;
ListNode *head, *tail;
void removeNode(ListNode* node) {
node->prev->next = node->next;
node->next->prev = node->prev;
}
void addToHead(ListNode* node) {
node->next = head->next;
node->prev = head;
head->next->prev = node;
head->next = node;
}
void moveToHead(ListNode* node) {
removeNode(node);
addToHead(node);
}
ListNode* popTail() {
ListNode* last = tail->prev;
removeNode(last);
return last;
}public: LRUCache(int cap) { capacity = cap; head = new ListNode(0, 0); tail = new ListNode(0, 0); head->next = tail; tail->prev = head; }
int get(int key) {
if (cache.find(key) == cache.end()) return -1;
ListNode* node = cache[key];
moveToHead(node);
return node->value;
}
void put(int key, int value) {
if (cache.find(key) != cache.end()) {
ListNode* node = cache[key];
node->value = value;
moveToHead(node);
} else {
ListNode* newNode = new ListNode(key, value);
cache[key] = newNode;
addToHead(newNode);
if (cache.size() > capacity) {
ListNode* removed = popTail();
cache.erase(removed->key);
delete removed;
}
}
}
~LRUCache() {
for (auto& pair : cache) {
delete pair.second;
}
delete head;
delete tail;
}};
使用示例
int main() {
LRUCache lru(2);
lru.put(1, 1);
lru.put(2, 2);
cout << lru.get(1) << endl; // 输出 1
lru.put(3, 3); // 淘汰 key=2
cout << lru.get(2) << endl; // 输出 -1
return 0;
}
基本上就这些。用哈希表加双向链表,能保证 get 和 put 都是 O(1) 时间复杂度,符合 LRU 的高效要求。注意手动管理内存或改用智能指针避免泄漏。
以上就是c++++怎么实现一个LRU缓存淘汰算法_c++实现LRU缓存的思路与示例的详细内容,更多请关注其它相关文章!
# 放在
# seo网站皆选火星产品
# 网站seo文案
# seo优化网站搬家
# 政府网站建设 便捷
# 关键词搜索排名是实时吗
# 网站建设及推广优化
# 融安网站建设优化
# 广西网站建设选择
# 宜黄百度seo优化
# 贸易网站建设
# 相关文章
# 可以用
# node
# 与其他
# 都是
# 如何使用
# 移到
# 最久
# 数据结构
# 链表
# red
# stream
# ios
# c++
# ai
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
css滚动动画效果怎么实现_使用Animate.css滚动触发动画类
J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程
css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异
微博网页版直接访问 微博网页版账号管理快速入口
蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台
Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问
《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元
Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求
Python实现多节点属性重叠度分析教程
AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南
Fabric模组开发:自定义物品与物品组的现代管理方法
CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题
2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
小米汽车11月交付量突破40000台!雷军:将继续努力
qq游戏手机版下载安装_qq游戏移动端入口
如何有效阻止外部脚本意外修改内联样式的高度属性
Bing引擎入口最新2025 Bing搜索免费官方登录
深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射
QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用
Win11截图该按哪些键 Win11截屏完整流程解析【教程】
Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区
火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧
Mac终端命令大全_Mac常用Terminal指令速查
印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】
Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性
c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换
LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置
Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧
拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法
在命令行怎么运行html项目_命令行运行html项目方法【教程】
Python实时数据流中的动态最值查找策略
怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】
深入理解J*a编译器的兼容性选项:从-source到--release
实现分段式页面滚动导航:CSS与J*aScript教程
b站怎么删除评论_b站评论管理与删除操作
Animex动漫社网入口地址 Animex动漫社网正版在线入口
如何使 Jest 模拟函数默认抛出错误以提高测试效率
支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样
qq游戏大厅官方下载_qq游戏免费下载安装入口
J*aScript中赋值与自增运算符的复杂交互与执行机制
解决Flask中Quill编辑器内容提交失败及TypeError的指南
深入理解与实现最大堆的Heapify过程:常见错误与修正
UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS
Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南
Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】
必由学官方网站入口 必由学学生教师共用登录通道
J*a编写用户注册与登录功能_掌握字符串与验证逻辑
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程
印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】


2025-11-01
浏览次数:次
返回列表
cache[key] = newNode;
addToHead(newNode);
if (cache.size() > capacity) {
ListNode* removed = popTail();
cache.erase(removed->key);
delete removed;
}
}
}
~LRUCache() {
for (auto& pair : cache) {
delete pair.second;
}
delete head;
delete tail;
}