新闻中心

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  # c++  # 键值对  # red  # node  # 闵行网站推广哪里有  # 南京网站seo优化网站报价  # 燕郊景区推广员招聘网站  # 移动营销和移动推广  # 阳春网站关键词排名  # 中山网站构建建设  # 河南营销推广团队招聘  # 辽宁抖音seo方式分析  # 做推广网站晓得易速达  # 福州抖音seo企业店  # 解决问题  # 中文网  # 可以通过  # 相关文章  # 与其他  # 如何使用  # 数据结构  # 如何实现  # 键值  # 链表 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 如何在Python中使用Optional类型处理可变对象并避免Pylint警告  为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法  将HTML动态表格多行数据保存到Google Sheet的教程  如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit  c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解  如何在 Windows 11 中启动游戏手柄设置  解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常  从OpenAI API响应中高效提取生成文本  从J*aScript对象中精确提取指定属性的教程  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  蛙漫安全无毒 官方认证的绿色入口  HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明  qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明  Python实现多节点属性重叠度分析教程  台积电1.4nm工艺A14瞄准2028:10年来性能提升80%  Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全  飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践  晋江读书网页版在线登录 晋江读书电脑版官网  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  HTML元素状态管理:根据DIV内容动态启用/禁用按钮  邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式  单12V-2×6实现为RTX 5090供电750W!甚至都没敢跑分  PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧  QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问  Bing引擎入口最新2025 Bing搜索免费官方登录  2026春节假期时间安排 2026春节假日查询  Eclipse怎么运行工程_Eclipse工程运行配置说明  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  微信群消息显示延迟如何解决 微信群消息刷新优化方法  俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达  Shopware订单对象中获取产品自定义字段的正确方法  c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架  Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置  J*a TimerTask文件监控:HashMap状态管理与常见陷阱规避指南  如何仅使用CSS更改登录界面背景图像图标的颜色  Spring Boot嵌入式服务器与J*a EE:功能支持深度解析  QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口  mysql如何设置表访问权限_mysql表访问权限配置  AO3最新入口2025公告_AO3中文官网合集  漫蛙2正版漫画站 漫蛙2网页版快速访问入口  Pandas DataFrame:高效添加条件计算列  C++如何操作注册表_Windows平台下C++读写注册表的API函数详解  在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析  优化Django表单:提交验证失败后保留用户输入  魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】 

搜索