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;
};

最新文章

  1. 深入理解JavaScript系列:为什么03-0.2不等于0.1
  2. css多栏自适应布局
  3. ionic cordova 热更新
  4. Java常用锁机制简介
  5. UVa 10905 Children&#39;s Game
  6. EhCache 分布式缓存/缓存集群(转)
  7. Java图片上传压缩处理
  8. MYSQLD c++函数修饰名转换工具c++filt
  9. 【贪心】【Uva11729】 Commando War
  10. [lua]笔试-组合概率
  11. 基于visual Studio2013解决C语言竞赛题之0401阶乘
  12. 恢复Ubuntu引导菜单
  13. enq: TX - row lock contention 参数P1,P2,P3说明
  14. oracle 数据库安装环境,需要大汇总
  15. Android游戏开发研究帧动画实现
  16. Oracle自增长序列
  17. ACM 整数划分(四)
  18. 神经网络结构在命名实体识别(NER)中的应用
  19. mysql查询文章的评论数量
  20. maven的聚合和继承

热门文章

  1. node二进制安装
  2. 每日总结:Java课堂测试第三阶段第一次优化 (2021.9.20)
  3. 如何在前端通过JavaScript创建修改CAD图形
  4. 4.19——数组双指针——26. 删除有序数组中的重复项 &amp; 27. 删除有序数组中的重复项II &amp; 80. 删除有序数组中的重复项 II
  5. Django+Vue跨域配置与经验
  6. springcloud整合seata
  7. 為什麼我的手機連Wi-Fi速度總是卡在75Mbps?Wi-Fi速度解惑~帶你一次看懂!
  8. 零基础入门c语言函数之递归函数
  9. sort方法和自定义比较器的写法
  10. 正则表达式匹配 牛客网 剑指Offer