C++怎么实现一个LRU缓存淘汰算法_C++结合哈希表与双向链表实现LRU Cache


LRU缓存通过哈希表和双向链表结合实现,get和put操作均达到O(1)时间复杂度;当缓存满时淘汰最久未使用数据,利用哨兵节点简化链表操作,确保高效访问与顺序维护。

c++怎么实现一个lru缓存淘汰算法_c++结合哈希表与双向链表实现lru cache

LRU(Least Recently Used)缓存淘汰算法的核心思想是:当缓存满时,优先淘汰最久未使用的数据。为了高效实现“快速访问”和“快速调整使用顺序”,通常结合哈希表双向链表来完成。

在C++中,我们可以利用自定义的双向链表节点和unordered_map哈希表,实现O(1)时间复杂度的get和put操作。

设计思路

使用双向链表维护访问顺序:最近使用的节点放在链表头部,最久未使用的放在尾部。哈希表用于存储键到链表节点的指针,实现O(1)查找。

关键操作包括:

  • get(key):若存在,从链表中取出并移到头部;否则返回-1
  • put(key, value):若已存在,更新值并移至头部;若不存在且缓存满,则删除尾部节点,插入新节点到头部

核心结构定义

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

哈希表定义为:unordered_map<int node> cache;</int>

维护两个哨兵节点:head 和 tail,简化边界处理。

万彩商图 万彩商图

专为电商打造的AI商拍工具,快速生成多样化的高质量商品图和模特图,助力商家节省成本,解决素材生产难、产图速度慢、场地设备拍摄等问题。

万彩商图 212 查看详情 万彩商图

主要操作实现

需要封装几个辅助函数:

  • removeNode(Node* node):从链表中移除指定节点
  • addToHead(Node* node):将节点插入到头部
  • moveToHead(Node* node):将已有节点移到头部(表示最近使用)
  • removeTail():移除尾部节点,并返回其key,用于从哈希表中删除

完整代码示例

#include iostream> #include red_map> using namespace std;

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

class LRUCache { private: unordered_map> cache; Node head; Node* tail; int capacity;

void removeNode(Node* node) {
    node->prev->next = node->next;
    node->next->prev = node->prev;
}

void addToHead(Node* node) {
    node->next = head->next;
    node->prev = head;
    head->next->prev = node;
    head->next = node;
}

void moveToHead(Node* node) {
    removeNode(node);
    addToHead(node);
}

Node* removeTail() {
    Node* node = tail->prev;
    removeNode(node);
    return node;
}

public: LRUCache(int cap) : capacity(cap) { head = new Node(0, 0); tail = new Node(0, 0); head->next = tail; tail->prev = head; }

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

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

        if (cache.size() > capacity) {
            Node* removed = removeTail();
            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缓存,适用于频繁读写、容量受限的场景。注意内存释放,避免泄漏。

以上就是C++怎么实现一个LRU缓存淘汰算法_C++结合哈希表与双向链表实现LRU Cache的详细内容,更多请关注其它相关文章!


# 移除  # 无人酒店推广营销方案  # 十堰seo全网营销  # 阿里的推广营销  # 汕尾网站建设营销推广  # 小说阅读网站建设素材  # 如何学习互联网推广营销  # 高碑店网站网站建设  # 中国近期关键词排名  # 汕头网站建设路  # 提供网站建设开发外包  # 几个  # 内存管理  # node  # 如何使用  # 移到  # 最久  # 数据结构  # 放在  # 自定义  # 链表  # red  # stream  # ios  # c++  # ai 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: MySQL多重关联查询:利用别名高效获取同一表的多个关联字段  悟空浏览器网页版在线工具 悟空浏览器网页版在线平台入口  解决C#跨线程访问XML对象的异常 安全的并发XML处理模式  顺丰快递收费标准查询_如何查看顺丰最新收费价格  PDF如何批量加注释_PDF多文件批注高亮操作教程  Flexbox布局中Stencil组件宽度不显示问题解析与:host尺寸控制  毒蘑菇VOLUMESHADER_BM官网首页登录入口 毒蘑菇VOLUMESHADER_BM官网首页登录入口说明  Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧  《虎扑》取消评分记录方法  Win10显卡驱动安装失败怎么办 Win10使用DDU彻底卸载驱动【解决】  VS Code如何设置默认配置  如何外贸网站设计-能留住客户提升用户体验!  汽水音乐官方网站登录入口_汽水音乐网页版进入链接  多多买菜门店端app订单查看方法  mysql中外键约束如何使用_mysql FOREIGN KEY操作  拷贝漫画2025网页版入口 拷贝漫画官网免费看全集  《深林》冬季章节图文攻略  Dash应用多值文本输入处理与类型转换教程  12306不能订票的时间段是固定的吗? | 节假日购票时间有无变化  Word如何将文字快速转成表格 Word文本转换成表格功能使用技巧【效率】  Golang如何初始化module项目_Golang module init使用说明  英国搜索:多数英国人认为语言搜索是未来搜索  支付宝网页版在线入口 支付宝官网电脑登录入口  PHP中实现JSON数据数组分页的教程  在Flask应用中安全高效地更新SQLAlchemy用户数据  铁路12306官网入口 铁路12306中国铁路官网登录首页  MySQL多重JOIN技巧:高效关联同一表获取多角色信息  优化 React onClick 事件处理:函数引用与箭头函数的对比  京东快递物流信息不更新怎么办_物流停滞原因与处理方法  Python实时数据流中高效查找最大最小值  《虎扑》关闭社区内容推荐方法  《长生:天机降世》火塔小怪大全  ao3入口镜像地址 ao3镜像入口可靠跳转  sublime怎么快速在浏览器中预览HTML_sublime配置View in Browser教程  Bootstrap 5导航栏折叠功能失效:数据属性迁移指南  使用TinyButStrong生成HTML并结合Dompdf创建PDF教程  Win11怎么开启HDR_Windows 11显示器画质增强设置  search中maxlength属性用法解析  Excel如何快速找到并断开外部数据源链接_Excel外部数据源断开方法  《广发易淘金》国债逆回购操作教程  《三国:谋定天下》平民全阶段通用阵容  C++ static关键字作用_C++静态成员变量与静态函数  小米手机屏幕失灵乱跳怎么办 屏幕触控问题自检与临时解决方法【应急】  歌词怎么展示在|直播|间视频号?有什么注意事项?  J*a中逻辑运算符如何使用_逻辑与或非的基础用法讲解  HTML Canvas文本样式定制指南:解决外部字体加载与应用难题  照片整理的黄金法则是怎样的? 理解“收集-筛选-归档-备份”四步流程  iPhone 15 Pro如何查看存储空间占用_iPhone 15 Pro存储空间查看教程  电脑双系统如何安装和卸载 Windows和Linux双系统安装教程【详解】  微信客户端怎么查看二维码_微信客户端个人二维码查看方法 

 2025-11-22

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.