您的位置:首页 > 其它

LRU Cache 最近最少使用缓存的设计

2014-01-19 19:50 344 查看
class LRUCache{

public:

LRUCache(int capacity) {

cap=capacity;

head=new ListNode(0,0);

tail=new ListNode(0,0);

head->left=NULL;

head->right=tail;

tail->right=NULL;

tail->left=head;

}

int get(int key) {

int value;

Data::iterator iter=datas.find(key);

if(iter!=datas.end())

{

value=iter->second->value;

if(datas.size()==1)

{

return value;

}

else

{

DeleteNode(iter->second);

InsertNode(iter->second);

return value;

}

}

else

{

return -1;

}

}

void set(int key, int value) {

Data::iterator iter=datas.find(key);

if(iter!=datas.end())

{

iter->second->value=value;

DeleteNode(iter->second);

InsertNode(iter->second);

return;

}

if(datas.size()<cap)

{

ListNode *newnode=new ListNode(key,value);

InsertNode(newnode);

datas[key]=newnode;

}

else

{

ListNode *node=head->right;

DeleteNode(node);

InsertNode(node);

datas.erase(node->key);

datas[key]=node;

node->key=key;

node->value=value;

}

}

~LRUCache()

{

ListNode *next;

while(head)

{

next=head->right;

delete head;

head=next;

}

}

private:

struct ListNode

{

int key;

int value;

ListNode *left;

ListNode *right;

ListNode(int k,int v):key(k),value(v),left(NULL),right(NULL){}

};

typedef map<int,ListNode*> Data;

Data datas;

ListNode *head,*tail;

int cap;

void DeleteNode(ListNode *node)

{

node->left->right=node->right;

node->right->left=node->left;

}

void InsertNode(ListNode *node)

{

ListNode *last=tail->left;

last->right=node;

node->left=last;

node->right=tail;

tail->left=node;

}

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: