LRU是Least Recently Used的缩写,即最近最少使用(最近一段时间最少使用),是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。
最近不是空间的概念,是时间概念,即最近一段时间。
1、最开始时,内存空间是空的,因此依次进入A、B、C是没有问题的
2、当加入D时,就出现了问题,内存空间不够了,因此根据LRU算法,内存空间中A待的时间最为久远,选择A,将其淘汰
3、当再次引用B时,内存空间中的B又处于活跃状态,而C则变成了内存空间中,近段时间最久未使用的
4、当再次向内存空间加入E时,这时内存空间又不足了,选择在内存空间中待的最久的C将其淘汰出内存,这时的内存空间存放的对象就是E->B->D
算法实现:
LRUCache通过一个list列表和一个map表实现读写功能,list表存放key,map表存放key、value、list表对应的位置信息,list表负责构造最近最少使用列表,新增加或新使用的元素放在列表最后,map表负责快速查找。
/**
* Least-recently-used cache class.
* K = key type, T = value type
*
* usage:
* LRUCache<K,T> cache;
* cache.put( key, value );
* LRUCache.Record rec = cache.get( key );
* if ( rec.valid() )
* const T& value = rec.value();
*/
template<typename K, typename T, typename COMPARE=std::less<K> >
class LRUCache
{
public:
struct Record {
Record() : _valid(false) { }
Record(const T& value) : _value(value), _valid(true) { }
bool valid() const { return _valid; }
const T& value() const { return _value; }
private:
bool _v