题目: 146. LRU 缓存
代码:
class LRUCache {
std::list<std::pair<int, int>> lst;
std::unordered_map<int, list<std::pair<int, int>>::iterator> bkt;
const int capacity_;
public:
LRUCache(int capacity) :capacity_(capacity) {
}
int get(int key) {
auto iter = bkt.find(key);
if (iter == bkt.end()) return -1;
lst.splice(lst.begin(), lst, iter->second);
return iter->second->second;
}
void put(int key, int value) {
auto iter = bkt.find(key);
// 修改已在缓存中的元素
if (iter != bkt.end()) {
iter->second->second = value;
lst.splice(lst.begin(), lst, iter->second);
return;
}
// 淘汰最近最久未用元素
if (lst.size() == capacity_) {
auto exp = lst.back().first;
bkt.erase(exp);
lst.pop_back();
}
// 缓存新元素
std::pair<int, int> val = { key, value };
lst.push_front(val);
bkt[key] = lst.begin();
}
};