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();
    }//清空
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章