#include<iostream>
using namespace std;
#include<queue>
#include<map>
#include<string.h>
struct cachenode
{
int key;
int value;
cachenode *pre;
cachenode *next;
cachenode(int key_t,int value_t)
{
key=key_t;
value=value_t;
pre=NULL;
next=NULL;
}
};
class lrucache
{
private:
int lrucache_size;
cachenode *head;
cachenode *tail;
map<int,cachenode*>mp;
public:
lrucache(int size_tt)
{
lrucache_size=size_tt;
head=NULL;
tail=NULL;
}
void set_data(int key,int value)
{
map<int,cachenode*>::iterator it=mp.find(key);
if(it!=mp.end())
{
cachenode *temp=it->second;
temp->value=value;
remove_data(temp);
set_head(temp);
}
else
{
cachenode *new_node=new cachenode(key,value);
if(mp.size()>=lrucache_size)
{
map<int,cachenode*>::iterator it=mp.find(tail->key);
remove_data(tail);
mp.erase(it);
}
set_head(new_node);
mp[key]=new_node;
}
}
int get_data(int key)
{
map<int,cachenode*>::iterator it=mp.find(key);
if(it!=mp.end())
{
cachenode *temp=it->second;
remove_data(temp);
set_head(temp);
return temp->value;
}
else
return -1;
}
void remove_data(cachenode *node)
{
if(node->pre!=NULL)
node->pre->next=node->next;
else
head=node->next;
if(node->next!=NULL)
{
node->next->pre=node->pre;
}
else
{
tail=node->pre;
}
}
void set_head(cachenode *node)
{
node->next=head;
node->pre=NULL;
if(head!=NULL)
{
head->pre=node;
}
head=node;
if(tail==NULL)
tail=head;
//head=node;
}
};
int main()
{
lrucache *t_lrucache;
t_lrucache=new lrucache(2);
t_lrucache->set_data(2,1);
t_lrucache->set_data(3,4);
cout<<t_lrucache->get_data(3)<<endl;
//cout<<"first"<<endl;
t_lrucache->set_data(5,7);
//cout<<"end"<<endl;
cout<<t_lrucache->get_data(2)<<endl;
cout<<t_lrucache->get_data(5)<<endl;
}
LRU算法 c++手写 map
最新推荐文章于 2024-07-18 14:40:29 发布