信息发布→ 登录 注册 退出

c++中如何实现一个LRU缓存淘汰算法_c++ LRU缓存算法实现

发布时间:2025-10-31

点击量:
LRU缓存通过哈希表+双向链表实现O(1)操作,最近访问节点置于链表头部,满时淘汰尾部节点。

c++中如何实现一个lru缓存淘汰算法_c++ lru缓存算法实现

LRU(Least Recently Used)缓存淘汰算法的核心思想是:当缓存满时,优先淘汰最久未使用的数据。在C++中,可以通过哈希表 + 双向链表高效实现O(1)的插入、查找和删除操作。

基本数据结构设计

使用std::unordered_map存储键到节点指针的映射,双向链表维护访问顺序——最近使用的放头部,淘汰从尾部进行。

定义链表节点结构:

struct ListNode {
    int key, value;
    ListNode* prev;
    ListNode* next;
    ListNode(int k, int v) : key(k), value(v), prev(nullptr), next(nullptr) {}
};

核心操作实现

封装LRUCache类,包含以下关键函数:

NameGPT NameGPT

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

NameGPT 119 查看详情 NameGPT
  • get(int key):若存在,将对应节点移到链表头并返回值;否则返回-1
  • put(int key, int value):新增或更新键值对,若超出容量则删除尾节点

辅助方法用于维护链表:

  • removeNode(ListNode* node):从链表中移除指定节点
  • addToHead(ListNode* node):将节点插入链表头部

完整代码示例

class LRUCache {
private:
    std::unordered_map cache;
    ListNode* head;
    ListNode* tail;
    int capacity;

    void removeNode(ListNode* node) {
        if (node == head) head = node->next;
        if (node == tail) tail = node->prev;
        if (node->prev) node->prev->next = node->next;
        if (node->next) node->next->prev = node->prev;
    }

    void addToHead(ListNode* node) {
        node->next = head;
        node->prev = nullptr;
        if (head) head->prev = node;
        head = node;
        if (!tail) tail = node;
    }

public:
    LRUCache(int cap) : capacity(cap), head(nullptr), tail(nullptr) {}

    int get(int key) {
        if (cache.find(key) == cache.end()) return -1;
        ListNode* node = cache[key];
        removeNode(node);
        addToHead(node);
        return node->value;
    }

    void put(int key, int value) {
        if (cache.find(key) != cache.end()) {
            ListNode* node = cache[key];
            node->value = value;
            removeNode(node);
            addToHead(node);
        } else {
            ListNode* newNode = new ListNode(key, value);
            cache[key] = newNode;
            addToHead(newNode);

            if (cache.size() > capacity) {
                ListNode* toDelete = tail;
                removeNode(tail);
                cache.erase(toDelete->key);
                delete toDelete;
            }
        }
    }
};

注意:实际项目中可考虑智能指针管理内存,避免手动new/delete。这个实现保证了get和put操作均摊时间复杂度为O(1),符合高频访问场景需求。

基本上就这些。

以上就是c++++中如何实现一个LRU缓存淘汰算法_c++ LRU缓存算法实现的详细内容,更多请关注其它相关文章!


相关文章: AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看  谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版  怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】  优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践  如何在 Excel Online 和 Google 表格中更改日期格式  如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式  cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法  CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整  Go语言中Map存储的结构体如何调用指针方法:深入解析与实践  在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析  PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误  php源码怎么看淘宝客系统_看php源码淘宝客系统技巧  我的世界官方游戏入口 我的世界官网平台直达链接  漫蛙漫画官方首页 漫蛙2漫画在线阅读入口  b站怎么看视频的弹幕数量_b站弹幕数量查看方法  Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口  Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略  Go语言HTML解析:利用Goquery精准获取指定元素内容  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  excel怎么制作工资条 excel快速生成工资条的方法  python3时间如何用calendar输出?  使用 Pandas 高效处理 .dat 文件:字符清理与数据计算  PDF文件体积过大处理_PDF压缩技巧详解  PHP URL参数传递与500错误调试指南  PHP:从文本中提取带逗号的数字价格教程  c++ 命名空间怎么用 c++ namespace使用指南  绝地鸭卫平a核爆刀流玩法攻略  jQuery Mask 插件中实现电话号码固定前导零的教程  现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践  taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】  C++如何解决segmentation fault_C++段错误调试与原因分析  excel怎么提取文本中数字 excel函数提取技巧  html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】  163邮箱登录密码 163邮箱忘记密码找回  J*aScript打印功能_j*ascript输出控制  钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧  Python多版本共存与虚拟环境管理深度指南  win11跳过OOBE三种方法 Win11跳过OOBE设置步骤  sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件  字由网在线版登录地址 字由网网页版安全入口  C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  淘宝支付提示失败如何解决 淘宝支付流程优化方法  CSS实现侧边栏导航项全宽圆角悬停背景效果  俄罗斯Yandex搜索引擎入口_Yandex官网免登录一键访问  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】  微信语音通话掉线如何解决 微信语音通话稳定优化方法  一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化  蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!