class LRUCache {
public:
LRUCache(int capacity) {
this->cap=capacity;
}
int get(int key) {
map<int,int>::iterator it=m.find(key);
if(it==m.end())
return -1;
list<int>::iterator iter=l.begin();
for(;iter!=l.end();iter++){
if(*iter==key)
{
l.erase(iter);
break;
}
}
l.push_front(key);
return it->second;
}
void put(int key, int value) {
//分为 存在 不存在
if(m.find(key)==m.end())
{
if(cap==m.size())
{
int iter=l.back();
m.erase(iter);
l.pop_back();
}
l.push_front(key);
m[key]=value;
} else{
for(list<int>::iterator iter=l.begin();iter!=l.end();iter++){
if(*iter==key)
{
l.erase(iter);
break;
}
}
l.push_front(key);
m[key]=value;
}
}
private:
map<int,int> m;
list<int> l;
int cap;
};
更好的方式,双链表。
struct{
int key;
int value;
int timekey;
}
以结构体作为value,增加timekey map结构。如果膨胀就就删除最小的。