class LRUCache{
public:
LRUCache(int capacity) {
mcapacity = capacity;
}
int get(int key) {
mp_iterator_type itr = mmp.find(key);
if (itr == mmp.end()) {
return -1;
} else {
mlist.push_front(*itr->second);
mlist.erase(itr->second);
mmp[key] = mlist.begin();
return mlist.begin()->second;
}
}
void set(int key, int value) {
mp_iterator_type itr = mmp.find(key);
if (itr == mmp.end()) {
if (mmp.size() == mcapacity) {
list_iterator_type tobedelete = --mlist.end();
mmp.erase(tobedelete->first);
mlist.erase(tobedelete);
}
mlist.push_front(make_pair(key, value));
mmp[key] = mlist.begin();
} else {
mlist.push_front(make_pair(key, value));
mlist.erase(itr->second);
mmp[key] = mlist.begin();
}
}
private:
int mcapacity;
typedef list<pair<int,int> >::iterator list_iterator_type;
list<pair<int, int> > mlist;
typedef unordered_map<int, list_iterator_type>::iterator mp_iterator_type;
unordered_map<int, list_iterator_type> mmp;
};