class LRUCache //least recently used
{
public:
LRUCache(int capacity): _capacity(capacity) {}
int get(int key)
{
HIPII::iterator iter = cache.find(key);
if (iter == cache.end())
{
return -1;
}
touch(iter);
return iter->second.first;
}
void set(int key , int value)
{
HIPII::iterator iter = cache.find(key);
if(iter != cache.end())
touch(iter);
else
{
if (cache.size() == _capacity)
{
cache.erase(used.back());
used.pop_back();
}
used.push_front(key);
}
cache[key] = make_pair(value,used.begin());
}
private:
typedef list<int> LI;
typedef pair<int, LI::iterator> PII;
typedef unordered_map<int,PII> HIPII;
void touch(HIPII::iterator iter)
{
int key = iter->first;
used.erase(iter->second.second);
used.push_front(key);
iter->second.second = used.begin();
}
HIPII cache;
LI used;
int _capacity;
};