typedef map<int, list<pair<int, int> >::iterator>::iterator mplstiter;
typedef list<pair<int, int> >::iterator lstiter;
class LRUCache{
private:
int _cap;
map<int, lstiter> mp;
list<pair<int, int> > lst;
public:
LRUCache(int capacity) {
_cap = capacity;
mp.clear();
lst.clear();
}
int get(int key) {
mplstiter itr = mp.find(key);
if (itr == mp.end()) return -1;
lstiter litr = itr->second;
int val = litr->second;
mp[key] = lst.insert(lst.end(), *litr);
lst.erase(litr);
return val;
}
void set(int key, int value) {
if (mp.find(key) != mp.end()) {
lstiter itr = mp[key];
lst.erase(itr);
mp.erase(key);
}
if (mp.size() == _cap) {
int okey = lst.front().first;
lst.erase(lst.begin());
mp.erase(okey);
}
lstiter itr = lst.insert(lst.end(), make_pair(key, value));
mp[key] = itr;
}
};
第20行被我写成了
lst.insert(lst.end(), *litr);
结果错了好久!
使用 unordered_map 能使速度快不少
typedef unordered_map<int, list<pair<int, int> >::iterator>::iterator mplstiter;
typedef list<pair<int, int> >::iterator lstiter;
class LRUCache{
private:
int _cap;
unordered_map<int, lstiter> mp;
list<pair<int, int> > lst;
public:
LRUCache(int capacity) {
_cap = capacity;
mp.clear();
lst.clear();
}
int get(int key) {
mplstiter itr = mp.find(key);
if (itr == mp.end()) return -1;
lstiter litr = itr->second;
int val = litr->second;
mp[key] = lst.insert(lst.end(), *litr);
lst.erase(litr);
return val;
}
void set(int key, int value) {
if (mp.find(key) != mp.end()) {
lstiter itr = mp[key];
lst.erase(itr);
mp.erase(key);
}
if (mp.size() == _cap) {
int okey = lst.front().first;
lst.erase(lst.begin());
mp.erase(okey);
}
lstiter itr = lst.insert(lst.end(), make_pair(key, value));
mp[key] = itr;
}
};