栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

利用数组实现lru

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

利用数组实现lru

LRU主要包含两个函数,第一个插入一个页面,第二个获得一个页面

主要思路如下,当插入页面的时候,所有的页面向后移动一个单位(若果多出来一个元素舍弃掉),然后把这个页面放到数组首元素
当获得一个页面的时候,就便利数组,找到这个页面然后放到最前面

代码如下:

//页面
struct page
{
	int id;
	//...其他信息
	page(int _id) : id(_id) {}
};

//LRU类
class Array_LRUCache {
private:
	 vector ap;
	int length;
	int _capacity;

private:
	void copy(int dst,int src,int len) //目标地址,原地址,复制的长度
	{
		//原地址小于目标地址的时候从后往前复制
		//原地址大于目标地址的时候从前往后复制
		if (src <= dst)
		{
			int i = src + len - 1;
			int j = dst + len - 1;
			while (i >= src)
			{
				ap[j] = ap[i];
				i--;
				j--;
			}
		}
		else
		{
			int i = src;
			int j = dst;
			while (iid == id)
			{
				page* p = ap[i];
				copy(1, 0, i);
				ap[0] = p;
				return p;
			}
		}
		return nullptr;
	}

	void print()
	{
		for (int i=0;iid << " ";
		}
		cout << endl;
	}
};

//测试一下:
int main()
{	
	Array_LRUCache lru(3);
	lru.put(new page(1));
	lru.print();
	lru.put(new page(2));
	lru.print();
	lru.put(new page(3));
	lru.print();
	lru.put(new page(4));
	lru.print();
	lru.get(2);
	lru.print();
	lru.get(2);
	lru.print();
	lru.get(4);
	lru.print();
	lru.get(5);
	lru.print();
}

打印结果如下:

其中有copy函数,为什么会有从前往后复制和从后往前复制之分,主要参考c语言里面的memmov() 函数
memmov和momcpy的区别

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/316902.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号