理論上不能算是最好的算法,但是這個方法也可以。
#include <bits/stdc++.h>
using namespace std;
template <typename K,typename V>
class LRU{
private:
unordered_map<K,pair<V,int> > keyTable;
map<int,K> timeTable;
int nowTime=0;
public:
void insert(const K &key,const V &value){
if(keyTable.count(key)!=0){
int beforeTime = keyTable[key].second;
timeTable.erase(beforeTime);
}
keyTable[key] = make_pair(value,nowTime);
timeTable[nowTime]= key;
nowTime++;
} //插入k,value的鍵值對(如果容器中已經有key爲k的值,那麼用新的替換它)
V get(const K &key){
return keyTable[key].first;
} //返回key對應的value值
bool contains(const K &key){
if(keyTable.count(key)!=0)
{
return true;
}
return false;
} //返回是否存在key
void vis(const K &key){
if(!contains(key)) return;
int beforeTime = keyTable[key].second;
timeTable.erase(beforeTime);
keyTable[key].second = nowTime;
timeTable[nowTime] = key;
nowTime++;
}//設置key爲最近訪問
bool emtpy(){
if(keyTable.size()!=0) return false;
return true;
}
unsigned long long size(){
return keyTable.size();
}//返回元素個數
void pop(){
if(emtpy())return;
K key = timeTable.begin()->second;
// cout<<key<<endl;
remove(key);
} //彈出最久沒訪問過的數據
void remove(const K &key){
if(!contains(key))return;
int beforeTime = keyTable[key].second;
timeTable.erase(beforeTime);
keyTable.erase(key);
} //刪除指定key數據
void clear(){
keyTable.clear();
timeTable.clear();
}//清空
};