LRU缓存
2024-09-08 16:36:37
LRU缓存
struct Node{
int key;
int value;
Node* next;
Node* pre;
Node():
key(-1), value(-1), next(nullptr), pre(nullptr){}
explicit Node(int key_, int val_):
key(key_), value(val_), next(nullptr), pre(nullptr){}
Node(int key_, int val_, Node* next_, Node* pre_):
key(key_), value(val_),next(next_), pre(pre_){}
};
class LRUCache {
public:
explicit LRUCache(int capacity):
capacity(capacity){
size = 0; //初始值设为0
head = new Node();
tail = new Node();
head -> next = tail;
tail -> pre = head;
}
int get(int key) {
if(hashMap.end() == hashMap.find(key)){
return -1;
}
auto cur = hashMap[key];
int val = cur -> value;
int key_ = cur -> key;
erase(cur);
cur = new Node(key_, val);
insert(cur);
return val;
}
void put(int key, int value) {
if(hashMap.end() != hashMap.find(key)){
auto cur = hashMap[key];
int val = value;
int key_ = cur -> key;
erase(cur);
cur = new Node(key_, val);
hashMap[key] = cur;
insert(cur);
}else{
auto cur = new Node(key, value);
if(size < capacity){
hashMap[key] = cur;
size++;
}else{
auto lastNode = tail -> pre;
hashMap.erase(lastNode->key);
hashMap[key] = cur;
erase(lastNode);
}
insert(cur);
}
}
void erase(Node *node){
if( node -> pre != nullptr && node -> next != nullptr){
Node *pre = node -> pre;
Node *next = node -> next;
pre -> next = next;
next -> pre = pre;
node -> pre = nullptr;
node -> next = nullptr;
delete(node);
node = nullptr;
}
}
void insert(Node *node){
Node *next = head -> next;
head -> next = node;
next -> pre = node;
node -> pre = head;
node -> next = next;
}
private:
Node *head;
Node *tail;
unordered_map<int, Node*> hashMap;
int capacity;
int size;
};
最新文章
- 深入理解JavaScript系列:为什么03-0.2不等于0.1
- css多栏自适应布局
- ionic cordova 热更新
- Java常用锁机制简介
- UVa 10905 Children&#39;s Game
- EhCache 分布式缓存/缓存集群(转)
- Java图片上传压缩处理
- MYSQLD c++函数修饰名转换工具c++filt
- 【贪心】【Uva11729】 Commando War
- [lua]笔试-组合概率
- 基于visual Studio2013解决C语言竞赛题之0401阶乘
- 恢复Ubuntu引导菜单
- enq: TX - row lock contention 参数P1,P2,P3说明
- oracle 数据库安装环境,需要大汇总
- Android游戏开发研究帧动画实现
- Oracle自增长序列
- ACM 整数划分(四)
- 神经网络结构在命名实体识别(NER)中的应用
- mysql查询文章的评论数量
- maven的聚合和继承
热门文章
- node二进制安装
- 每日总结:Java课堂测试第三阶段第一次优化 (2021.9.20)
- 如何在前端通过JavaScript创建修改CAD图形
- 4.19——数组双指针——26. 删除有序数组中的重复项 &; 27. 删除有序数组中的重复项II &; 80. 删除有序数组中的重复项 II
- Django+Vue跨域配置与经验
- springcloud整合seata
- 為什麼我的手機連Wi-Fi速度總是卡在75Mbps?Wi-Fi速度解惑~帶你一次看懂!
- 零基础入门c语言函数之递归函数
- sort方法和自定义比较器的写法
- 正则表达式匹配 牛客网 剑指Offer