力扣146题
利用list和map去解决问题,list<pair<int,int>>::iterator记录下标的位置
class LRUCache {
list<pair<int, int>>l;
unordered_map<int,list<pair<int,int>>::iterator>m;
int cap = 0;
public:
LRUCache(int capacity) {
this->cap = capacity;
}
int get(int key) {
auto it = m.find(key);
if ( it== m.end())return -1;
int value=it->second->second;
l.erase(m[key]);
l.emplace_front(make_pair(key,value));
m[key]=l.begin();
return value;
}
void change_value(int key, int value) {//把任意位置的值转到前头来
l.erase(m[key]);
l.emplace_front(make_pair(key, value));
m[key]=l.begin();
}
void put(int key, int value) {
if (l.size() >= this->cap) {//要删除了
if (m.find(key) == m.end()) {//就是需要删掉最后一个
int num = l.back().first;
m.erase(num);
l.pop_back();
l.emplace_front(make_pair(key,value));
m[key] = l.begin();
}
else {//不需要删除,只需要把那个值提高链表的前头。
change_value(key, value);
}
}
else {
if (m.find(key) == m.end()) {//在map没找到,直接这样就行。
l.emplace_front(key, value);
m[key] = l.begin();
}
else {//插入相同的关键字了,提一个位置
change_value(key, value);
}
}
}
};