Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get
and set
.
get(key)
- Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.set(key, value)
- Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.
最近使用缓存的问题,看到key和value感觉可能就要使用map了。用一个list维护一个cache,然后map指向相应cache的每个节点。
注意这里的最近使用,不管是get还是set都属于最近使用的范畴,代码如下所示:
1 class LRUCache{ 2 struct cacheNode{ 3 int key; 4 int val; 5 cacheNode(int k, int v): 6 key(k), val(v){} 7 }; 8 public: 9 LRUCache(int capacity) { 10 size = capacity; 11 } 12 13 int get(int key) { 14 if(cacheMap.find(key) != cacheMap.end()){ 15 auto it = cacheMap[key]; 16 cacheList.splice(cacheList.begin(), cacheList, it); 17 cacheMap[key] = cacheList.begin(); 18 return cacheList.begin()->val; 19 }else 20 return -1; 21 } 22 23 void set(int key, int value) { 24 if(cacheMap.find(key) != cacheMap.end()){//list中存在该元素 25 auto it = cacheMap[key]; 26 cacheList.splice(cacheList.begin(), cacheList, it); 27 cacheMap[key] == cacheList.begin(); 28 cacheList.begin()->val = value; 29 }else{ //list中不存在该元素 30 if(cacheList.size() == this->size){ 31 cacheMap.erase(cacheList.back().key); 32 cacheList.pop_back(); 33 } 34 cacheList.push_front(cacheNode(key, value)); 35 cacheMap[key] = cacheList.begin(); 36 } 37 } 38 private: 39 int size; 40 list<cacheNode> cacheList; 41 unordered_map<int , list<cacheNode>::iterator> cacheMap; 42 };
时间: 2024-10-05 09:43:32