首页 > 后端开发 > C++ > 正文

c++怎么实现一个LRU缓存算法_c++中LRU缓存的设计与实现

裘德小鎮的故事
发布: 2025-11-11 02:05:35
原创
885人浏览过
LRU缓存通过哈希表和双向链表结合实现,get和put操作均O(1):哈希表映射key到链表节点,链表维护访问顺序,最近使用置头,满时删尾。

c++怎么实现一个lru缓存算法_c++中lru缓存的设计与实现

实现一个LRU(Least Recently Used)缓存的核心思路是:当缓存满时,优先淘汰最久未使用的数据。为了高效地完成插入、查找和更新操作,C++中通常结合哈希表(unordered_map)和双向链表(list)来实现。

1. LRU缓存的基本要求

一个LRU缓存需要支持以下两个核心操作:

  • get(key):如果键存在,返回对应的值,并将该键移到最近使用位置;否则返回 -1。
  • put(key, value):插入或更新键值对。如果超出容量,删除最久未使用的条目。

这两个操作的时间复杂度都应为 O(1)。

2. 数据结构选择

要达到 O(1) 的时间复杂度,可以这样设计:

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

存了个图
存了个图

视频图片解析/字幕/剪辑,视频高清保存/图片源图提取

存了个图 17
查看详情 存了个图
  • unordered_map<int, list<pair<int, int>>::iterator>:用于快速定位某个 key 是否存在及其在链表中的位置。
  • list<pair<int, int>>:双向链表存储键值对,最近使用的放在链表头部,最久未使用的在尾部。

这种组合既能快速查找,又能高效地移动和删除节点。

3. 实现代码示例

#include <iostream>
#include <unordered_map>
#include <list>

class LRUCache {
private:
    int capacity;
    std::unordered_map<int, std::list<std::pair<int, int>>::iterator> cache;
    std::list<std::pair<int, int>> used;

public:
    LRUCache(int cap) : capacity(cap) {}

    int get(int key) {
        auto it = cache.find(key);
        if (it == cache.end()) {
            return -1;
        }
        // 将当前访问的节点移到链表头部
        used.splice(used.begin(), used, it->second);
        return it->second->second;
    }

    void put(int key, int value) {
        auto it = cache.find(key);
        if (it != cache.end()) {
            // 更新值并移到头部
            it->second->second = value;
            used.splice(used.begin(), used, it->second);
            return;
        }

        // 插入新元素到链表头部
        used.emplace_front(key, value);
        cache[key] = used.begin();

        // 如果超过容量,删除尾部元素
        if (cache.size() > capacity) {
            int lastKey = used.back().first;
            cache.erase(lastKey);
            used.pop_back();
        }
    }
};
登录后复制

4. 关键点说明

splice 是关键操作:它可以把链表中的某个迭代器指向的节点“剪切”并粘贴到另一个位置,不会导致迭代器失效,且时间复杂度为 O(1)。

  • 每次 get 或 put 已存在的 key 时,都要调用 splice 将其移到链表头部。
  • 新插入的元素直接加到头部,淘汰时从尾部移除。
  • 哈希表保存的是 list 的 iterator,可以直接访问对应节点。

基本上就这些。这个实现简洁、高效,适合面试和实际项目中使用。注意边界情况处理,比如容量为 0 或重复插入等情况即可。不复杂但容易忽略细节。

以上就是c++++怎么实现一个LRU缓存算法_c++中LRU缓存的设计与实现的详细内容,更多请关注php中文网其它相关文章!

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

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

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号