0

0

c++如何实现一个LRU缓存 c++缓存淘汰算法【实例】

冰火之心

冰火之心

发布时间:2026-01-05 18:16:45

|

151人浏览过

|

来源于php中文网

原创

LRU缓存用unordered_map加list实现:get查哈希表并splice移至头部,put更新或插入并超容时删尾部;时间复杂度均为O(1)。

c++如何实现一个lru缓存 c++缓存淘汰算法【实例】

用 C++ 实现 LRU(Least Recently Used)缓存,核心是快速查找 + 快速移动“最近使用”项。标准做法是结合 std::unordered_map(O(1) 查找)和 std::list(O(1) 头尾插入/删除,支持手动调整顺序),避免手写双向链表的复杂性。

数据结构设计:哈希表 + 双向链表

LRU 要求:
- get(key):存在则返回值,并将该 key 移到“最近使用”位置(头部);不存在返回 -1。
- put(key, value):若 key 已存在,更新 value 并移到头部;若不存在,插入新节点;若容量满,先淘汰尾部(最久未用)节点。

关键点:
- std::list>键值对,头部为最近访问,尾部为最久未用。
- std::unordered_map>::iterator> 映射 key 到链表中对应节点的迭代器,实现 O(1) 定位。

put 操作:插入或更新 + 容量控制

执行步骤:
- 若 key 已存在:用 map 找到对应 list 迭代器,用 splice() 把该节点移到 list 开头,更新 value。
- 若 key 不存在:
  • 先检查是否超容(map.size() == capacity):是则删掉 list 尾节点,并从 map 中移除其 key。
  • 然后在 list 头部插入新节点(push_front({key, value})),并将新节点迭代器存入 map。

get 操作:查表 + 提升热度

执行步骤:
- 在 map 中查找 key:
  • 找不到 → 返回 -1。
  • 找到 → 获取对应 list 迭代器,调用 splice(list.begin(), list, it) 将该节点移到开头,返回 value。

red">注意:不要用 erase + push_front,那样会额外分配内存;splice 是常数时间、原地移动,更高效。

完整可运行示例(C++11+)

不依赖外部库,仅用 STL:

ChatMind
ChatMind

ChatMind是一款AI生成思维导图的效率工具,可以通过AI对话生成和编辑思维导图。

下载
class LRUCache {
    int cap;
    list> cache;
    unordered_map>::iterator> map;

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

int get(int key) {
    if (map.find(key) == map.end()) return -1;
    auto it = map[key];
    cache.splice(cache.begin(), cache, it); // 移至头部
    return it->second;
}

void put(int key, int value) {
    if (map.find(key) != map.end()) {
        auto it = map[key];
        it->second = value;
        cache.splice(cache.begin(), cache, it);
        return;
    }
    if (cache.size() == cap) {
        auto last = cache.back();
        map.erase(last.first);
        cache.pop_back();
    }
    cache.push_front({key, value});
    map[key] = cache.begin();
}

};

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

使用示例:

LRUCache lru(2);
lru.put(1, 1); // 缓存: [(1,1)]
lru.put(2, 2); // 缓存: [(2,2),(1,1)]
lru.get(1); // 返回 1,缓存: [(1,1),(2,2)]
lru.put(3, 3); // 淘汰 2,缓存: [(3,3),(1,1)]

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

314

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

527

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

192

2025.08.29

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

531

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

7

2026.01.06

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

73

2025.09.05

漫蛙2入口地址合集
漫蛙2入口地址合集

本专题整合了漫蛙2入口汇总,阅读专题下面的文章了解更多详细内容。

156

2026.01.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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