LRU Cache :
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.
参考:
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.
参考:
http://www.cnblogs.com/x1957/p/3485053.html
#include<iostream>
#include<list>
#include<unordered_map>
#define CAPACITY 2
using namespace std;
struct Node
{
int key;
int value;
};
class LRUCache
{
public:
LRUCache(int capacity)//constructor of LRUCache
{
size=capacity;
}
int get(int key){
if(Cachemap.find(key)!=Cachemap.end())//the element wanted exsits
{
//transform the element that key refer to to the first place of Cachelist
Cachelist.splice(Cachelist.begin(),Cachelist, Cachemap[key]);
//update the iterator
Cachemap[key]=Cachelist.begin();
return(Cachelist.begin()->value);
}
else
return(-1);
}
void set(int key, int value)
{
if(Cachemap.find(key)==Cachemap.end())//the key does not exist in the Cachamap
{
if(Cachelist.size()==size)//Cachelist reach its capacity
{
Cachemap.erase(Cachelist.back().key);//erase the key at the bottom of Cachemap
Cachelist.pop_back();//erase the last element of Cachelist
}
//insert a new value at the begining of the Cachelist
Node newnode;
newnode.key=key;
newnode.value=value;
Cachelist.push_front(newnode);
Cachemap[key]=Cachelist.begin();//update the iterator
}
else //the key does exist in the Cachemap
{
Cachemap[key]->value=value;//input the value
Cachelist.splice(Cachelist.begin(),Cachelist,Cachemap[key]);//inset the new element at the begining of Cachelist
Cachemap[key]=Cachelist.begin();
}
}
private:
int size;
list<Node> Cachelist;
unordered_map<int,list<Node>::iterator> Cachemap; //define the second element of Cachemap is a iterator
};
int main()
{
LRUCache lru(CAPACITY);//set the size of empty LRUCache lru;
lru.set(1,1);
cout<<lru.get(1)<<"\n";
cout<<lru.get(2)<<"\n";
}