class Solution {
private:
int capacity;
// 双向链表存储键值对,保持访问顺序,O(1) 时间插入删除
// int key, int value
list<pair<int, int>> items;
// 哈希表 O(1) 时间快速访问
// int key, iterator value
unordered_map<int, list<pair<int, int>>::iterator> cache;
public:
Solution(int capacity) : capacity(capacity) {
// write code here
}
int get(int key) {
// write code here
auto it = cache.find(key);
if (it == cache.end()) {
return -1; // 缓存里没找到
}
// 移动到链表头部
items.splice(items.begin(), items, it->second);
return it->second->second;
}
void set(int key, int value){
// write code here
auto it = cache.find(key);
if (it != cache.end()) {
// 更新值且移动到链表头部
it->second->second = value;
items.splice(items.begin(), items, it->second);
return;
}
if (items.size() == capacity) {
// 达到容量上限了
auto last = items.back();
cache.erase(last.first);
items.pop_back();
}
// 在链表头部插入新元素,并在哈希表中存储对应迭代器
items.emplace_front(key, value);
cache[key] = items.begin();
}
};
/**
* Your Solution object will be instantiated and called as such:
* Solution* solution = new Solution(capacity);
* int output = solution->get(key);
* solution->set(key,value);
*/