思路:hash_map 和list 容器
class LRUCache{
public:
struct node{
int key;
int value;
node(int k, int v) :key(k), value(v){}
};
LRUCache(int capacity) {
mCapacity = capacity;
}
int get(int key) {
if (visited.find(key) == visited.end())
return -1;
MoveToHead(key);
return visited[key]->value;
}
void set(int key, int value) {
if (visited.find(key) == visited.end()){
node add(key, value);
if (LRUcache.size() >= mCapacity){ //腾出空间
visited.erase(LRUcache.back().key);
LRUcache.pop_back(); //删除最前面的
}
LRUcache.push_front(add);
visited[key] = LRUcache.begin();
return;
}
else{
visited[key]->value = value;
MoveToHead(key);
}
}
private:
unordered_map<int, list<node>::iterator> visited;
list<node> LRUcache;
int mCapacity;
void MoveToHead(int key){
auto updateEntry = *visited[key]; //记录当前的值
LRUcache.erase(visited[key]); //从原位置删除
LRUcache.push_front(updateEntry);
visited[key] = LRUcache.begin();
}
};