LRU算法的实现2【数据结构】

理论上不能算是最好的算法,但是这个方法也可以。

#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();
    }//清空
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值