LRU算法 c++手写 map

来源:互联网 发布:97网络含义是什么 编辑:程序博客网 时间:2024/06/05 16:37
#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;}

原创粉丝点击