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.
class LRUCache{
public:
struct CacheNode
{
CacheNode(int k, int v) :key(k), value(v) {}
int key;
int value;
};
LRUCache(int capacity) {
this->capacity = capacity;
}
int get(int key) {
if (addmap.find(key) != addmap.end())
{
lst.splice(lst.begin(), lst, addmap[key]);
addmap[key] = lst.begin();
return addmap[key]->value;
}
return -1;
}
void set(int key, int value) {
if (addmap.find(key) != addmap.end()){
addmap[key]->value = value;
lst.splice(lst.begin(), lst, addmap[key]);
addmap[key] = lst.begin();
}
else {
if (capacity == lst.size())
{
addmap.erase(lst.back().key);
lst.pop_back();
}
lst.push_front(CacheNode(key, value));
addmap[key] = lst.begin();
}
}
private:
int capacity;
std::list<CacheNode> lst;
std::unordered_map<int, list<CacheNode>::iterator> addmap;
};