C++实现LRU缓存——LeetCode 146
2022/3/6 17:15:06
本文主要是介绍C++实现LRU缓存——LeetCode 146,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.手动实现双向链表
class LRUCache { public: // 双向链表的数据结构 struct Node{ int key,val; Node*left,*right; Node(int _key,int _val):key(_key),val(_val),left(NULL),right(NULL){} }; Node *L,*R; // 最左边的和最右边的节点;第一个元素:L->right;最后一个元素:R->left unordered_map<int,Node*> map ; int n; // 当前节点数量 int size ; // 最大容量 // 双向链表的基本操作 void remove(Node *p){ p->left->right = p->right; p->right->left = p->left ; } void insertAtLeft(Node *p){ p->right = L->right; p->left = L ; L->right->left = p; L->right = p; } // LRUCache的基本操作 LRUCache(int capacity) { size = capacity ; n = 0; L = new Node(-1,-1); R = new Node(-1,-1); L->right = R ; R->left = L ; } int get(int key) { if(map.count(key)==0) return -1; // 删掉原节点 将其插入到最左边 int val = map[key]->val; remove(map[key]); Node *newNode = new Node(key,val); map[key] = newNode ; insertAtLeft(newNode); return val; } void put(int key, int value) { // 判断是否存在此节点 if(get(key)!=-1){ // key存在, get函数已经将key移到头部 map[key]->val = value; // 或 L->right->val } else{ Node *newNode = new Node(key,value); if(n==size){ //满了 map.erase(R->left->key); remove(R->left); // 从双向链表删除最右边节点 insertAtLeft(newNode); }else{ insertAtLeft(newNode); n++ ; } map[key]=newNode; } } }; /** * Your LRUCache object will be instantiated and called as such: * LRUCache* obj = new LRUCache(capacity); * int param_1 = obj->get(key); * obj->put(key,value); */
2.使用STL容器list(省去很多麻烦...)
list的常见方法:
- begin(): 返回第一个元素的迭代器
- end(): 最后一个元素的下一个位置的迭代器
- front(): 第一个元素的引用
- back(): 最后一个元素的引用
- emplace_front(), emplace_back() : 头部,尾部生成一个元素,比push_back效率高
- push_back(), pop_back(): 尾部插入、删除一个元素
- splice(): 将一个 list 容器中的元素插入到另一个容器的指定位置
class LRUCache { private: int cap = 0 ; list<pair<int,int>> li; // 保存Cache数据的 unordered_map<int,list<pair<int,int>>::iterator> mp; // 查找Cache中是否存在此key的 public: LRUCache(int capacity) { cap = capacity ; } int get(int key) { if(mp.find(key)==mp.end()) // key不存在 return -1; li.splice(li.begin(),li,mp[key]); // li的mp[key],插入到li.begin(),这里都是迭代器 return li.begin()->second; // return li.front().second; // 或者这么写 } void put(int key, int value) { if(get(key)!=-1) // key 存在 ,get函数已经将其移到头部 li.begin()->second = value ; else{ // key不存在 if(li.size()==cap){ int delKey = li.back().first; li.pop_back(); mp.erase(delKey); } // 满了 li.emplace_front(key,value); mp[key]=li.begin(); } } }; /** * Your LRUCache object will be instantiated and called as such: * LRUCache* obj = new LRUCache(capacity); * int param_1 = obj->get(key); * obj->put(key,value); */
这篇关于C++实现LRU缓存——LeetCode 146的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-07Cursor 收费太贵?3分钟教你接入超低价 DeepSeek-V3,代码质量逼近 Claude 3.5
- 2025-01-06PingCAP 连续两年入选 Gartner 云数据库管理系统魔力象限“荣誉提及”
- 2025-01-05Easysearch 可搜索快照功能,看这篇就够了
- 2025-01-04BOT+EPC模式在基础设施项目中的应用与优势
- 2025-01-03用LangChain构建会检索和搜索的智能聊天机器人指南
- 2025-01-03图像文字理解,OCR、大模型还是多模态模型?PalliGema2在QLoRA技术上的微调与应用
- 2025-01-03混合搜索:用LanceDB实现语义和关键词结合的搜索技术(应用于实际项目)
- 2025-01-03停止思考数据管道,开始构建数据平台:介绍Analytics Engineering Framework
- 2025-01-03如果 Azure-Samples/aks-store-demo 使用了 Score 会怎样?
- 2025-01-03Apache Flink概述:实时数据处理的利器