理论上不能算是最好的算法,但是这个方法也可以。
#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();
}//清空
};