题意理解
设计一个最近最少使用的LRU缓冲机制的类
问题分析
使用STL
unordered_map,list。
list用于缓冲区;map用于查询元素位置。
其他
链接
class LRUCache {
private:
unordered_map<int, list<pair<int, int>>::iterator> myDict;
list<pair<int,int>> myList;
int cap = 0;
public:
LRUCache(int capacity) {
cap = capacity;
}
int get(int key) {
auto dict_it = myDict.find (key);
//cout << "--1--" << endl;
if (dict_it == myDict.end()) { //没找到
//cout << -1 << endl;
return -1;
}
//cout << "--2--" << endl;
auto list_it = dict_it -> second;
//cout << "--22--" << endl;
int val = list_it -> second;
//cout << "--3--" << endl;
myList.erase(list_it);
//cout << "--4--" << endl;
myList.push_front(pair<int, int>(key, val));
myDict[key] = myList.begin();
return val;
}
void put(int key, int value) {
auto dict_it = myDict.find (key);
if (dict_it != myDict.end()) { //找到了
auto list_it = dict_it -> second;
int val = list_it -> second;
myList.erase(list_it);
myList.push_front(pair<int, int>(key, value));
myDict[key] = myList.begin();
}
else {
if (myList.size() >= cap) {
auto end_it = myList.begin();
advance(end_it, (int)myList.size() -1);
myDict.erase(end_it -> first);
myList.erase(end_it);
}
myList.push_front(pair<int,int>(key,value));
myDict[key] = myList.begin();
}
/*
cout << "list" << endl;
for (auto p : myList) {
cout << p . first << '\t' << p . second << endl;
}
cout << endl;
cout << "dict" <<endl;
for (auto p : myDict) {
cout << p . first << "\t";
}
cout << endl;
*/
}
};