1.简介
LRU(Least Resently Used,最近最久未使用)算法是一种缓存淘汰策略
2.头文件
A》基础常用头文件(我们写的demo基本用到的头文件大概都在这,线程相关的就不放了)
#include<iostream>
#include<deque>
#include<map>
#include<list>
#include<vector>
#include<unordered_map>
#include<vector>
#include<string>
#include<string.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<memory>
#include<algorithm>
using namespace std;
B》本次需要定义的结构体和类
一个Node结构体
一个NodeList:最终访问的数据类型
m_list:最终访问的数据变量
m_iCapacity:m_list的最大容量
m_mapLRU:作为查询用,其中k-v的k值和m_list中的k值一致,k-v的v值使用的是NodeList的向量
注:get函数最好不要用int型返回,到时候结果正确错误都不知道
#include"../base.h"
struct Node
{
int key;
int value;
Node(int k,int v):key(k),value(v){}
};
typedef list<Node> NodeList;
class cLRU
{
public:
cLRU(int maxSize):m_iCapacity(maxSize){}
~cLRU(){}
void set(int k,int v);
bool get(int &iGetV, int k);
void print();
public:
int m_iCapacity;
NodeList m_list;
unordered_map<int, NodeList::iterator> m_mapLRU;
};
C》实现
set函数:分两大部分
1.通过m_mapLRU通过查询k值是否存在,不存在时
超过最大容量则需要对m_mapLRU以m_list的尾部k值为依据擦除
然后头插法插入m_list,顺便更新m_mapLRU数据
2.通过m_mapLRU通过查询k值是否存在,存在时
更新m_mapLRU数据以及m_list头部置换
get函数:更新m_mapLRU数据以及m_list头部置换
#include"LRU.h"
void cLRU::set(int k, int v)
{
if (m_mapLRU.find(k) == m_mapLRU.end())
{
if (m_list.size() == m_iCapacity)
{
m_mapLRU.erase(m_list.back().key);
m_list.pop_back();
}
m_list.push_front(Node(k,v));
m_mapLRU[k] = m_list.begin();
}
else
{
m_mapLRU[k]->value = v;
m_list.splice(m_list.begin(), m_list, m_mapLRU[k]);
m_mapLRU[k] = m_list.begin();
}
return;
}
bool cLRU::get(int &iGetV, int k)
{
if (m_mapLRU.find(k) == m_mapLRU.end())
{
return false;
}
m_list.splice(m_list.begin(), m_list, m_mapLRU[k]);
m_mapLRU[k] = m_list.begin();
return true;
}
void cLRU::print()
{
NodeList::iterator it = m_list.begin();
for(; it != m_list.end(); it++)
{
cout<<"key:"<<it->key<<" value:"<<it->value<<endl;
}
return;
}
D》应用
这里其实bFlag需要判断的,我们懒就省略了
int main()
{
cLRU tmp(3);
tmp.set(1, 100);
tmp.set(2, 200);
tmp.set(3, 300);
tmp.print();
cout<<"---------------"<<endl;
tmp.set(4, 400);
tmp.print();
cout<<"---------------"<<endl;
int iGetV = 0;
bool bFlag = tmp.get(iGetV, 2);
tmp.print();
return 0;
}
~
E》运行结果
key:3 value:300
key:2 value:200
key:1 value:100
---------------
key:4 value:400
key:3 value:300
key:2 value:200
---------------
key:2 value:200
key:4 value:400
key:3 value:300