class LRUCache{
typedef list<pair<int,int>>::iterator Iter;
public:
LRUCache(int capacity) {
cnt = capacity;
}
int get(int key) { // 时间复杂度O(1)
auto iter = _map.find(key);
int ret = - 1;
if (iter != _map.end()){
ret = iter->second->second;
_list.erase(iter->second);
_list.push_front(pair<int,int>(key,ret));
iter->second = _list.begin();
}
return ret;
}
void set(int key, int value) { // 修改键值 或 添加新pair, O(1)
auto iter = _map.find(key);
if (iter == _map.end()){ // key不存在
if (cnt == 0){// cache容量不足
auto tmp = _list.back();
_list.pop_back();
_map.erase(_map.find(tmp.first));
}
else
cnt--;
}
else{// 删除原有数据
_list.erase(iter->second);
_map.erase(iter);
}
_list.push_front(pair<int,int>(key,value));// 插入新键值
_map.insert(pair<int,Iter>(key, _list.begin()));
}
private:
unsigned cnt;
unordered_map<int, Iter> _map; // (键, key_value 在list中的地址)
list<pair<int,int>> _list;// (按照LRU排列的key_value, 表头存放最新访问、插入、修改的键值)
};
146. LRU Cache
最新推荐文章于 2022-03-12 16:44:00 发布