LRU缓存机制就是存键值对,但是会更新,并且要删除最不经常使用的,比如最多开10个应用,开第11个就必须删掉一个最久没用的。
要求实现get和put两个O(1)操作,实现办法只有链表加随机访问,否则无法做O(1)的移位。
如何实现链表随机访问?要调用c++里的list(双向链表),同时用一个map来做key到迭代器的键值对。
注意:list和双端队列函数差不多,可以直接有一个移动的操作,splice,这个比较新。
class LRUCache {
typedef pair<int, int> P;
private:
int size;
unordered_map<int, list<P>::iterator> m;
list<P> l;
public:
LRUCache(int capacity):size(capacity){}
int get(int key) {
if(!m.count(key))return -1;
l.splice(l.begin(), l, m[key]);
return m[key]->second;
}
void put(int key, int value) {
if(get(key)>=0)
{
m[key]->second = value;
return;
}
if(size == l.size())
{
int key2 = l.back().first;
m.erase(key2);
l.pop_back();
}
l.emplace_front(key, value);
m[key] = l.begin();
}
};
/**
* Your LRUCache object will be instantiated and called as such:
* LRUCache* obj = new LRUCache(capacity);
* int param_1 = obj->get(key);
* obj->put(key,value);
*/