C++实现LRU算法

该文章介绍了一个LRUCache(最近最少使用)缓存的实现,使用了双链表维护缓存项的顺序,并结合哈希映射快速查找。当缓存满时,最近最少使用的项将被移除。主要方法包括get()用于获取值,set()用于设置键值对,remove()用于从链表中删除节点,setHead()用于将节点设置为链表头部,表示最近使用。
摘要由CSDN通过智能技术生成
struct CacheNode {
	int key;      
	int value;    
	CacheNode *pre, *next;
	CacheNode(int k, int v) : key(k), value(v), pre(NULL), next(NULL) {}
};

class LRUCache
{
public:
	int size;
	CacheNode *head,*tail;
	map<int, CacheNode* >mp;
public:
	LRUCache(int capacity){
		size = capacity;
		head = nullptr;
		tail = nullptr;
	}
	int get(int key){
		if (mp.find(key) != mp.end()){
			CacheNode *tmp = mp[key];
			remove(tmp);
			setHead(tmp);
			return tmp->value;
		}
		else{
			return -1;
		}
	}
	void set(int key, int value){
		if (mp.find(key) != mp.end()){
			CacheNode *tmp = mp[key];
			remove(tmp);
			setHead(tmp);
			tmp->value = value;
		}
		else{
			CacheNode *tmp = new CacheNode(key, value);
			if (mp.size() >= size){
				remove(tail);
				mp.erase(mp.find(tail->key));
			}
			setHead(tmp);
			mp[key] = tmp;//注意插入数据到map里
		}
	}
	void remove(CacheNode *node){
		if (node->pre == nullptr){//删的是头结点
			head = node->next;//令当前头结点指向下一个节点
		}
		else{
			node->pre->next = node->next;
		}
		if (node->next == nullptr){//删的是尾结点
			tail = node->pre;//令当前尾结点指向上一个节点
		}
		else{
			node->next->pre = node->pre;
		}
	}
	void setHead(CacheNode *node){
		node->pre = nullptr;//设置节点为头节点的话,没有前驱节点
		node->next = head;//当前节点设置为头节点后,其下一个节点应该是原来的头节点
		if (head)
			head->pre = node;//如果头节点不为空,则头结点的前驱节点为传进来的结点
		head = node;//头节点位置换为传进来的节点
		if (!tail)
			tail = head;//看尾节点是否为空,为空的话就设置成头结点一样,即只有一个节点的情况下
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值