Design and implement a data structure for least recently used (LRU) cache. It shocould support the following operations:getAndset.
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 shocould invalidate the least recently used item before inserting a new item.
Two-way linked list + hash Map
1 class LRUCache{ 2 public: 3 LRUCache(int capacity) { 4 this->capacity = capacity; 5 } 6 7 int get(int key) { 8 if (cache_map.find(key) != cache_map.end()) { 9 cache_list.splice(cache_list.begin(), cache_list, cache_map[key]);10 cache_map[key] = cache_list.begin();11 return cache_map[key]->value;12 } else {13 return -1;14 }15 }16 17 void set(int key, int value) {18 if (cache_map.find(key) != cache_map.end()) {19 cache_list.splice(cache_list.begin(), cache_list, cache_map[key]);20 cache_map[key] = cache_list.begin();21 cache_map[key]->value = value;22 } else {23 if (cache_list.size() == capacity) {24 cache_map.erase(cache_list.back().key);25 cache_list.pop_back();26 }27 cache_list.push_front(cacheNode(key, value));28 cache_map[key] = cache_list.begin();29 }30 }31 private:32 struct cacheNode {33 int key;34 int value;35 cacheNode(int key, int value) : key(key), value(value) {}36 };37 38 int capacity;39 unordered_map<int, list<cacheNode>::iterator> cache_map;40 list<cacheNode> cache_list;41 };
[Leetcode] LRU Cache