C++编程学习之LeetCode OJ

本文详细介绍了LRU缓存的数据结构设计和操作实现,包括get和set方法的使用,以及缓存达到容量后的元素替换策略。
LRU Cache :
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.

get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
set(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.
参考:

http://www.cnblogs.com/x1957/p/3485053.html

#include<iostream>
#include<list>
#include<unordered_map>
#define CAPACITY 2
using namespace std;
struct Node
{
	int key;
	int value;
};
class LRUCache
{
public:
	LRUCache(int capacity)//constructor of LRUCache
	{
		size=capacity;
	}
	int get(int key){
		if(Cachemap.find(key)!=Cachemap.end())//the element wanted exsits
		{
			//transform the element that key refer to to the first place of Cachelist
			Cachelist.splice(Cachelist.begin(),Cachelist, Cachemap[key]);
			//update the iterator
			Cachemap[key]=Cachelist.begin();
			return(Cachelist.begin()->value);		
		}
		else
			return(-1);		
	} 
	void set(int key, int value)
	{
		if(Cachemap.find(key)==Cachemap.end())//the key does not exist in the Cachamap
		{
			if(Cachelist.size()==size)//Cachelist reach its capacity
			{
				Cachemap.erase(Cachelist.back().key);//erase the key at the bottom of Cachemap
				Cachelist.pop_back();//erase the last element of Cachelist
			}
			//insert a new value at the begining of the Cachelist 
			Node newnode;
			newnode.key=key;
			newnode.value=value;
			Cachelist.push_front(newnode);
			Cachemap[key]=Cachelist.begin();//update the iterator
		}
		else	//the key does exist in the Cachemap
		{
			Cachemap[key]->value=value;//input the value 
			Cachelist.splice(Cachelist.begin(),Cachelist,Cachemap[key]);//inset the new element at the begining of Cachelist
			Cachemap[key]=Cachelist.begin();
		}
	}

private:
	int size;
	list<Node> Cachelist;
	unordered_map<int,list<Node>::iterator> Cachemap; //define the second element of Cachemap is a iterator

};
int main()
{
	LRUCache lru(CAPACITY);//set the size of empty LRUCache lru;
	lru.set(1,1);
	cout<<lru.get(1)<<"\n";
	cout<<lru.get(2)<<"\n";
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值