答案:使用队列模拟LRU缓存可通过惰性删除和重复入队实现,但效率低于哈希表+双向链表组合。

在C++中,使用队列单独实现LRU(Least Recently Used)缓存并不高效,因为队列无法快速定位和更新中间元素。真正的LRU需要支持快速查找、插入、删除以及标记“最近使用”操作。通常采用哈希表 + 双向链表的组合方式,但若坚持用“队列”的思路模拟,可以通过一些变通方法实现一个简化版的LRU。
虽然标准队列(如 std::queue)不支持随机访问或元素移动,但我们可以通过以下方式模拟LRU行为:
std::queue 记录访问顺序(最老的在队头)std::unordered_set 或 std::unordered_map 快速判断元素是否在缓存中由于这种限制,我们引入一种惰性删除 + 重复入队的方法。
立即学习“C++免费学习笔记(深入)”;
允许同一个key多次出现在队列中,但通过哈希表记录当前有效的值,并在弹出时判断是否过期。
数据结构:
std::queue<int>:记录访问顺序(包括重复)std::unordered_map<int, int>:存储 key -> value 映射std::unordered_set<int> 或直接用 map 判断存在性int capacity:最大容量put 操作逻辑:
get 操作逻辑:
#include <iostream>
#include <queue>
#include <unordered_map>
using namespace std;
class LRUCache {
private:
queue<int> q;
unordered_map<int, int> cache;
int capacity;
public:
LRUCache(int cap) : capacity(cap) {}
int get(int key) {
if (cache.find(key) == cache.end()) {
return -1;
}
// 标记为最近使用:重新入队
q.push(key);
return cache[key];
}
void put(int key, int value) {
// 如果已存在,更新值并重新入队
if (cache.find(key) != cache.end()) {
cache[key] = value;
q.push(key);
return;
}
// 检查容量,惰性清理
while (cache.size() >= capacity) {
int oldKey = q.front(); q.pop();
// 如果 map 中的值仍匹配(说明未被覆盖),则真正删除
// 实际上我们只删一次,但可能遇到重复入队的旧记录
if (cache.find(oldKey) != cache.end()) {
cache.erase(oldKey);
}
}
cache[key] = value;
q.push(key);
}
};int main() {
LRUCache lru(2);
lru.put(1, 1);
lru.put(2, 2);
cout << lru.get(1) << endl; // 1
lru.put(3, 3); // evicts key 2
cout << lru.get(2) << endl; // -1
cout << lru.get(3) << endl; // 3
return 0;
}如果追求效率,应使用 std::list 模拟双向链表,配合哈希表指向节点,实现真正的 O(1) LRU。
基本上就这些,用队列模拟LRU能跑通逻辑,但本质是妥协方案。
以上就是c++++中如何使用队列实现LRU_c++队列实现LRU缓存方法的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号