新闻中心

c++怎么实现一个LRU缓存淘汰算法_c++实现LRU缓存的思路与示例

2025-11-01
浏览次数:
返回列表
LRU缓存通过哈希表和双向链表结合实现,get和put操作均O(1)时间复杂度,最近访问节点置于链表头部,满时淘汰尾部最久未用节点。

c++怎么实现一个lru缓存淘汰算法_c++实现lru缓存的思路与示例

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 NameGPT

免费的名称生成器,AI驱动在线生成企业名称及Logo

NameGPT 119 查看详情 NameGPT
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进行异步编程  印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】 

搜索